找回密码
 立即注册
查看: 169|回复: 6

8H4K64TLCD用内部32K时钟驱动LCD修改不成功

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-27 06:26:55

4

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-3-25 16:09:31 | 显示全部楼层 |阅读模式
我原来手持低功耗仪器,采用厂家提供得代码修改运行一切正常。下一个产品只用驱动LCD,不用RTC,采用内部32K时钟驱动LCD不成功。我加入内部32K启动时钟
“         P_SW2 |= 0x80;
         IRC32KCR = 0x80; //启动内部低速 IRC
         while (!(IRC32KCR & 1)); ”

把LCDCFG  = 0x80 + 3;修改为LCDCFG  = 0xC0 + 3;
注释掉原来RTC配置。液晶不显示。不注释RTC配置液晶能显示但是得保持外部低速晶振。
源程序如下:
////////////////////////////////////////////////////////////////////////////////////////////////////////////

/********************** LCD配置函数 *****************************/
void        LCD_config(void)
{
        u8        i;

        P_SW2 |= 0x80;                // SFR enable

        //LCDCFG  = 0x80 + 3;//LCDCFG  = 0x80 + 0;        // 0x00:选择CPU时钟为LCD时钟, 0x80: 选择外部32K晶振做时钟. VLCD电压选择0~7对应0.65+VLCD*0.05.
        LCDCFG  = 0xC0 + 3;//LCDCFG  = 0x80 + 0;        // 0x00:选择CPU时钟为LCD时钟, 0x80: 选择外部32K晶振做时钟. VLCD电压选择0~7对应0.65+VLCD*0.05.
        //选用内部低速晶振
        DBLEN   = 2;                // 设置LCD显示时的死区时间长度, 取值0~7.
        COMLENH        = 0;                // COM时间长度设置 高字节COMLEN[19:16],  一共20bit.
        COMLENM        = 0;                // COM时间长度设置 中字节COMLEN[15:8]        LCD刷新率 = LCD时钟频率 / ((DBLEN[2:0]+COMLEN[19:0]+1) *2 * COM数)
        COMLENL        = 65;                // COM时间长度设置 低字节COMLEN[7:0]        LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
        BLINKRATE = 60;                // 闪烁率配置寄存器, LCD闪烁率 = LCD刷新率 / BLINKRATE[7:0] Hz

        COMON  = 0x0f;                // COM使能寄存器
        SEGON1 = 0x00;                // SEG线使能寄存器1, SEG7~SEG0
        SEGON2 = 0xf8;                // SEG线使能寄存器2, SEG15~SEG8
        SEGON3 = 0xff;                // SEG线使能寄存器3, SEG23~SEG16
        SEGON4 = 0x00;                // SEG线使能寄存器4, SEG31~SEG24
        SEGON5 = 0x00;                // SEG线使能寄存器5, SEG39~SEG32
        
        P5n_pure_input(0x04);        //P5.0 P5.1 设置为高阻输入        COM0 COM1
        P0n_pure_input(0x1f);
        P4n_pure_input(0x60);        //P3.5 P3.6 设置为高阻输入        COM2 COM3
        P2n_pure_input(0xf8);        
        

        LCDCFG2 = 0x00;                        // SEG0~3切换到P7.7~7.4


        P5n_pure_input(0x03);        //P0.7~P0.5 设置为高阻输入        SEG7 SEG8 SEG9  (对应P0.7 P0.6 P0.5)
        P3n_pure_input(0x60);        


        for(i=0; i<8; i++)        
        LCD_buff = 0;        //清除显示内容
        
        LoadToLcd();        //将显示内容导入显存

        LCDCR = (0<<1) + 1;        // LCD控制寄存器, 0:普通模式, 1:长暗模式, 2:长亮模式, 3:闪烁模式.  +0:禁止LCD模块,  +1:允许LCD模块.
}


/********************** RTC配置函数 *****************************/
void        RTC_config(void)        //RTC初始化函数
{
        P_SW2  |= 0x80;                //SFR enable
        P1n_pure_input(0xc0);                //P1.6 P1.7设置为高阻输入
        P1IE = ~0xc0;                                //P1.6 P1.7关闭数字输入功能
        X32KCR = 0x80 + 0x40;                //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
}

void ini(void)
{
        
        
        
        P0M1 = 0;        P0M0 = 0;
        P1M1 = 0;        P1M0 = 0;
        P2M1 = 0;        P2M0 = 0;
        P3M1 = 0;        P3M0 = 0;
        P4M1 = 0;        P4M0 = 0;
        P5M1 = 0;        P5M0 = 0;
        P6M1 = 0;        P6M0 = 0;
        P7M1 = 0;        P7M0 = 0;

        
        
        //////////////////////////////////
        
P_SW2 |= 0x80;
ADCTIM = 0x3f; //
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //
ADC_CONTR = 0x80; //        
        
        
         P_SW2 |= 0x80;
         IRC32KCR = 0x80; //启动内部低速 IRC
         while (!(IRC32KCR & 1));
        
        Timer4Init();
        

        //RTC_config();//注释此函数液晶不能正常显示
        LCD_config();
        
        P4n_pure_input(0x02);        
        P3n_pure_input(0x80);        
        P4n_pure_input(0x01);        
        
        P0n_pure_input(0x60);        

        P1n_push_pull(0x01);
        P4n_push_pull(0x10);
        

        P2n_push_pull(0x01);
        P2n_push_pull(0x02);
        P2n_push_pull(0x04);
        
        EA = 1;
}
//////////////////////////////////////////////////////////////




