补充一下。细看了你说的E引脚波形,哪些延时需要调整一下,比如下面两个延时里面,一个5uS,有人用到1uS,这个确实算高速脉冲,但这样做可靠性不高,建议给到10US左右,另外一个延时大约380uS,调整一下再试一试。
/*********************************************************************
*功 能:写入LCD初始化时的命令,不可以检测忙状态
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{
LCD_RS_0;
delay_nus(5);
LCD_RW_0;
delay_nus(5);
DATAOUTCLR;
DATAOUT |= cmd;
LCD_EN_0;
delay_nus(300);
LCD_EN_1;
delay_nus(300);
LCD_EN_0;
delay_nms(5);
}
/*********************************************************************
*名 称:LCD_Writecmd()
*功 能:写指令到LCD1602,指令数据占一个字节
*入口参数:cmd:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{
while(LCD_busy());
LCD_RS_0; //对同一个寄存器的两次写入,中间延时一会
delay_nus(5);
LCD_RW_0;
delay_nus(5);
LCD_EN_0;
delay_nus(300);//产生脉冲
DATAOUTCLR;
DATAOUT |= cmd;
LCD_EN_1;
delay_nus(300);//必要的延时
LCD_EN_0; //下降沿,LCD1602开始工作
delay_nus(5);
}
/*********************************************************************
*名 称:LCD_Writedata()
*功 能:写一字节数据到LCD1602
*入口参数:dat:无符号字节类型,0~255 包括各个ASCII码字符
*出口参数:无
*********************************************************************/
void LCD_Writedata(uchar dat)
{
while(LCD_busy());//等待LCD1602空闲
LCD_RS_1;
delay_nus(5);
LCD_RW_0;
delay_nus(5);
DATAOUTCLR;
DATAOUT |= dat;
LCD_EN_1; //先拉高
delay_nus(300); //很重要的延时,经调试,延时300us以上才可以
LCD_EN_0; //下降沿,开始写入有效数据
delay_nus(5);
}
|