把延时啦长点就好了,这个问题经常遇见,把每次写命令和写数据的时间延时长一点就OK了!
// LCD函数部分
void LcdDelay()
{
int i;
for(i = 0; i < 40; i++);
}
void LcdBusy() // LCD忙检测函数
{
LCD_RS = 0; // 读状态寄存器或写命令寄存器
LCD_RW = 1; // 读标志
LcdComdPort = 0xff; // 读数前先对端口置1
LCD_E = 1;
LcdDelay();
while ((LcdComdPort&0x80) != 0) // 1000 0000
{
LCD_E = 0;
LcdDelay();
LCD_E = 1;
LcdDelay();
}
LCD_E = 0; // 原为LCD_E=1
}
void LcdCmd(uchar c) // LCD控制命令函数
{
LcdBusy(); // 忙检测
LcdComdPort = c; // 置命令线
LCD_RS = 0; // 选命令寄存器
LCD_RW = 0; // 写标志
LCD_E = 1;
LcdDelay();
LCD_E = 0;
}
void LcdData(uchar c) // LCD数据输入函数
{
LcdBusy(); // 忙检测
LcdDataPort = c; // 置数据线
LCD_RS = 1; // 选数据寄存器
LCD_RW = 0; // 写标志
LCD_E = 1;
LcdDelay();
LCD_E = 0;
}
void LcdInit() // LCD初始化函数
{
LcdCmd(0x01); // 清屏.AC=0
LcdCmd(0x38); // 显示移位;右移
LcdCmd(0x06); // CGRAM=1
LcdCmd(0x0c); // 数据位数:8位;行数:1行;字体:0
LcdCmd(0x01); // DDRAM=0
}
void LcdClr() // LCD清屏函数
{
LcdCmd(0x01); // DDRAM=0
}
void LcdXY(uchar x, uchar y) // LCD显示定位函数、置DDRAM地址
{
if((x&0x01) != 0) // x:行、y:列
LcdCmd(0x80|(y - 1)); // 固定:1000 0000
else
LcdCmd(0xC0|(y - 1)); // 固定:1000 0000+0100 0000
}
void LcdStr(uchar *c) // 显示字符串函数
{
data int d = 0;
while (c[d] != 0)
{
LcdData(c[d++]);
LcdDelay();
}
}
void LcdChar(uchar c) // 显示数字函数
{
LcdData(c);
LcdDelay();
}
void LcdClear(uchar col) // 在液晶第col行clear
{
char i;
for(i = 0; i < 8; i++)
{
LcdXY(col, i + 1);
LcdStr(kong);
}
}