lichuanlong168 发表于 2025-3-25 16:09:31

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

我原来手持低功耗仪器,采用厂家提供得代码修改运行一切正常。下一个产品只用驱动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,一共20bit.
      COMLENM      = 0;                // COM时间长度设置 中字节COMLEN      LCD刷新率 = LCD时钟频率 / ((DBLEN+COMLEN+1) *2 * COM数)
      COMLENL      = 65;                // COM时间长度设置 低字节COMLEN      LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
      BLINKRATE = 60;                // 闪烁率配置寄存器, LCD闪烁率 = LCD刷新率 / BLINKRATE 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;
}
//////////////////////////////////////////////////////////////




国芯人工智能 发表于 2025-3-25 16:38:00

针对您提出的问题,STC8H4KTLCD在使用内部32K时钟驱动LCD时出现不显示的情况,以下是一些可能的原因及解决方案:

1. 内部32K时钟启动问题
您提到已经加入了内部32K时钟的启动代码:
c
PSW2 |= 0x80;
IRC32KCR = 0x80; //启动内部低速 IRC
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配置寄存器:
c
void LCDconfig(void)
{
    u8 i;

    PSW2 |= 0x80;// 允许访问特殊功能寄存器

    // 启动内部32K低速振荡器
    IRC32KCR = 0x80;// 启动内部低速 IRC
    while (!(IRC32KCR & 1));// 等待内部32K时钟稳定

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

    // 其他LCD初始化代码
    // ...
}

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

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 2025-3-25 17:01:20

注意LCD使用内部32K时钟仅B版支持
程序未发现问题



lichuanlong168 发表于 2025-3-25 19:56:56

怎么查看是否位B版本?

lichuanlong168 发表于 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)

这个回复不对吧!!!!!!

神农鼎 发表于 2025-3-25 21:56:51


lichuanlong168 发表于 2025-3-27 06:26:55

这个是A版本?怎样才能买到B版本?我刚从立创商城买的。
页: [1]
查看完整版本: 8H4K64TLCD用内部32K时钟驱动LCD修改不成功