一、显示原理
LCD屏内部采用了一种液晶材料,液晶分子介于固态和液态之间。在自然状态下,液晶具有光学各向异性,但在电磁场作用下会呈现各向同性,LCD屏就是利用了液晶分子的这种物理结构和光学特性制造而成的。
屏的顶部和底部是一对互相垂直的偏振片,中间是液晶分子涂层。当液晶分子两端电压为0时,液晶分子呈现螺旋状态,自然光跟随液晶分子的旋光特性旋转进入到屏另一端的偏振片上,刚好旋转90°后可以穿过。此时,由于光线可以通过,所以人眼看上去屏是白色的。
给屏的两端加上电压时,中间的液晶分子变成了同向排列的结构。此时,由于没有了旋转结构,进入到屏里面的光也就无法旋转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):
要选中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屏,其真值表如下
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