第四篇 lcd1602
亚龙236实验台显示模块上的小长条液晶屏就是今天的主角:1602液晶。我们的任务是编程序驱动它来显示一些英文字母。1602这个名字来源于它可以每行显示16个字母,一共两行。
玩过乐高类的拼装玩具吗?厚厚的一叠说明书,按照说明一步一步拼。搞开发也一样,必须从第一个语句慢慢拼起来,这是急不得的事情。心平气和、头脑清醒是必须的。驱动1602也需要看看1602的说明书—亚龙资料里面有的,在datasheet文件夹里找RT1602.pdf。rt1602pdf文件—来自百度文库
最有用的是 第三页 引脚说明、第四页 读写时序、12页开始的指令解释。
pg3:
RS:寄存器选择输入端
RS=1:指向数据寄存器
RS=0:指向指令寄存器
RW:读写控制输入端
RW=0:写操作 RW=1:读操作
E:使能信号输入端
读操作时,高电平有效;
写操作时,下降沿有效;
pg4:
pdf自己看。关键点:
1、E信号频率:最小周期1000ns,意思就是每1us最多操作一次----lcd1602是个老牛车,反应慢的很,为了信号稳定,需要每次延时4us以上。
2、E信号脉宽:最小450ns。意思是 E信号的高电平最少保持0.4us,实际上可能需要1us或更长(数据线过长、没有屏蔽等都会影响传输)。
3、读忙不是必须,如果是竞赛等环境,可以用牺牲效率(延时到肯定不忙)的方法来避免读忙。这样可以少写几行程序。
编程过程:
1 、先定好硬件连接计划
#define lcd_data P0
sbit lcd_rs=P2^0;
sbit lcd_rw =P2^1;
sbit lcd_e =P2^2;
数据端口接P0,rs接P2.0,rw接P2.1,en接P2.2。
这几句可以看作是—硬件接口层。把硬件操作接口转换成四个符号,操作硬件就是读写这四个符号。
2、根据硬件手册写基本操作指令
比如:手册第12页第一个指令—清屏
按照手册,我们应该把rs置0,rw置0,DB置00000001(16进制0x01),然后要把DB上的数据写入到寄存器,写入的方法在第4页
时序图上明确了步骤:rs和rw置0,再把e置1,再送DB数据,再把e置0,在e下降沿这一瞬间锁存数据到寄存器。然后可以撤掉DB,撤掉rs、rw。
写成c语句:
lcd_rs= 0; //置0 rs
lcd_rw = 0; //置0 rw
lcd_e = 1; //置1 e
lcd_data = 0x01; //送清屏命令到端口
lcd_e= 0; //置0 e,产生e信号下降沿,写入指令到寄存器
看其它指令,大同小异,就是命令字节不一样,比如显示开关指令
只需要把0x01换成0x0c(00001000)就可以设置指令:开显示、关光标、关闪烁。
那就改一改,写成通用的写指令函数,如下:
void write_command(uchar com)
{
lcd_rs= 0;
lcd_rw = 0;
lcd_e=1;
lcd_data = com;
lcd_e= 0;
}
这样就可以直接传指令码写指令了。
使用方法如下:
write_command(0x01); //清屏指令
3、写要显示的数据
方法同写指令,只是rs不一样
void write_data(uchar dat)
{
lcd_rs = 1;
lcd_rw = 0;
lcd_e=1;
lcd_data = dat;
lcd_e= 0;
}
注意,这里面都没有加读忙程序,有时候会显示不完全,可以这样改一改:加延时
void write_data(uchar dat)
{
lcd_rs = 1;
lcd_rw = 0;
lcd_e=1;
lcd_data = dat;
lcd_e= 0;
delayms(1); //延时1ms,确保lcd不忙。