今天开始复习了液晶显示!我的天啊!感觉像是重新学一样,好多东西都忘了,看来以后还要练习的非常熟练才行,*一时的努力在短时间内学的东西是记不太久的!更不要说熟练应用了!
说说今天的总结!虽然开始有些吃力,但是也不至于想以前那样看着视频一步一步来!今天写液晶程序是找了两个例子,自己看着1602的PDF资料。开始时看了看程序然后自己看着时序图写,但是却怎么出不来结果,对比着例子一点点的尝试着修改,终于发现原来是一个小小的延时问题,也就是在往数据端口输进指令或数据后要有个小小的延时。但是看时序图上却是EN端电平已经降下去了,数据口还在赋值,而实际上却是赋值后差不多要个5毫秒的延时,具体原因不明白!
关于液晶字符定位的问题,我看的一个例程是用坐标定位的,我看着头晕,老是转不过来。其实在我看来1602液晶就能显示那几个字符而已,自己就算掰着手指查也不会出错吧!所以好不如直接控制来的爽快!特别注意的是,只要你让那个位置的字符显示,就一定要给你赋值,那怕是一个空格,那也算是一个字符,否则会出现乱码!
再说一下控制液晶的驱动程序(暂且称其为驱动程序吧,反正是控制液晶的)!其实控制这种小液晶很简单!给它的初始化函数(也就是告诉它:小弟,你要开始工作了),给它做做准备,具体函数按照配套PDF资料写就行!再有个就是发送指令的函数。首先给RS赋值,RS=0,当MPU进行写模块操作,指向指令寄存器,当MPU进行读模块操作,指向地址计数器。RS=1,无论MPU读操作还是写操作,均指向数据寄存器。再给RW赋值,赋值为1是写操作,为0是读操作。然后就是EN端了,其实因为数据是在EN下降沿才会把命令或数据读进,所以就先拉高它,然后往数据口送指令,现在是最关键的,你一定要让它稍微有个延时,例如5 毫秒!然后令EN=0!好了,这就完成了指令输入!至于数据输入函数,格式同指令输入函数一样,只是RS赋值不一样而已!至于什么指令控制什么功能,自己查查配套资料就行了!另外还有一个检查繁忙问题,只是.....暂时不会用,我把繁忙检查写进程序中,它竟然罢工!现在自己的水平就是写个小程序实现个小功能,检查繁忙暂时用不到,以后再说吧!
附一自己写的液晶驱动函数!其中dat为液晶数据进口!
void del(uint i)
{
char j;
for(;i>0;i--)
for(j=125;j>0;j--);
}
void writecom(uchar com)
{
rs=0;
rw=0;
en=1;
dat=com;
del(5);
en=0;
}
void writedat(uchar da)
{
rs=1;
rw=0;
en=1;
dat=da;
del(5);
en=0;
}
void init()
{
del(15);
writecom(0x38);
del(5);
writecom(0x38);
del(5);
writecom(0x38);
del(10);
writecom(0x08);
writecom(0x0e);
writecom(0x06);
writecom(0x0c);
writecom(0x80);
}