[其他]

HC32L136 demo板 之四、LCD

[复制链接]
5676|14
手机看帖
扫描二维码
随时随地手机跟帖
lisingch|  楼主 | 2019-8-7 21:00 | 显示全部楼层 |阅读模式
       很喜欢板子上的那个液晶显示屏,拿到手上就想先驱动起来。本次实验就是以HC32L136 demo板官方例程为基础对HC32L136K8TA的LCD模块进行学习,LCD上的数字从“0”开始加“1”到“9999”,然后再归“0”重复进行。
一、实验资源
1、HC32L136 demo板;
2、keil 5.28.0.0;
3、HC32L136 SDK支持包;
更多资讯请访问https://www.hdsc.com.cn/mcu.htm

二、相关资源简介
1、LCD模块
       HC32L136K8TA的LCD模块功能非常强大,主要特性如下:
  高度灵活的帧速率控制
  支持静态、1/2、1/3、1/4、1/6 和  1/8  占空比
  支持1/2、1/3 偏置
  多达16个寄存器的 LCD数据RAM
  可通过软件配置 LCD 的对比度
  3种驱动波形生成方式
–  内部电阻分压、外部电阻分压,外部电容分压方式   
–  可通过软件配置内部电阻分压方式的功耗,从而匹配 LCD 面板所需的电容电荷
  支持低功耗模式:LCD控制器可在Active、Sleep、DeepSleep 模式下进行显示
  可配置帧中断
  支持 LCD闪烁功能且可配置多种闪烁频率
  未使用的 LCD 区段和公共引脚可配置为数字或模拟功能。
Image 004.png

2、LCD模块寄存器。寄存器看上去不少,但都非常简单。
Image 005.png
其中的配置寄存器0(LCD_CR0)  应该是模块的核心寄存器,涉及的内容比较多,但使用也是非常简单。通过对该寄存的配置可对所驱动液晶显示屏的对比度调整、Bias电压来源选择及Bias配置、duty配置、电压泵时钟频率选择、LCD扫描频率选择及LCD使能失能等进行相应配置。其中的“Bias电压来源选择”提供三种选择,一、内部电阻分压;二、外部电阻分压;三、外部电容分压,这对于实际应用非常方便灵活。
Image 006.png
Image 007.png
Image 008.png
Image 009.png
Image 017.png
Image 018.png
Image 019.png
Image 020.png
其它的寄存器在手册中也同样有着非常详细的描述,这对于LCD模块的正确使用是非常有用的。配置寄存器1(LCD_CR1)中有个位比较重要,即“Mode”位,它与所使用的LCD显示器有关,支持两种显示模式:模式0与模式1。下面是1/4Duty下两种显示模式图例:
Image 016.png
Image 015.png
输出配置寄存器 0(LCD_POEN0)及输出配置寄存器 1(LCD_POEN1)对具备LCD功能的引脚进行配置,根据所使用LCD的不同可灵活地对"SEG"及“COM”进行配置,将用不的引脚配置为其它用途。
Image 010.png
Image 011.png
LCD_RAM0~7及LCD_RAM8~F两个寄存器也是非常容易理解,相让LCD的那一段点亮告诉它们就可以了;
Image 012.png
Image 013.png

三、本次实验
1、硬件连接
       HC32L136 demo板上所配置的LCD显示屏是一款3.3v工作电压,支持1/4 Duty、1/3 Bias驱动方式的小巧型段式液晶屏。对于Bias 产生电路在DEMO板提供了外部电容(C26~C28)分压模式,外部电阻分压模式的电阻(R20~R23)没有焊接。
Image 003.png
   Image 014.png
Image 021.png

2、程序实现。实验程序是在官方提供的例程基础上进行了更改,例程中Bias 产生电路选用了内部电阻分压模式,显示模式为“模式0”;
主要代码如下:
void LCD_Config(void)
{
        stc_lcd_config_t stcLcdCfg;
   
        DDL_ZERO_STRUCT(stcLcdCfg);
       
        Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);//系统时钟源使能,内部低速时钟
        Sysctrl_SetRCLTrim(SysctrlRclFreq32768);                //内部低速时钟频率TRIM值加载
       
        Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE);
        Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
       
        /*和LCD相关端口都要配置为模拟端口*/
        Gpio_SetAnalogMode(GpioPortA, GpioPin9);//COM0
        Gpio_SetAnalogMode(GpioPortA, GpioPin10);//COM1
        Gpio_SetAnalogMode(GpioPortA, GpioPin11);//COM2
        Gpio_SetAnalogMode(GpioPortA, GpioPin12);//COM3
        Gpio_SetAnalogMode(GpioPortA, GpioPin8);//SEG0
        Gpio_SetAnalogMode(GpioPortC, GpioPin9);//SEG1
        Gpio_SetAnalogMode(GpioPortC, GpioPin8);//SEG2
        Gpio_SetAnalogMode(GpioPortC, GpioPin7);//SEG3
        Gpio_SetAnalogMode(GpioPortC, GpioPin6);//SEG4
        Gpio_SetAnalogMode(GpioPortB, GpioPin15);//SEG5
        Gpio_SetAnalogMode(GpioPortB, GpioPin14);//SEG6
        Gpio_SetAnalogMode(GpioPortB, GpioPin13);//SEG7
