找回密码
 立即注册
查看: 32|回复: 3

关于LCD1601A的求助

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-08-22 06:47:52

13

主题

57

回帖

678

积分

高级会员

积分
678
发表于 前天 07:36 | 显示全部楼层 |阅读模式
最近在做个项目,使用到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);


}





回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-08-22 06:47:52

13

主题

57

回帖

678

积分

高级会员

积分
678
发表于 前天 07:37 | 显示全部楼层
商家提供的资料

1601A C语言.C

4.91 KB, 下载次数: 3

1601A中文说明书.pdf

2.92 MB, 下载次数: 3

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-08-23 01:14:02
已绑定手机

40

主题

2409

回帖

3250

积分

荣誉版主

积分
3250
发表于 前天 11:52 | 显示全部楼层
您说的“完全行不通”是屏幕不显示没反应的意思吗?
如果完全没反应,建议先调整对比度,保证单片机没跑程序不能初始化时显示小黑块,这样一旦初始化成功就能正常显示了。
睁开眼睛做场梦~~~
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-08-22 06:47:52

13

主题

57

回帖

678

积分

高级会员

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

感谢建议,调整下对比度就能显示了。
为什么商家不是把对比度先调好发货的?
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-23 20:19 , Processed in 0.126353 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表