以前也用MCU写过lcd1602的时序,不过都没有深究,也就是照着1602的时序写下去,没有用到忙信号检测,也不知道怎么用, 但1602貌似也能正常工作o(∩_∩)o…哈哈(无语)……
最近温习了一下,居然让我看出点套路来了,呵呵 ……首先让我们看一下busy check的程序
void busy_check()//忙信号检测
{
lcdrs=0;
lcdrw=1;
lcden=1;
_nop_();
while(P0&0x80)//忙信号检测关键
{
lcden=0;
_nop_();
lcden=1;
_nop_();
}
现在让我们来分析一下这个忙信号的检测过程:
1、读状态 RS = L RW = H EN = H 然后就可以读它的状态了,我看到很多人写这个读状态的时候都是这样的:
void busy_check()//忙信号检测
{
lcdrs=0;
lcdrw=1;
lcden=1;
_nop_();
while(P0&0x80);
}
2、这样写其实是不对的,为什么呢,现在我们来看一下1602的时序:
从时序当中可以看出,如果1602为忙状态的话,那么DB7为1,当E也一直高电平的时候,DB0-DB7的数据就会维持不变,所以读到的DB7都是高电平(忙状态)。现在假设当DB7为H是,我们让E再来一个脉冲,这个时候DB0-DB7的数据就有机会发生改变,那么它才有可能发生变化,DB7才有可能变为0,这样检测才是正确的。