//        Gpio_SetAnalogMode(GpioPortB, GpioPin3);//VLCDH
//        Gpio_SetAnalogMode(GpioPortB, GpioPin4);//VLCD3
//        Gpio_SetAnalogMode(GpioPortB, GpioPin5);//VLCD2
//        Gpio_SetAnalogMode(GpioPortB, GpioPin6);//VLCD1

        LCD_SetSegCom(0,0xffffff00);                                //设置seg0-7
        LCD_SetSegCom(1,0x10ff);                                                //设置com0-3
        stcLcdCfg.enDispMode = LcdMode0;                //显示模式为模式0
        stcLcdCfg.enBias = LcdBias3;                                //1/3 Bias
        stcLcdCfg.enBiasSrc = LcdInRes_High;//内部电阻分压,大功耗模式
        stcLcdCfg.enClk = LcdRCL;                                                //内部32k
        stcLcdCfg.enDuty = LcdDuty4;                                //1/4Duty
        stcLcdCfg.enCpClk = LcdClk2k;                                //电压泵时钟频率2k
        stcLcdCfg.enScanClk = LcdClk128hz;        //LCD扫描频率
        LCD_Init(&stcLcdCfg);
        LCD_EnFunc(LcdEn,TRUE);                                                        //模块使能或闪屏使能禁止
        LCD_ClearDisp();                                                                                //清屏
}
int32_t main(void)
{
        uint16_t cont;
       
        LCD_Config();
       
        //LCD_Display(3579);
        //LCD_FullDisp();                                                //全屏显示
        while(1)
        {
                for(cont=0; cont<10000; cont++)
                {
                        LCD_Display(cont);
                        delay1ms(300);
                }
        }
}

四、实验结果
微信图片_20190807202401.jpg

五、总结
       之前只用过HT1621B对段码液晶进行过驱动,第一次使用微控制器所带的LCD控制器模块成功驱动LCD显示屏还是比较兴奋的,不过这都是源于华大电子好的产品及丰富的参考例程。参照官方例程再结合配套的数据及用户手册上手还是挺快的。接下来的时间里还要尝试一下其它的操作。

附件:编译好的测试文件 main.rar (3.8 KB)

使用特权

评论回复
mtbf| | 2019-8-7 23:22 | 显示全部楼层
没有电荷泵,对比度会随着电池电压变化。

使用特权

评论回复
arima| | 2019-8-11 21:17 | 显示全部楼层
小伙不错。。。

使用特权

评论回复
aoyi| | 2019-9-9 14:14 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
drer| | 2019-9-9 14:28 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
kxsi| | 2019-9-9 15:12 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
nawu| | 2019-9-9 15:13 | 显示全部楼层
非常不错的资料

使用特权

评论回复
lisingch|  楼主 | 2019-9-9 16:43 | 显示全部楼层
arima 发表于 2019-8-11 21:17
小伙不错。。。

使用特权

评论回复
lisingch|  楼主 | 2019-9-9 16:44 | 显示全部楼层
aoyi 发表于 2019-9-9 14:14
非常感谢楼主分享

互相学习!

使用特权

评论回复
lisingch|  楼主 | 2019-9-9 16:44 | 显示全部楼层
drer 发表于 2019-9-9 14:28
非常感谢楼主分享

互相学习!

使用特权

评论回复
lisingch|  楼主 | 2019-9-9 16:44 | 显示全部楼层
kxsi 发表于 2019-9-9 15:12
非常感谢楼主分享

互相学习!

使用特权

评论回复
lisingch|  楼主 | 2019-9-9 16:44 | 显示全部楼层
nawu 发表于 2019-9-9 15:13
非常不错的资料

互相学习!

使用特权

评论回复
xj1223726587| | 2019-10-15 09:44 | 显示全部楼层
LCD_Display();里面写的什么啊

使用特权

评论回复
caizhiwei| | 2019-12-6 11:03 | 显示全部楼层
//LCD_Display(3579); 这个怎么不开源呀?遮遮掩掩的

使用特权

评论回复
yjdhqcc| | 2020-2-29 19:21 | 显示全部楼层
//LCD_Display(3579); 这个怎么不开源呀?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14978

帖子

17

粉丝