关于LCD1601A的求助
最近在做个项目,使用到LCD1601A显示单行16个字符;之前使用过LCD1602显示双行字符,部分代码挪到LCD601A完全行不通,有没哪位大佬搞过LCD1601A,看下是哪里的问题。附件是商家给的Demo和datasheet。
以下是我根据LCD1602修改成LCD1601A的初始化代码,显示“0~F”16个字符。
void InitLCD(void)
{
P0M1 = 0x00; P0M0 = 0x00; P0PU = 0xFF;
P4M1 = 0x00; P4M0 = 0x00; P4PU = 0xFF;
P5M1 = 0x00; P5M0 = 0x00; P5PU = 0xFF;
P7M1 = 0x00; P7M0 = 0x00; P7PU = 0xFF;
LCDDelay_ms(1);
LCDWriteCommand(0x30);
LCDWriteCommand(0x0C); // 显示开及光标设置
LCDWriteCommand(0x06); // 显示光标移动设置
LCDWriteCommand(0x01); // 显示清屏
LCDDelay_ms(100);
Show_string("0123456789ABCDEF");
}
// 忙检测函数(重要!)
BOOL LCD_CheckBusy(void)
{
BOOL busy;
LCD_DATA = 0xFF; // 准备读取
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
LCDDelay10us(2);
busy = (LCD_DATA & 0x80); // 读取忙标志
LCD_EN = 0;
return busy;
}
void LCD_WaitReady(void)
{
u8 timeout = LCD_ERROR_TIME_OUT;
while(LCD_CheckBusy() && timeout--)
{
LCDDelay10us(10);
}
}
void LCDWriteCommand(u8 newData) //BuysC为0时忽略忙检测,写指令
{
LCD_WaitReady();// 等待LCD空闲
LCD_DATA = 0xFF;
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = newData;
LCDDelay10us(3);
LCD_EN = 0;
LCD_RW = 1;
LCDDelay10us(3);
LCD_DATA = 0x00;
}
void LCDWriteData(u8 newData) //写数据
{
LCD_WaitReady(); // 等待LCD空闲
LCD_DATA = 0x00;
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = newData;
LCDDelay10us(35);
LCD_EN = 0;
LCD_RW = 1;
LCD_DATA = 0xFF;
LCDDelay10us(1);
}
void LCDDelay10us( u8 DelayXus ) //10us延时,经过实际测试
{
u16 i;
do
{
i = MAIN_Fosc / 1000000;
while(--i);
}while(--DelayXus);
}
void LCDDelay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 10000;
while(--i);
}while(--ms);
}
void Show_string(uchar a[])
{
uchar i;
LCDWriteCommand(0x80);
for(i=0;a!='\0';i++)
LCDWriteData(a);
}
商家提供的资料 您说的“完全行不通”是屏幕不显示没反应的意思吗?
如果完全没反应,建议先调整对比度,保证单片机没跑程序不能初始化时显示小黑块,这样一旦初始化成功就能正常显示了。 晓飛飛 发表于 2025-8-21 11:52
您说的“完全行不通”是屏幕不显示没反应的意思吗?
如果完全没反应,建议先调整对比度,保证单片机没跑程 ...
感谢建议,调整下对比度就能显示了。
为什么商家不是把对比度先调好发货的?
页:
[1]