发表于: 2017-6-5 16:24:51 | 显示全部楼层

LCD的驱动不像LED那样,加上电压(LED实际上是电流驱动)就可以长期显示的。 LCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压, 不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时, 在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以 调节方波中每半个周期中显示的时间(即占空比)来实现。


通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。 另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和 某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑)。


段式液晶SLCD相关名词

扫描频率 —— 直接驱动液晶分子的交流电压的频率一般在 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 间有一经验公式,即:

1000006565-6363096206205599728737404.png


硬件连接

FRDM-KL43开发板采用的是7段液晶屏LCD-S401M16KR,其与MCU通过SLCD连接。硬件原理图如下:

1000006565-6363096036393631721128242.png

可以从段式液晶的图纸中看到内部结构图:

1000006565-6363096042645650289596719.png

段式液晶的公共端与MCU的连接方式如下:

COM0 -- 对应MCU的PTE20 LCD_P59

COM1-- 对应MCU的PTE21 LCD_P60

COM2 -- 对应MCU的PTB18 LCD_P14

COM3 -- 对应MCU的PTB19 LCD_P15


代码

以下是代码中的pinmux配置

  1. PORT_SetPinMux(PORTE, PIN20_IDX, kPORT_PinDisabledOrAnalog); /* PORTE20 (pin 9) is configured as LCD_P59 */ // COM0
  2. PORT_SetPinMux(PORTE, PIN21_IDX, kPORT_PinDisabledOrAnalog); /* PORTE21 (pin 10) is configured as LCD_P60 */ // COM1
  3. PORT_SetPinMux(PORTB, PIN18_IDX, kPORT_PinDisabledOrAnalog); /* PORTB18 (pin 41) is configured as LCD_P14 */ // COM2
  4. PORT_SetPinMux(PORTB, PIN19_IDX, kPORT_PinDisabledOrAnalog); /* PORTB19 (pin 42) is configured as LCD_P15 */ // COM3

  5. PORT_SetPinMux(PORTC, PIN0_IDX, kPORT_PinDisabledOrAnalog); /* PORTC0 (pin 43) is configured as LCD_P20 */
  6. PORT_SetPinMux(PORTC, PIN4_IDX, kPORT_PinDisabledOrAnalog); /* PORTC4 (pin 53) is configured as LCD_P24 */
  7. PORT_SetPinMux(PORTC, PIN6_IDX, kPORT_PinDisabledOrAnalog); /* PORTC6 (pin 55) is configured as LCD_P26 */
  8. PORT_SetPinMux(PORTC, PIN7_IDX, kPORT_PinDisabledOrAnalog); /* PORTC7 (pin 56) is configured as LCD_P27 */
  9. PORT_SetPinMux(PORTD, PIN0_IDX, kPORT_PinDisabledOrAnalog); /* PORTD0 (pin 57) is configured as LCD_P40 */
  10. PORT_SetPinMux(PORTD, PIN2_IDX, kPORT_PinDisabledOrAnalog); /* PORTD2 (pin 59) is configured as LCD_P42 */
  11. PORT_SetPinMux(PORTD, PIN3_IDX, kPORT_PinDisabledOrAnalog); /* PORTD3 (pin 60) is configured as LCD_P43 */
  12. PORT_SetPinMux(PORTD, PIN4_IDX, kPORT_PinDisabledOrAnalog); /* PORTD4 (pin 61) is configured as LCD_P44 */
复制代码

SLCD时钟配置

1000006565-6363096278835935036710598.png

1000006565-6363096277118623857395724.png

1000006565-6363096293179156269261303.png


初始化代码如下:

  1. slcd_config_t config;
  2.       
  3. slcd_clock_config_t clkConfig =   
  4. {        kSLCD_AlternateClk1,     
  5.          kSLCD_AltClkDivFactor256,     
  6.          kSLCD_ClkPrescaler01,      
  7.          false   
  8. };

  9. SLCD_GetDefaultConfig(&config);
  10. /* Verify and Complete the configuration structure. */
  11. config.clkConfig = &clkConfig;
  12. config.loadAdjust = kSLCD_HighLoadOrSlowestClkSrc;
  13. config.dutyCycle = kSLCD_1Div4DutyCycle;
  14. config.slcdLowPinEnabled = 0x0d10c000U;  /* LCD_P27/26/24/20 -> b27/26/24/20 = 1. */
  15. config.slcdHighPinEnabled = 0x18001d00U; /* LCD_P44/43/42/40 -> b12/11/10/8 = 1. */
  16. config.backPlaneLowPin = 0x0000c000U;    /* LCD_P15/P14 -> b15/b14 = 1. */
  17. config.backPlaneHighPin = 0x18000000U;   /* LCD_P60/P59 -> b28/27 = 1. */
  18. config.faultConfig = NULL;
  19. /* SLCD Initialize. */  
  20. SLCD_Init(LCD, &config);
复制代码

kSLCD_AlternateClk1 表示MCGIRC Clock


SLCD相关寄存器

再看几个控制的寄存器:

LCD Pin Enable register (LCD_PENn) :这是个32位的寄存器,有2个, 用到的所有LCD pin 都要置1。LCD_PENL 对应LCD_P0-31,LCD_PENH 对应LCD_P32-631,

LCD_PENL :0x0D10C000 ——  0000 1101 0001 0000 1100 0000 0000 0000 对应LCD_P14、15、20、24、26、27

LCD_PENH:0x18001D00  —— 0001 1000 0000 0000 0001 1101 0000 0000 对应LCD_P40、42、43、44、59、60

1000006565-6363096584400049348595866.png


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


LCD Waveform register(LCD_WFxx) :

1000006565-6363096676667886069008725.png

1000006565-6363096695822492009023638.png

每个寄存器的含义是:

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


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

1000006565-6363097143359505336723949.png

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 47 | 回复: 68



手机版|

GMT+8, 2024-4-27 11:32 , Processed in 0.040758 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表