古人来者_昌 发表于 3 天前

关于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);


}





古人来者_昌 发表于 3 天前

商家提供的资料

晓飛飛 发表于 3 天前

您说的“完全行不通”是屏幕不显示没反应的意思吗?
如果完全没反应,建议先调整对比度,保证单片机没跑程序不能初始化时显示小黑块,这样一旦初始化成功就能正常显示了。

古人来者_昌 发表于 前天 06:47

晓飛飛 发表于 2025-8-21 11:52
您说的“完全行不通”是屏幕不显示没反应的意思吗?
如果完全没反应,建议先调整对比度,保证单片机没跑程 ...

感谢建议,调整下对比度就能显示了。
为什么商家不是把对比度先调好发货的?
页: [1]
查看完整版本: 关于LCD1601A的求助