LCD

本文详细介绍了LCD显示原理,包括液晶分子的物理结构和光学特性,以及如何通过电压控制液晶分子实现显示。接着,讨论了LCD的控制原理,重点阐述了偏压比和占空比的概念,并给出了1/4Duty 1/3Bias驱动波形示例。在LCD驱动部分,以华大HC32LFx3x-STK-V2.0开发板为例,讲解了LCD的管脚配置、参数设置、映射表创建和显示函数设计。最后,展示了实验结果及遇到的笔段亮暗不均问题,并探讨了解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、显示原理

LCD屏内部采用了一种液晶材料,液晶分子介于固态和液态之间。在自然状态下,液晶具有光学各向异性,但在电磁场作用下会呈现各向同性,LCD屏就是利用了液晶分子的这种物理结构和光学特性制造而成的。

屏的顶部和底部是一对互相垂直的偏振片,中间是液晶分子涂层。当液晶分子两端电压为0时,液晶分子呈现螺旋状态,自然光跟随液晶分子的旋光特性旋转进入到屏另一端的偏振片上,刚好旋转90°后可以穿过。此时,由于光线可以通过,所以人眼看上去屏是白色的。
在这里插入图片描述

图1 LCD显示原理

给屏的两端加上电压时,中间的液晶分子变成了同向排列的结构。此时,由于没有了旋转结构,进入到屏里面的光也就无法旋转90°通过另一端的偏振片。所以,人眼会看到屏幕是黑色的(也就是点亮LCD屏)。

二、控制原理

虽然给屏的两端加上一定电压就可以点亮LCD屏,但是,驱动LCD屏并不是只需要给一个固定电压就可以点亮,这是LCD屏本身的特性决定的。如果给LCD屏固定电压会使得LCD屏出现电泳效应,很快就坏掉,所以要以交流电压的方式驱动LCD。这里有两个参数:

  • 偏压比(Bias):

    驱动LCD屏COM/SEG口的电压并不是一个恒定的电压值,而是会分几个档位,比如分3个档位,就是1/3Bias。
    
  • 占空比(Duty):

    这个参数和COM有关,由于LCD是以动态方式驱动,因此每个COM选通的时间就是整个扫描周期时间的1/COM。比如有4个COM,就是1/4Duty。
    

示例(1/4Duty 1/3Bias):
在这里插入图片描述

图2 1/4Duty 1/3Bias 驱动波形

要选中LCD中的某一段点亮,就要使它的COM和SEG之间的电压差大于LCD显示屏的阈值,如图2所示,COM0-SEG0前1/4周期中的电压差分别为±VDD,即COM0SEG0所对应的区段被点亮。将电压分成几级的目的是防止对比度不均匀,在不点亮的区段上仍加有一定的电压,可以降低点亮区段产生的交叉干扰和防止对比度不均匀。

三、LCD驱动

以华大HC32LFx3x-STK-V2.0开发板为例,该开发板使用的是HC32L136K8TA芯片,最多具有8个公用端子(COM)和40个区段端子(SEG),用以驱动160(4×40)或288(8×36)个LCD图像元素。

华大单片机有两种显示模式,对应的数据存储方式不同,这里采用的是显示模式0、1/4Duty。
在这里插入图片描述

用跳线外接一个4*26的LCD屏,其真值表如下
在这里插入图片描述
在这里插入图片描述

图3 LCD屏真值表

LCD管脚配置(与LCD相关的端口都要配置为模拟端口)

void Lcd_SetPortAnalog(void)
{
   
    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, GpioPin12);  ///< SEG8
    Gpio_SetAnalogMode(GpioPortB, GpioPin11);  ///< SEG9
    Gpio_SetAnalogMode(GpioPortB, GpioPin10);  ///< SEG10
    Gpio_SetAnalogMode(GpioPortB, GpioPin2);   ///< SEG11
    Gpio_SetAnalogMode(GpioPortB, GpioPin1);   ///< SEG12
    Gpio_SetAnalogMode(GpioPortB, GpioPin0);   ///< SEG13
    Gpio_SetAnalogMode(GpioPortC, GpioPin5);   ///< SEG14
    Gpio_SetAnalogMode(GpioPortC, GpioPin4);   ///< SEG15
    Gpio_SetAnalogMode(GpioPortA, GpioPin7);   ///< SEG16
    Gpio_SetAnalogMode(GpioPortA, GpioPin6);   ///< SEG17
    Gpio_SetAnalogMode(GpioPortA, GpioPin5);   ///< SEG18
    Gpio_SetAnalogMode(GpioPortA, GpioPin4);   ///< SEG19
    Gpio_SetAnalogMode(GpioPortA, GpioPin3);   ///< SEG20
    Gpio_SetAnalogMode(GpioPortA, GpioPin2);   ///< SEG21
    Gpio_SetAnalogMode(GpioPortA, GpioPin1);   ///< SEG22
    Gpio_SetAnalogMode(GpioPortA, GpioPin0);   ///< SEG23
    Gpio_SetAnalogMode(GpioPortC, GpioPin3);   ///< SEG24
    Gpio_SetAnalogMode(GpioPortC, GpioPin2);   ///< SEG25
}

LCD参数配置

void LCD_Config(void)
{
   
	stc_lcd_cfg_t   LcdInitStruct;
	stc_lcd_segcom_t   LcdSegCom;
	
	LcdSegCom.u32Seg0_31 = 0xfc000000;                             ///< 配置LCD_POEN0寄存器 使能SEG0~SEG25
	LcdSegCom.stc_seg32_51_com0_8_t.seg32_51_com0_8 = 0xffffffff;	 ///< 初始化LCD_POEN1寄存器 全部关闭输出端口
	LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0;         ///< 使能COM0~COM3
	LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Mux = 0;            ///< Mux=0,Seg32_35=0,BSEL=1表示:选择外部电容工作模式,内部电阻断路
	LcdSegCom.stc_seg32_51_com0_8_t.segcom_bit.Seg32_35 = 0x0;     
	Lcd_SetSegCom(&LcdSegCom);                                     ///< LCD COMSEG端口配置
	
	LcdInitStruct.LcdBiasSrc = LcdExtCap;           ///< 外部电容分压模式
//	LcdInitStruct.LcdBiasSrc = LcdExtRes;           ///< 外部电阻分压模式
//	LcdInitStruct.LcdBiasSrc = LcdInResHighPower;   ///< 内部电阻分压,大功耗模式
	LcdInitStruct.LcdBias = LcdBias3;               ///< 1/3 Bias
	LcdInitStruct.LcdDuty = LcdDuty4;               ///< 1/4duty
	LcdInitStruct.LcdClkSrc = LcdRCL;               ///< LCD时钟选择RCL
	LcdInitStruct.LcdCpClk = LcdClk2k;              ///< 电压泵时钟频率选择2kHz
	LcdInitStruct.LcdScanClk = LcdClk256hz;         ///< LCD扫描频率选择256Hz
	LcdInitStruct.LcdMode = LcdMode0;               ///< 选择模式0
	LcdIni
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值