LCD在处理内部指令的时候会置位忙信号(一般是高电平),这是LCD不接受外部指令。也就是说只有在LCD空闲的时候才可以向他发送指令,否则cpu发送的指令不会被执行,即 *** 作失败了。这就是判忙信号的意义。一般是采取查询的方式,看LCD是否空闲,如果忙则等待(延时)再次查询。
这条程序是在检测1602忙标志,
while(lcd_data&0x80);就是在检测,如果lcd_data=0x80,也就是说lcd_data的最高一位如果=1,说明1602还在处理数据,不要发新的数据,发了也不接受,造成数据丢失,如果lcd_data=0x80,说明1602已经空闲下来,可以传数据了
是不是理解错了,如果是返回忙,返回值是1,while(1)表示继续等待,直到返回0,跳出while执行函数。
这个函数的意思就是,如果1602一直忙的话,就一直等待,直到它不忙了就执行函数
_nop_()对应汇编中的NOP指令,只是延时的作用。
1602读取状态,最高位为1时表示1602处于忙碌状态,不能继续执行指令,只有为0时才能进一步 *** 作。这在1602的手册上有详细说明的,你没仔细看啊!
/
名称 : WriteCom()
功能 : 写命令函数
输入 : 无
输出 : 无
说明 : _nop_指令起延时作用,晶振为12MHz时候,延时时长的计算公式如下
T=1/(12M/12分频)
-/
void WriteCom(uchar Com)
{
uchar LCDtemp=0x00; /设置初值为0,全部为低,方便后面的判忙/
RW=1; /根据时序图拉低,选择写模式/
do
{
EN=1; /使能,使液晶输出信号,检查是否忙/
_nop_();_nop_();_nop_();_nop_();/延时4US/
LCDtemp=P1; /把P1口的状态值读回来给temp/
EN=0; /使能端跳变/;
}
while(LCDtemp&0x80); /结果的高位保留,如果高位DB7为一,则表示忙/
RS=0; /指令模式/
RW=0; /写模式/
EN=0; /使能/
_nop_();_nop_(); /延时2US/
P1=Com; /注意数据方向,写时IO口位置在前,读时IO口位置在后/
_nop_();_nop_();_nop_();_nop_();/延时4US/
EN=1; /使能拉高/
_nop_();_nop_();_nop_();_nop_();/延时4US/
EN=0; /使能拉低/
}
/
名称 : WriteData()
功能 : 写数据函数
输入 : 无
输出 : 无
/
void WriteData(uchar Data)
{
uchar LCDtemp=0x00; /设置初值为0,全部为低,方便后面的判忙/
RS=0; /根据时序图拉低,选择写指令/
RW=1; /根据时序图拉低,选择写模式/
do
{
EN=1; /使能拉高/
_nop_();_nop_();_nop_();_nop_();/延时4US/
LCDtemp=P1; /把P2口的状态值读回来给temp/
EN=0; /使能拉低/
}
while(LCDtemp&0x80); /结果的高位保留,如果高位DB7为一,则表示忙/
RS=1; /选择数据模式/
RW=0; /选择写模式/
EN=0; /使能拉低/
_nop_();_nop_(); /延时2US/
P1=Data; /注意数据方向,写时IO口位置在前,读时IO口位置在后/
_nop_();_nop_();_nop_();_nop_();/延时4US/
EN=1; /使能拉高/
_nop_();_nop_();_nop_();_nop_();/延时4US/
EN=0; /使能拉低/
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)