在LCD1602 加入 读忙子函数 的目的和作用是什么?
//读忙子函数
bit LCD_bz(void)
{
bit bz;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
delay1ms(10);
P0=0xff; //C51单片机读引脚要先置高电平,原因不赘述,很多资料没有这一步骤,大家格外注意下
bz=(bit)(LCD_GPIO&0x80);
LCD_E=0;
return bz;
}
主程序:
//我们要把第一行做成一个16字符固定显示,第二行做成滚动显示25字符
//这里采用的是1602指针右移的基础命令而不是整屏右移命令
#include
#define LCD_GPIO P0
void LcdWriteCom(unsigned char); //写入命令子函数声明
void LcdWriteData(unsigned char);//写入数据子函数声明
void LcdInit();//显示屏初始化子函数声明
void delay1ms(unsigned int);//延时函数声明
bit LCD_bz(void);//读忙函数声明
sbit LCD_RW=P2^5;
sbit LCD_RS=P2^6;
sbit LCD_E=P2^7;
unsigned char displayDate1[]=" I'm Cesar ";//一共16个字符(包括空格在内)
unsigned char displayDate2[]=" Please add QQ775222573 ";//一共25个字符
void main(void)
{
unsigned char i=0,j=0,n=0;
LcdInit();
LcdWriteCom(0x80);//设置坐标为第一行第一个字符
for(i=;i<16;i++)
{
LcdWriteData(displayDate1[ i]);
}
while(1)
{
if(LCD_bz())
continue;//读忙,结束本次循环
LcdWriteCom(0x80+0x40);//设置第二行第一个字符起点
for(j=n;j<25+n;j++)//我们没有进行整屏右移,但是我们进行了数组右移O(∩_∩)O~
{
LcdWriteData(displayDate2[j]);
}
n++;//数组的显示起点右移,这样实现了滚动
if(n>=(25-15))//当显示移到最右边时,停顿片刻,返回起点再次循环
{
n=0;
delay1ms(2000);
}
delay1ms(600);
}
}
请教,
主程序中,加入这个if(LCD_bz())函数的作用是什么,不加会怎样呢?continue;跳转到哪里去了?
其实1602程序我看了好久也不懂这都是什么意思,这可能需要从显示器底层硬件慢慢研究
这几天也在学习Proteus仿真LCD1602,也有这个问题! 请教一下大家! 把这句去了,Proteus仿真LCD1602就有显示,这句加上去LCD1602仿真不显示!
读忙程序也可以不用
取决你用的单片机读写速度或者是否使用了延时函数代替。
可能是你的程序有问题,需要修改下,我之前也遇到过这个问题。
和常用的TFT驱动芯片不同,字符型液晶的驱动芯片(例如HD44780,KS0066)由于出现的年代久远,读写速度普遍不是很高,如果单片机对其的读写时序进行过快的话,很有可能恰好液晶驱动芯片正处于忙状态无法写入新的数据,因此需要通过进行检测其是否处于忙碌状态以等待在空闲阶段进行写操作。51单片机的读写速度较慢,有时可以不需要添加检测是否处于忙状态的函数直接进行写操作,但如果使用AVR/STM8甚至速度更高的STM32/LM3S这类速度相对较高的单片机就需要在写操作之前进行读忙操作。读忙操作可以用延时函数进行代替(因为本质上都是等待一段时间)
回答,详细,学习了,感谢。