回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-25 16:38:00 | 显示全部楼层
针对您提出的问题,STC8H4KTLCD在使用内部32K时钟驱动LCD时出现不显示的情况,以下是一些可能的原因及解决方案:

1. 内部32K时钟启动问题
您提到已经加入了内部32K时钟的启动代码:
  1. c
  2. PSW2 |= 0x80;
  3. IRC32KCR = 0x80; //启动内部低速 IRC
  4. while (!(IRC32KCR & 1));
复制代码
这段代码的作用是启动内部32K低速振荡器,并等待其稳定。请确保以下几点:
IRC32KCR寄存器的启动位确实被正确设置,并且稳定标志位(bit0)被正确置位。
PSW2寄存器的第7位(0x80)已经被置位,以允许访问特殊功能寄存器(SFR)。

2. LCD配置寄存器(LCDCFG)设置
您将LCDCFG从0x80 + 3修改为0xC0 + 3,其中0x80表示使用外部32K晶振,0xC0表示使用内部32K时钟。请确保以下几点:
LCDCFG的第7位(0x80)和第6位(0x40)被正确设置。0xC0表示同时启用了内部32K时钟和外部32K时钟,这可能会导致冲突。建议仅使用0x40来启用内部32K时钟。
VLCD电压的设置(低3位)是否符合LCD模块的要求。0x03表示VLCD电压为0.8V,请根据LCD模块的规格书确认是否合适。

3. RTC配置的注释
您提到注释掉RTC配置后液晶不显示,保留RTC配置且保持外部低速晶振时液晶显示正常。这表明RTC配置可能与LCD的时钟源有某种依赖关系。请检查以下几点:
如果RTC配置中涉及到了时钟源的设置,请确保在注释掉RTC配置后,LCD的时钟源仍然被正确设置。
如果RTC配置中涉及到了与LCD相关的寄存器,请确保这些寄存器在注释掉RTC配置后仍然被正确初始化。

4. 其他可能的原因
电源管理:确保在低功耗模式下,LCD模块和内部32K时钟的电源管理设置正确。
引脚配置:确保LCD模块的引脚配置(如数据线、控制线等)正确,并且没有被其他功能复用。
时钟分频:检查是否有其他时钟分频设置影响了LCD的时钟频率。

示例代码修改建议
以下是修改后的示例代码,重点在于正确设置内部32K时钟和LCD配置寄存器:
  1. c
  2. void LCDconfig(void)
  3. {
  4.     u8 i;
  5.     PSW2 |= 0x80;  // 允许访问特殊功能寄存器
  6.     // 启动内部32K低速振荡器
  7.     IRC32KCR = 0x80;  // 启动内部低速 IRC
  8.     while (!(IRC32KCR & 1));  // 等待内部32K时钟稳定
  9.     // 配置LCD时钟源为内部32K时钟,VLCD电压为0.8V
  10.     LCDCFG = 0x40 + 3;  // 0x40: 选择内部32K时钟, VLCD电压选择3(0.8V)
  11.     // 其他LCD初始化代码
  12.     // ...
  13. }
复制代码

总结
通过以上步骤,您应该能够解决STC8H4KTLCD在使用内部32K时钟驱动LCD时出现的问题。如果问题仍然存在,建议进一步检查硬件连接和LCD模块的规格书,确保所有设置符合要求。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-25 17:01:20 | 显示全部楼层
注意LCD使用内部32K时钟仅B版支持
程序未发现问题
截图202503251700261669.jpg
截图202503251700436477.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-27 06:26:55

4

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-3-25 19:56:56 | 显示全部楼层
怎么查看是否位B版本?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-27 06:26:55

4

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-3-25 20:14:00 | 显示全部楼层
国芯人*** 发表于 2025-3-25 16:38
针对您提出的问题,STC8H4KTLCD在使用内部32K时钟驱动LCD时出现不显示的情况,以下是一些可能的原因及解决 ...

// 配置LCD时钟源为内部32K时钟,VLCD电压为0.8V
    LCDCFG = 0x40 + 3;  // 0x40: 选择内部32K时钟, VLCD电压选择3(0.8V)

这个回复不对吧!!!!!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-3-25 21:56:51 | 显示全部楼层
截图202503252156475752.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-27 06:26:55

4

主题

8

回帖

63

积分

注册会员

积分
63
发表于 2025-3-27 06:26:55 | 显示全部楼层
这个是A版本?怎样才能买到B版本?我刚从立创商城买的。
截图202503270626068759.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:46 , Processed in 0.147534 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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