在工作中遇到用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断码屏的一个一个的液晶(笔段)组成不用的形状了。
来源:CSDN
作者:cheerk
链接:https://blog.csdn.net/cheerk/article/details/79851527