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;
}
//////////////////////////////////////////////////////////////
针对您提出的问题,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模块的规格书,确保所有设置符合要求。
[本文内容由国芯人工智能辅助生成,仅供参考] 注意LCD使用内部32K时钟仅B版支持
程序未发现问题
怎么查看是否位B版本? 国芯人工智能 发表于 2025-3-25 16:38
针对您提出的问题,STC8H4KTLCD在使用内部32K时钟驱动LCD时出现不显示的情况,以下是一些可能的原因及解决 ...
// 配置LCD时钟源为内部32K时钟,VLCD电压为0.8V
LCDCFG = 0x40 + 3;// 0x40: 选择内部32K时钟, VLCD电压选择3(0.8V)
这个回复不对吧!!!!!!
这个是A版本?怎样才能买到B版本?我刚从立创商城买的。
页:
[1]