【精品博文】Kinetis SLCD
LCD的驱动不像LED那样,加上电压(LED实际上是电流驱动)就可以长期显示的。 LCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压, 不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时, 在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以 调节方波中每半个周期中显示的时间(即占空比)来实现。
通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。 另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和 某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑).
有几个相关的名词:
扫描频率,直接驱动液晶分子的交流电压的频率一般在 60~100Hz 之间,具体是依据 LCD Panel 的面积和设计而定,频率过高,会导致驱动功耗的增加,频率过低,会导致显示闪烁,同时如果扫描频率同光源的频率之间
有倍数关系,则显示也会有闪烁现象出现。
DUTY -- 该项参数一般也称为 Duty 数或 COM 数。由于 STN/TN 的 LCD 一般是采用时分动态扫描的驱动模式,在此模式下,每个 COM 的有效选通时间与整个扫描周期的比值即占空比(Duty)是固定的,等于 1/COM 数。
偏置(Bias)--LCD 的 SEG/COM 的驱动波形为模拟信号, 而各档模拟电压相对于 LCD 输出的最高电压的比例称为偏置,而一般来讲,Bias 是以最低一档与输出最高电压的比值来表示。
一般而言,Bias 和 Duty 之间是有一定关系的,duty 数越多,每根 COM 对应的扫描时间变短,而要达到同样的显示亮度和显示对比度,VON 的电压就要提高,选电平和非选电平的差异需要加大,即 Bias 需要加大,Duty 和 Bias 间有一经验公式,即:
FRDM-KL43上先看硬件:
断码LCD说明书如下
COM0 -- 对应MCU的PTE20 LCD_P59
COM1-- 对应MCU的PTE21 LCD_P60
COM2 -- 对应MCU的PTB18 LCD_P14
COM3 -- 对应MCU的PTB19 LCD_P15
以下是代码中的pinmux配置
PORT_SetPinMux(PORTE, PIN20_IDX, kPORT_PinDisabledOrAnalog); /* PORTE20 (pin 9) is configured as LCD_P59 */ // COM0PORT_SetPinMux(PORTE, PIN21_IDX, kPORT_PinDisabledOrAnalog); /* PORTE21 (pin 10) is configured as LCD_P60 */ // COM1PORT_SetPinMux(PORTB, PIN18_IDX, kPORT_PinDisabledOrAnalog); /* PORTB18 (pin 41) is configured as LCD_P14 */ // COM2PORT_SetPinMux(PORTB, PIN19_IDX, kPORT_PinDisabledOrAnalog); /* PORTB19 (pin 42) is configured as LCD_P15 */ // COM3PORT_SetPinMux(PORTC, PIN0_IDX, kPORT_PinDisabledOrAnalog); /* PORTC0 (pin 43) is configured as LCD_P20 */PORT_SetPinMux(PORTC, PIN4_IDX, kPORT_PinDisabledOrAnalog); /* PORTC4 (pin 53) is configured as LCD_P24 */PORT_SetPinMux(PORTC, PIN6_IDX, kPORT_PinDisabledOrAnalog); /* PORTC6 (pin 55) is configured as LCD_P26 */ PORT_SetPinMux(PORTC, PIN7_IDX, kPORT_PinDisabledOrAnalog); /* PORTC7 (pin 56) is configured as LCD_P27 */ PORT_SetPinMux(PORTD, PIN0_IDX, kPORT_PinDisabledOrAnalog); /* PORTD0 (pin 57) is configured as LCD_P40 */ PORT_SetPinMux(PORTD, PIN2_IDX, kPORT_PinDisabledOrAnalog); /* PORTD2 (pin 59) is configured as LCD_P42 */ PORT_SetPinMux(PORTD, PIN3_IDX, kPORT_PinDisabledOrAnalog); /* PORTD3 (pin 60) is configured as LCD_P43 */ PORT_SetPinMux(PORTD, PIN4_IDX, kPORT_PinDisabledOrAnalog); /* PORTD4 (pin 61) is configured as LCD_P44 */
下面看下clock
初始化代码如下:
slcd_config_t config; slcd_clock_config_t clkConfig = { kSLCD_AlternateClk1, kSLCD_AltClkDivFactor256, kSLCD_ClkPrescaler01, false };SLCD_GetDefaultConfig(&config);/* Verify and Complete the configuration structure. */config.clkConfig = &clkConfig;config.loadAdjust = kSLCD_HighLoadOrSlowestClkSrc;config.dutyCycle = kSLCD_1Div4DutyCycle;config.slcdLowPinEnabled = 0x0d10c000U; /* LCD_P27/26/24/20 -> b27/26/24/20 = 1. */config.slcdHighPinEnabled = 0x18001d00U; /* LCD_P44/43/42/40 -> b12/11/10/8 = 1. */config.backPlaneLowPin = 0x0000c000U; /* LCD_P15/P14 -> b15/b14 = 1. */config.backPlaneHighPin = 0x18000000U; /* LCD_P60/P59 -> b28/27 = 1. */config.faultConfig = NULL;/* SLCD Initialize. */ SLCD_Init(LCD, &config);
kSLCD_AlternateClk1 表示MCGIRC Clock
再看几个控制的寄存器
LCD Pin Enable register (LCD_PENn) 这是个32位的寄存器,有2个, 用到的所有LCD pin 都要置1
LCD_PENL 对应LCD_P0-31
0xD10C000 1101 0001 0000 1100 0000 0000 0000 对应LCD_P14,15,20,24,26,27
0x18001d00 0001 1000 0000 0000 0001 1101 0000 0000 对应LCD_P40,42,43,44,59,60
LCD Pin Enable register (LCD_BPENn) 这是个32位的寄存器,有2个, 用到的COM 端置1,即LCD_P14,15,59,60
最后是:LCD_WF,, 寄存器
每个寄存器的含义是:
每8个bit对应一个LCD pin,当这个LCD pin是COM端时,它控制COM端的使能与否,8个bit 对应相位当这个LCD pin是SEG端时,它控制对应COM端的SEG是否使能比如要控制1D点亮,只需要将COM0 对应的WF59的0位(表示相位A)置1,另外WF20的0位置1.
1