wuyage

Kinetis SLCD

1
阅读(189) 评论(2)

    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 间有一经验公式,即:

   xx.png


FRDM-KL43上先看硬件:

xx.png


断码LCD说明书如下

微信截图_20170521104709.png

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 */   // COM0
PORT_SetPinMux(PORTE, PIN21_IDX, kPORT_PinDisabledOrAnalog); /* PORTE21 (pin 10) is configured as LCD_P60 */  // COM1
PORT_SetPinMux(PORTB, PIN18_IDX, kPORT_PinDisabledOrAnalog); /* PORTB18 (pin 41) is configured as LCD_P14 */ // COM2
PORT_SetPinMux(PORTB, PIN19_IDX, kPORT_PinDisabledOrAnalog); /* PORTB19 (pin 42) is configured as LCD_P15 */ // COM3


PORT_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

112.png

111.png


111.png


初始化代码如下:

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

xxx.png


LCD Pin Enable register (LCD_BPENn) 这是个32位的寄存器,有2个, 用到的COM 端置1,即LCD_P14,15,59,60


最后是:LCD_WF,, 寄存器

xxxxx.png

xxxx.png

每个寄存器的含义是:

每8个bit对应一个LCD pin,当这个LCD pin是COM端时,它控制COM端的使能与否,8个bit 对应相位

                                           当这个LCD pin是SEG端时,它控制对应COM端的SEG是否使能


比如要控制1D点亮,只需要将COM0 对应的WF59的0位(表示相位A)置1,另外WF20的0位置1.

1xxx.png







  1. 很不错!!!!!

  2. 写的不错 可以转载么