STM8驱动LCD段码屏

两盒软妹~` 提交于 2020-03-10 00:12:40

    在工作中遇到用stm8驱动LCD段码屏,发现很有意思,特在此记录下来。整个说明过程由液晶屏显示原理,驱动断码LCD液晶屏的方式,stm8驱动断码屏三块进行说明。

一、液晶屏显示原理

    液晶是一种介于固态和液态中间的物质。通电时,液晶分子的排列变得有序,使光线容易通过;不通电时排列混乱,阻止光线通过。通过此原理制作成液晶显示器。

    液晶显示器(LCD/Liquid Crystal Display)的显像原理,是将液晶置于两片导电玻璃之间,靠两个电极间电场的驱动,引起液晶分子扭曲向列的电场效应,以控制光源透射或遮蔽功能,在电源关开之间产生明暗变化,从而将影像显示出来。若加上彩色滤光片,则可显示彩色影像。在两片玻璃基板上装有配向膜,所以液晶会沿着沟槽配向,由于玻璃基板配向膜沟槽偏离90度,所以液晶分子成为扭转型,当玻璃基板没有加入电场时,光线透过偏光板跟着液晶做90度扭转,通过下方偏光板,液晶面板显示白色(如图1左);当玻璃基板加入电场时,液晶分子产生配列变化,光线通过液晶分子空隙维持原方向,被下方偏光板遮蔽,光线被吸收无法透出,液晶面板显示黑色(如图1右))。液晶显示器便是根据此电压有无,使面板达到显示效果。(网上盗用,感谢,原文地址http://www.520101.com/html/base/1202066690.html

图1

液晶屏一般有这几个参数:可视角度、亮度和对比度、响应时间、显示色素。

二、驱动断码LCD屏的方式

1、静态驱动

基本原理:在对应的电极间加交变电场或者不加电场。

实现过程:有电场时,当电压比液晶的阈值高很多时,LCD处于选通状态。无电场时,LCD为非选通状态。

2、多路驱动(动态驱动法)

基本原理:电极沿着X、Y方向排列,按照顺序给X电极施加选通波形(交流电压),给Y电极施加与X电极同步的选通或者非选通波形。周而复始的操作,控制XY交叉点的像素为选通态或者非选通态。

图2 电极阵列

驱动X电极从第一行到最后一行所需的时间为帧周期Tf,驱动每一行所用的时间Tr与帧周期的比值为占空比:Duty=Tr/Tf=1/N。N为X的行数。

偏压比:Bias=1/a,为非选通波形电压和选通波形电压之比。最佳值:

偏压比取最佳值得目的是克服交叉效应

在动态驱动方式下,要使某一位置如(i,j)点显示,就需在第i列和第j行上同时施加选择电压,使该点的变电场强最大,但此时除(i,j)点外,第i列和第j行的其余各点也承受了一定电压,这些点称为半选通点。若半选通点上的有效电压大于阈值电压时,在屏幕上将出现不应有的显示,使对比度下降,这就是交叉效应。解决交叉效应的办法是平均电压法,即把半选通点与非选通点的电压平均,适度提高非选通点的电压来抵消半选通点上的一部分电压,使半选通点上的电压下降,从而提高显示对比度。

图3 平均电压法图例

如图3所示,让(COM2,SEG1)为选通点,按照图示施加电压,则各点的电位差为:

选通点:(2,1):V1+V2

半选通点(COM2或SEG1上的点):(1,1)(3,1)(4,1):V2    (2,2)(2,3)(2,4):V1-1/a'V1

非选通点:-1/a'V1

选通点的电压需要达到液晶的阈值,则V1+V2=VLCD。同时半选通点和非选通点的电压应该相等|V2|=|-1/a'V1|,解得V1=(a'/a'+1)VLCD,V2=(1/a'+1)VLCD。

令a=a'+1,可得到各个点的电压为

选通点:VLCD    半选通点:(1/a)VLCD以及(a-2/a)VLCD     非选通点-(1/a)VLCD

三、STM8驱动LCD段码屏

STM8自带有LCD屏驱动,驱动的方式使用动态驱动法。使用时需要配置相应的参数,然后向LCD显示内存(LCD_RAM)相应位置写入数据来驱动相应的像素点。以下为详细配置方式:

1、使用库函数的方式来配置驱动LCD的基本参数

(1)时钟配置:由图4可看出LCD显示屏的时钟有RTC时钟提供,所以配置时也需要配置RTC的时钟,代码如下:

 /* Enable LCD/RTC clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); 
  CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);
  
  CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1); /*内部时钟频率38KHZ*/

这里的时钟频率为f=38Khz。

图4 时钟树

(2)基础参数配置,这里用到了8个COM,则配置代码为

LCD_Init(LCD_Prescaler_2,LCD_Divider_17,LCD_Duty_1_8, LCD_Bias_1_3,LCD_VoltageSource_Internal);

①Frequency selection register (LCD_FRQ)(时钟配置寄存器)

位7:4 PS[3:0]:CLK 16位预分频器(函数的第一个参数)

3:0 DIV[3:0]:16到31的除数(函数的第二个参数)

则驱动LCD屏的频率为:fLCD=(f/LCD_Prescaler_2)/LCD_Divider_17

②函数的第三,第四个参数分别为占空比和偏压比,在这里用到了8个COM口,所以Duty为1/8;Bias为1/3。函数最后一个参数是设置使用外部电源还是内部电源,这里需要从单片机内部获取电源,所以设置为使用内部电源。

(3)设置LCD的SEG引脚

  LCD_PortMaskConfig(LCD_PortMaskRegister_0, 0xF0);  //seg4 - 7  
  LCD_PortMaskConfig(LCD_PortMaskRegister_1, 0xFF);  //seg8 - 15 
  LCD_PortMaskConfig(LCD_PortMaskRegister_2, 0x3F);  //seg16 - 21

这里硬件上驱动LCD屏的引脚为PE3,PE4,PE5...PD5,PD6,PD7,通过查询手册的到它们为SEG4~SEG21;

 图5 SEG脚图

如图5所示,配置SEG4~SEG7,需要配置LCD_PM0的高4位,即第一个函数,别的引脚也是如此。

(4)配置对比度,死区时间,脉冲持续时间,使能LCD

LCD_ContrastConfig(LCD_Contrast_Level_6);           //对比度 
LCD_DeadTimeConfig(LCD_DeadTime_1);		    //死区时间
LCD_PulseOnDurationConfig(LCD_PulseOnDuration_7);   //脉冲持续时间
  
LCD_Cmd(ENABLE);

对比度配置越高,屏幕画面对比越高。控制VLCD,电压超过液晶阈值越多,显示越清晰。

死区时间越高,画面的对比越低。

脉冲持续时间越久,屏幕画面显示效果越好,但是会更耗电。

2、基础参数配置完成,通过往LCD显示内存(LCD_RAM)相应位置写入数据来驱动相应的像素点。

图6 LCD_RAM

如图6所示不同的COM和SEG口对应着不同的LCD_RAM。例如,COM0和SEG10控制的笔段对应的为S0[10],此时想要控制显示,需要向这个位置写入1,即配置LCD->RAM[1] |= 0x04;

可以发现COM4和SEG10控制的笔段对应的也是S0[10],这里是因为,使用超过4个COM口时,需要配置LCD_RAM页,使用以下函数进行配置,页1控制COM0,1,2,3;页2控制COM4,5,6,7

/**
  * @brief  Select the LCD page where the data will be written.
  * @param  LCD_Page: The accessed LCD page.
  *          This parameter can be one of the following values:
  *            @arg LCD_PageSelection_FirstPage: The LCD RAM is selected as the first page
  *            @arg LCD_PageSelection_SecondPage: The LCD RAM is selected as the second page  
  * @retval None
  */
void LCD_PageSelect(LCD_PageSelection_TypeDef LCD_PageSelection)

完成以上的步骤,就可以驱动LCD断码屏的一个一个的液晶(笔段)组成不用的形状了。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!