这是用单片机控制的1602液晶显示 程序,我检查不出错误来,可就是实现不了功能啊。。向大家求助!!先多谢

2024-11-20 10:36:10
推荐回答(2个)
回答1:

把延时啦长点就好了,这个问题经常遇见,把每次写命令和写数据的时间延时长一点就OK了!

回答2:

// 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);
}
}