本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!
> 发布人:@日月同辉,与我共生_单片机-CSDN博客
> 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。
系列专栏: CSDN-单片机串口通信学习系列🎁
> 我的格言是:“尽最大努力,做最好的自己!💪
要转载,请提前告知!!!
版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。
目录
一、回顾上文
上文整理了LCD1602指令的宏定义,让我们一起回顾一下吧!
二、读时序
2.1时序图
读指令,主机(单片机)读取从机(LCD1602)的指令(如读忙指令等)。
如何读指令呢?要看懂时序图。
要知道读指令,RS=0,RW=1。由时序图可知,先将RS端口拉到低电平,RW端拉到高电平,接着使能端E拉到高电平并持续一段时间,在此期间主机(单片机)读取LCD1602指令后,使能端E拉到低电平。
一般情况下,读指令读的是忙指令,即LCD1602忙不忙,不忙可以让LCD1602工作(如写数据等),忙则无法让LCD1602不工作。
忙时,BF=1;不忙,BF=0。(BF是最高位DB7)。
2.2读忙检测
state&0x80,就是DB0-DB6清0,DB7(BF)保留state的最高位,用与判断数据忙不忙。
如果LCD1602要写指令/数据,要等LCD1602不忙,即检测到LCD1602不忙。
如果LCD1602忙,就要不断执行do-while循环语句,直至LCD1602不忙为止。
void LCDReadBF() //读忙检测(读命令)
{
unsigned char i;
unsigned char state;
LCD1602_DB=0XFF;
LCD1602_RS=0;
LCD1602_RW=1;
do
{
LCD1602_E=1;
state=LCD1602_DB;//将LCD1602
LCD1602_E=0;
i++;
if(i>200)
break;
}
while(state&0x80); //判断忙不忙,BF=1忙;BF=0不忙
}
三、写时序
3.1时序图
写指令,RS=0,RW=0。由时序图可知,将RS端拉成低电平,RW端拉成低电平,接着在LCD1602不忙的情况下,写命令(命令表可以看上一文章:),接着将使能端E拉成高电平一段时间后,再拉成低电平。
3.2写命令
要写命令,就要先检测LCD1602忙不忙。
void LCDWriteCmd(unsigned char cmd) //写命令
{
LCDReadBF();//先检测LCD1602忙不忙
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=cmd;//写命令给LCD1602
LCD1602_E=1;
LCD1602_E=0;
}
3.3写数据
要写数据,就要先检测LCD1602忙不忙。
void LCDWritedata(unsigned char dat) //写数据
{
LCDReadBF();//检测LCD1602忙不忙
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;//将数据dat发给LCD1602
LCD1602_E=1;
LCD1602_E=0;
}
四、LCD1602指令表
大家可以保留此文章,以便需要时找不到。
亲爱的读者敬请期待,下一文更精彩!!!
一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生