以下是液晶屏的工作原理及其编程
下面是一个简单的字符显示程序
//改程序将实现简单的静态数据
![]() //每次进行读写操作之前,必须进行读写检测 #include <reg52.h>
#include <intrins.h> //包含了空操作_nop_ #define uchar unsigned char #define Data P0 //管脚的声明
sbit RS = P2^1; sbit RW = P1^5; sbit E = P1^6; //用到的函数声明
void Delay(uchar); //延时函数 void Init(); //初始化函数 void Busy(); //忙时检测 void WriteCommand(uchar); //写指令 void WriteData(uchar); //写数据 void Display(uchar); //显示信息 void main() { Init(); Display(0x04); //将显示地址指定为第一行第五列 //显示Apple WriteData('A'); WriteData('p'); WriteData('p'); WriteData('l'); WriteData('e'); while(1); } void Delay(uchar i)
{ uchar j; for(; i > 0; i --) for(j = 155; j > 0; j --); //最少延时1ms } void Busy() { Data = 0xff; RS = 0; //根据规定:RS = 0, RW = 1可读取状态 RW = 1; E = 1; //允许读写 _nop_(); _nop_(); _nop_(); //空操作三个机器周期,给硬件反应时间 //进行忙时检测 while(Data & 0x80); //检测到忙时,继续检测【Data&0x80 = 1表示忙】 E = 0; } //写命令函数
void WriteCommand(uchar i) { Delay(5); //操作前进行短暂的延时 Busy(); //在闲时才能写指令 RS = 0; //根据规定,RS = 0; RW = 0;才能写入指令 RW = 0; E = 0; //写指令时,E应为高脉冲,就是让E从0到1发生整跳变,所以在这给E制0 _nop_(); _nop_(); //两个空操作给硬件一定的反映时间 Data = i; //写指令 _nop_(); _nop_(); _nop_(); E = 1; //E制高电平 _nop_(); _nop_(); _nop_(); E = 0; //当E从高电平变为低电平时,液晶模块开始执行指令 } //写数据函数
void WriteData(uchar j) { Delay(5); //操作前进行短暂的延时 Busy(); //闲时检测 RS = 1; //根据规定:RS = 1;RW = 0才能写入数据 RW = 0; E = 0; //在写指令/数据时,E应为高脉冲,也就是要让E从0到1发生跳变,所以在这里给E赋0 _nop_(); _nop_(); //两个空操作给硬件一定的反映时间 Data = j; //写指令 _nop_(); _nop_(); _nop_(); E = 1; //E制高电平 _nop_(); _nop_(); _nop_(); E = 0; //当E从高电平变为低电平时,液晶模块开始执行指令 } void Init() { Delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteCommand(0x01); //【清屏设置】 Delay(5); //延时5ms WriteCommand(0x06); //【输入方式设置】光标从左向右移动,内容不移动 Delay(5); //延时5ms WriteCommand(0x0f); //【显示开关设置】显示开,有光标,字符闪烁 Delay(5); //延时5ms WriteCommand(0x38); //【功能设置命令】8位数据,双行显示,选择5*7点阵 Delay(5); //延时5ms } void Display(uchar addr)
{ addr += 0x80; //第一行显示地址的确定方法 WriteCommand(addr); } |
|