当前位置: 代码迷 >> 单片机 >> 关于LCD1602驱动程序有关问题
  详细解决方案

关于LCD1602驱动程序有关问题

热度:128   发布时间:2016-04-28 15:02:22.0
关于LCD1602驱动程序问题
本帖最后由 yconnor 于 2014-03-19 23:14:17 编辑

BOOL LCD_Busy()
{  
  BOOL result,;
  P0=0XFF;
  RS=0;
  RW=1;
  LCDE=1;
  NOP;
  NOP;
  NOP;
  NOP;
  result=(BOOL)(P0&0X80);//这里是查看是否在繁忙状态。如果不忙STA7(接到P0^7)应该是0
  return result;
}
void LCD_WriteDat(BYTE Dat)
{
  while(LCD_Busy());
  
    RS=1;
RW=0;
LCDE=0;


LCDE=1;
P0=Dat;


LCDE=0;
NOP;
NOP;
  
}

写指令的函数就不说了。反正大同小异。
我只是不明白这里写指令,写数据的时候为什么while(LCD_Busy());为什么要在忙的时候停在这里不动,而不能在不忙的时候进行写数据/指令。

void LCD_WriteDat(BYTE Dat)
{
  while(LCD_Busy())//这个时候前面检测忙的时候忙返回0,不忙返回1;
  {
     RS=1;
RW=0;
LCDE=0;


LCDE=1;
P0=Dat;


LCDE=0;
NOP;
NOP;
 } 
}

前面有一个定义:

typedef unsigned char  BYTE
typedef unsigned bit BOOL

------解决方案--------------------
不明白为什么你不明白。LED忙得时候写不进去,所以要等到它闲才可以写啊。
------解决方案--------------------
有时候这个忙是等不到的。。。

用个长延时代替试试
------解决方案--------------------
1 注意是忙返回1,不忙返回0
  result=(BOOL)(P0&0X80);//这里是查看是否在繁忙状态。如果不忙STA7(接到P0^7)应该是0
  return result;
2 如果不想在忙时等,只能用if语句判断,忙则退出,并返回一个不成功标志。主程序可以在一定时间后或空闲时重试。
3 无论如何,不应该在while循环里面写数据,你不需要也不应该多次写同一数据的
  相关解决方案