31399金沙娱场城PT32x033系列 | 血糖仪专题技术文章连载_02
|
01 概述
在MCU的应用中,人机界面占据相当重要的地位。人机界面主要包括事件输入(键盘输入、通讯接口等)和结果显示(LED/LCD 、通讯接口等),LCD技术由于其具有界面友好,成本较低等特点在很多应用场合得以广泛应用。
31399金沙娱场城的PT32x033系列单片机以低功耗和丰富的外设模块著称。针对液晶显示这一应用,PT32x033系列单片机可分为两类,一类内置LCD 控制器,另一类不带LCD 控制器。内置LCD 控制器的单片机价格较高,使用成本增加。不带LCD 控制器的单片机可配合液晶驱动芯片使用,但需增加额外的芯片,也增加了成本。本文介绍的方案,适用于不带LCD 控制器的PT32x033系列单片机,通过使用通用I/O 口直接驱动LCD 显示,其显示效果以及占用的资源和内置液晶控制器的单片机相同。
02 LCD显示原理
在讲解驱动之前,31399金沙娱场城先就 LCD 的显示原理作简单的介绍。
LCD(Liquid Crystal Display)是利用液晶分子的物理结构和光学特性进行显示的一种技术,液晶分子的特性:
□ 液晶分子是介于固体和液体之间的一种棒状结构的大分子物质
□ 在自然形态,具有光学各向异性的特点,在电(磁) 场作用下,呈各向同性特点
下面以TN/STN类型的显示面板基本结构来介绍 LCD 的基本显示原理,如下图
图1 LCD显示原理示意图 |
整个显示面板由上下玻璃基板和偏振片(上下偏振片的偏振角度互相垂直)组成。在上下玻璃基板之间,按照螺旋结构将液晶分子有规律地进行涂层,由于液晶分子的排列为螺旋结构,因此对光线具有旋光性。液晶面板的电极是通过一种 IT0 的金属化合物蚀刻在上下玻璃基板上。
当上下基板间的电压为 0 时,自然光通过偏振片后,只有与偏振片方向相同的光线得以进入液晶分子的螺旋结构的涂层中,由于螺旋结构的的旋光性,将入射光线的方向旋转 90 度后照射到另一端的偏振片上,同时由于上下偏振片的偏振角度相互垂直,这样入射光线通过另一端的偏振片完全的射出,光线完全进入观察者的眼中,看到的效果就为白色。
当上下基板间的电压为 一交流电压 时,液晶分子的螺旋结构在电(磁) 场的作用下,变成了同向排列结构,对光线的方向没有做任何旋转,而上下偏振片的偏振角度相互垂直,这样入射光线就无法通过另一端的偏振片射出,光线无法进入观察者的眼中,看到的效果就为黑色。
通过在上下玻璃基板电极间施加不同的交流电压,即可实现液晶显示的两种基本状态亮\On) 和暗 (Off) 。 |
2.1 驱动关键参数
起显示模糊,寿命减少,其破坏性为不可恢复。在单片机系统中,一般LCD 的驱动电压选择为MCU 的供电电压,LCD 电压高于MCU 电压易造成亮度不够,LCD 电压低于MCU 电压易造成“鬼影”(不该点亮的点亮)。驱动液晶分子的交流电压的频率依据LCD 面板的面积和设计而定,一般在 60~100Hz 之间。频率过高,增加驱动功耗;频率过低,会导致显示闪烁,同时如果扫描频率同光源的频率之间有倍数关系,显示也会有闪烁现象出现。
在LCD 驱动中,驱动电压和扫描频率非常关键。液晶分子是用交流电压驱动的,长时间的直流电压加在液晶分子两端,会影响液晶分子的电气化学特性,引液晶分子是一种电压积分型材料,它的扭曲程度(透光性)仅和极板间电压的有效值有关,和充电波形无关。电压的有效值用COM/SEG 之间的电压差值的均方根VRMS 表示: | |
LCD 显示“亮”和“灭(透光和不透光)的电压有效值的分界电压称为开启电压Vth,当电压有效值超过Vth,液晶分子的排列方向发生变化,旋光角度加大,透光率急剧变化,从而引起液晶显示状态的变化。光线的透射率与交流电压的有效值的关系如图2所示: |
|
|
LCD 段上是否存在RMS电压将决定此段为导通还是截止。图3中的示例波形给出了一个导通段和一个截止段的波形(COMx 和SPx 引脚信号的组合)。导通段比截止段上施加了更大的RMS 电压。注意,这两个段都具有净零直流电压的波形,但导通段上的RMS 电压较高,这使得该段导通并且看起来是暗的。
图3 LCD交流波形 |
033内嵌的LCD驱动器,正是通过系统的控制,按照用户定义的显示图案,在I/O 口产生点亮LCD所需的模拟驱动波形,接到LCD 面板上点亮对应的像素而达到想要的显示效果。LCD 面板有两个重要的参数:
占空比 (Duty) 该参数一般也称为Duty 数或COM 数。LCD 通常采用时分动态扫描的驱动模式,在此模式下,每个COM的有效选通时间与整个扫描周期的比值即占空比 (Duty)是固定的,等于1/COM 数。
偏置 (Bias) LCD 的SEG/COM 的驱动波形为模拟信号,各档模拟电压相对于LCD 输出的最高电压的比例称为偏置,偏压级数越多LCD 的对比度级别就越多,能显示的图案就越复杂。一般来讲,Bias是以输出最低档电压(0 除外)与输出最高档电压的比值来表示。图3 所示 为1/4 Duty,1/3 Bias液晶屏的COM端时序 。 |
图3 对应的是1/4 duty,1/3 bias 的液晶COM口驱动波形,COM 数为4,每个COM的有效选通时间与整个扫描周期的比值(Duty)为1/4,驱动波形的模拟电压共分3 档,V3 为输出最高电压,V2,V1 为输出中间电压,并且V1/V3=1/3。
|
|
为了达到理想的显示效果,一般而言,Bias 和COM 之间有一定关系,COM 数越多,每根COM 对应的选通时间变短,而要达到同样的显示亮度,VON 的电压就要提高,要达到同样的显示对比度,选电平和非选电平的差异需要加大,即Bias 需要加大,COM 和Bias 间有一经验公式,即: | |
图4 LCD驱动波形图 |
2.2 LCD管脚多路复用
033总共有32个可用于LCD的管脚,使用复用技术来限制控制引脚的数量,可支持2路复用、4路复用,6路复用,甚至最高支持8路复用。N路复用符号表示每个段引脚Sx可以驱动显示屏上的N个段,这同样意味着有N个公共(COMx) 引脚。显示屏上的每个LCD 段都由一个COMx引脚和一个Sx引脚组合为该段的液晶提供电势差进行驱动。利用多路复用技术可实现用有限的引脚控制更大量的段,例如一个8路复用LCD显示屏,有8个COM引脚并且每个段(Sx)引脚可以驱动8个段。因此,使用支持8路复用并有24个Sx引脚(S0-S23) 的033时,这8个(COMx) + 24个(Sx) =32个引脚可控制192个段。 |
图5 4路复用的连接和波形 |
图6 给出了基本的2路复用示例。在这种情况下,每个段由2个引脚(一个COMx引脚和一个Sx段引脚)的信号进行控制。如下显示的信号是施加到相应段的电极上的波形,Sx和COMx信号之间的电势差即是施加到此区域液晶上的电压。该电势差是图6(COM0-S0和COM1-S1)中所示的合成波形的电压。在本示例中,COM0-S0的波形具有高RMS 电压,尽管该波形具有净零直流电压,该段仍然导通。COM1-S1 波形的RMS 电压较低,因此该段截止。虽然这些波形看起来有些复杂,但请记住,它们将由033的LCD驱动器自动生成,用户只需要指定LCD 的基本设置,然后指定哪些段应该导通或者截止。 |
图6 2路复用示例 |
2.3 驱动器的电源
液晶驱动波形为由若干档直流电平组合而成的模拟波形, 各档直流电平的比例关系 反映驱动波形的Bias比例关系,各档电平的具体幅值取决于 LCD Panel 的液晶特性和Duty 数的多少。图7为LCD 驱动电源部分的示意图: |
图7 LCD驱动电源部分的示意图 |
电源调整器部分(Power Regulator),产生LCD驱动所需的最高直流电平,一般分为三种:
-
LCD驱动所需的最高直流电平等于外部输入电源VDD的,此部分就直接将VDD输入至后续电路;
-
LCD驱动所需的最高直流电平大于外部输入电源VDD,且不需要稳压输出的,如固定等于VDD或1.5VDD,此部分通常做法是将外部输入电源VDD通过升压电路(pump)升至所需的电压,输入至后续电路;
-
LCD驱动所需的最高直流电平大于外部输入电源VDD,且需要稳压输出的,即驱动所需的最高直流电平不随VDD的变化而变化的,如要求VDD =2.4~5.5V全电压范围里,VLCD的输出电压都保持不变,此部分通常做法是首先产生一个误差范围符合要求的电压基准源,然后将此电压基准源比例放大至所需的电压,同时外部输入电源VDD通过升压电路(pump)升至一定的电压,如2VDD,作为比例放大部分的电源。
注:033的LCD驱动电源调整器部分产生LCD驱动所需的最高直流电平,只支持前面两种,也就是VLCD会跟随着VDD的变化而变化,为了保障在低电压下仍然有比较高的对比度和显示效果,可以通过升压电路升压至VLCD=1.5VDD。
偏置电压产生部分(Bias Voltage Generator),LCD 驱动器输出的最高电压通过偏置电压产生电路,根据选择的偏置设置产生LCD交流驱动波形所需要的其它几档偏置电压(VLCD,Vn,Vn-1,⋯V1,V0),提供给后续的COM/SEG波形产生电路,此部分的实现方式一般分为两种:
电阻分压结构
即依据Bias的设置,选择合适的分压电阻,产生需要的直流分压电平,如图8;
图8 电阻分压结构的偏压电路示意图 |
电容结构
这是一种较为特殊的LCD 驱动的电源结构,在这种结构下,电压调整部分和电压偏置部分是整合在一起的,电源升压部分是直接按照Bias的设置产生LCD驱动需要的直流分压电平,如图中,VLCD可以是1倍的VDD也可以是1.5倍的VDD。
图9 电容分压结构的偏压电路示意图 |
在此结构下,如图9所示的外接电容一般情况是必须要的,否则仅仅依靠芯片内的电容,其驱动能力较差。 COM/SEG驱动波形产生部分(COM/SEG driver),COM/SEG driver可以看作一组多路选择开关,COM driver依据扫描计数器的值,SEG driver依据显示数据RAM对应的值,从输入的直流分压电平中进行选择并从相应的COM/SEG引脚加以输出。这样从整个LCD扫描周期来讲,从COM/SEG引脚上就输出了驱动LCD Panel所需要的模拟电压波形。 |
图10 COM/SEG驱动波形产生原理示意图 |
表1 直流分压电平的选择关系表 |
图11 COM/SEG 1/4和1/5 Bias下选通有效电平示意图 |
图12 1/4Bias下SEG/COM的波形图 |
2.4 LCD显示RAM
用户对033的LCD 驱动器的操作一方面是通过操作LCD 驱动器的控制寄存器来设置LCD 驱动的工作模式(包括Duty/对比度/扫描频率/LCD开关等的设置),另一方面LCD 面板上显示所需的内容是通过读写LCD显示RAM来实现。LCD RAM的结构不同于其它Data RAM,它是一个双口RAM(Dual Port)的结构,一边为CPU的读写接口,另外一边是与LCD driver的读接口。LCD RAM的字节排列顺序是与LCD 输出的COM/SEG阵列相对应的,具体对应关系如图13所示。比如要将COM2与SEG3交叉点处的点点亮,只需将0x40015404地址的Bit26置1即可,其余的工作由LCD驱动器的硬件自动完成。
注意:
(1)由于所有的LCD管脚都可以复用成COM或者SEG,为了更方便驱动软件的编程,建议COM从LCD0管脚依次往后配;
(2)图13是按1/4Duty来分配,033还可以支持1/8Duty,那么只需要往高位延伸即可(图中无定义的位)
图13 1/4Duty下SEG/COM的波形图 |
|
033的LCD驱动器最多可提供16页独立的显示RAM,支持有四种显示模式,分别为固定页面显示,单次轮显,单次轮显关闭模式和连续轮显模式,16页独立显示RAM的地址分配如表2所示。具体显示的页号由页数寄存器LCD_PGCNT和轮显最大页数寄存器LCD_PGMAX共同控制,详见033用户手册。
|
|
表2 16页显示RAM地址对应的地址范围 |
LCD显示RAM决定每页显示的内容,但是如果软件是对当前显示页的数据内容进行更新,在配置完相应的显示RAM后,还需向LCD_CTRL寄存器的更新位DU写1,LCD驱动器会在当前帧结束后更新当前显示页的显示内容,同时硬件会清零LCD_CTRL寄存器的DU位。
|
2.5 LCD闪烁显示
033的LCD驱动器支持全屏闪烁方式,软件配置LCD_CTRL寄存器的显示模式使能BLINK位置1即可实现以特定频率自动闪烁,闪烁频率可通过LCD_BTIME和LCD_BON两个寄存器共同配置。
03 LCD驱动器应用实例
3.1 建立映射表
编写LCD驱动程序常令人大伤脑筋,因为软件需要考虑许多的硬件因素。LCD屏幕引脚与MCU的引脚连接方式,MCU将引脚映射到LCD显示RAM的方式,LCD引脚的复用选择方式等因素交织在一起会使代码更加晦涩难懂。本节将给出一些提示技巧,以帮助用户做到使LCD 驱动软件更加易用和易懂,以及编写高效的LCD代码。
本章节实例以如下LCD屏幕详解驱动软件的编程思路,采用的LCD屏幕的管脚规格为4(COM)x 19(SEG),该显示屏涵盖了数码值和单位显示要素。
图14 LCD屏幕的COM和SEG贯穿关系 |
从上文LCD显示原理可知,LCD屏幕COMx和SEGx交叉的液晶段对应的驱动波形(COMx-SEGx)如果是选通电平,那么点亮,如果是非选通电平,那么点灭。该LCD屏幕共有11个数码管(8个完整的数码管和3个非完整数码管),每个数码管由A、B、C、D、E、F、G七段选择性组成。除了数码管之外,还有符号段,比如电池、单位、时间分格符等。LCD的屏幕每个显示点均有穿插对应的COM口和SEG口,其对应关系如图中的表格映射。表中的映射编码数字部分表示位置,字母部分表示对应的段,比如9F表示第九个数码管位置的F段。
举个例子,需要再LCD屏幕的第二个数码管显示数值“3”那么对应MAP表中的2A、2B、2C、2G必须选通点亮。
图15 LCD屏幕COM和SEG的映射关系表 |
基于上文的LCD屏幕,使用033与LCD屏幕的互连关系如图所示,MCU的LCD管脚复用关系为:LCD0~LCD3复用为COM口,LCD9~LCD27复用为SEG口。
图16 LCD屏幕和MCU的硬件互连关系 |
结合上文中关于LCD显示RAM以及LCD屏幕的段映射表,在屏幕和MCU的硬件互连关系确认的情况下即可得出下图中的LCD屏幕和RAM的映射阵列表,由该映射表就能够很清晰的知道要点亮屏幕上的点需要对应到RAM的地址和位域。
依旧以上文中需要点亮屏幕第二个数码管使其显示“3”为例,需要将地址0x40015408的第26位置1,同时将地址0x4001540C的第0位,第1位和第2位置1。
图16 LCD屏幕和RAM地址的映射关系 |
3.2 数码管取模编码
为了更好地对数码管进行取模编码,31399金沙娱场城把图16的映射关系做一个转换,把每个数码管的所有字段,比如1D,1C,1B,1A,1E,1G,1F组合成一个字节(图中的8位编码),这里的1代表数码管的位置,字母代表数码管的组成段,数值编码转换后的映射关系如图17所示。
从图17可知,由于LCD屏幕自身的特性,5#、6#、7#数码管编码后高4位和低4位必须做一次转置,才可与其他数码管的编码结果一致,有利于驱动软件编程的一致性。
图17 数码管数值编码与RAM地址映射关系 |
经过编码后,31399金沙娱场城可以采用如下宏定义来设定数码管每一段的编码数值: |
数码管每一段的编码值确定后,就可以对0-F以及其他字符形状取模 |
为了更好的管理上述的取模结果,定义了如下的数组,基于数组的索引,软件可以更方便针对需要显示的字符信息进行编程。比如显示“2”对应的数组索引为0x02,显示“A的数组索引为0x0A,显示“U”对应的数组索引为0x17。 |
从图16可以看到基本上每两段SEG能完全配置一个数码管,那么可以通过一个共用体(union)来管理所有的数码管,使得代码可以更加简洁。 |
将一些特殊的字段单独赋值,比如“电池电量低”、“单位”、“AM”等,因为这些不是数码,需要根据特殊情况来置位,依然使用宏定义来定义并且跟上面定义的共用体对应的位域关联起来方便软件在对数码管赋值的时候能够联动操作这些特殊字符。 |
使用宏定义点亮对应的特殊字符 |
使用宏定义关闭对应的特殊字符的显示 |
|
基于上述这些编码,液晶屏的取模已经全部完成,不管是需要显示数码还是显示特殊字符,只要对取模数组GAuB_char_tbl直接对LCD_LgcBuf(软件已经提前开辟共用体空间)赋值即可。比如第6个数码管需要显示“E”,那么软件是需要将GAuB_char_tbl[0xE]赋值给LCD_LgcBuf[7]。如果要显示特定字符“PM”,那么软件只需要执行Dis_Timer_PM_on。 分析到这边,对LCD显示字符的软件操作其实最终转换成了对共用体LCD_LgcBuf的操作。
首先软件先开辟一片显示共用体空间 |
|
根据图17的映射关系以及数码管取模结果,针对需要显示的数码管编号以及需要显示的数值的驱动如下: |
|
这里面有个特别需要注意的地方,从图16也可以看出来,5#、6#和7#数码管相对于其他数码管编码的高4位和低4位是转置的,因此这三个比较特殊的数码管在对显示共用体赋值之前必须先做一个转置处理(上述软件中的第17、21、25行),转置软件实现方式如下: |
|
3.3 LCD显示RAM赋值
上文2.4章节关于LCD显示RAM的阐述可知,LCD驱动器驱动波形最终是根据RAM的赋值情况输出的。3.2章节31399金沙娱场城知道了LCD显示字符和共用体的关系,通过一系列的软件定义,已经把LCD比较复杂的字符显示关系已经通过软件解耦,直接通过一个共用体结构LCD_LgcBuf就可以实现。那么这里面还差最后一个步骤,就是LCD_LgcBuf和RAM地址的映射和转换。
图18 LCD共用体结构与RAM地址映射关系 |
这里面一个关键的注意点是每个RAM的地址是32位并且分配给四个SEG(参考图13),同时LCD是1/duty(4个COM口)结构,因此把显示结构体每个字节的每组位元组分为高低4位,赋值给每个SEG对应的RAM地址的低4位。图18非常清晰的把COM/SEG、RAM位段、LCD显示共用体三者的关系都体现映射出来,软件基于这个图表进行编程。 首先定义LCD显示RAM的地址,033的LCD驱动器总共支持16页,每一页的地址请参考表2 |
|
对LCD显示共用体的每一个字节(每个字节对应一个数码或者字符)的低4位和高4位进行截取,并且按图18(图中只是以第0页来举例)对应的关系赋值到LCD显示RAM对应地址,由于LCD的显示RAM总共有16页,对应的软件赋值方式如下: |
|
上述针对LCD的RAM地址进行赋值全部都是针对COM和SEG交叉除的RAM位域操作,但是想让LCD驱动器能正常起来,还需要对所有COM口对应的LCD的RAM地址对应的位置1,如下图19红色方框部分所示 |
图19 COM口对应的RAM地址位赋值1 |
本文针对4个COM口规格的LCD为例,用如下软件实现对COM口对应的RAM地址位置1的操作
把32个LCD管脚分成8组,每一组LCD管脚对应一个RAM地址,从图13的映射表格也能清楚看出分组的依据,每相邻组之间对应的RAM地址偏移4,软件定义如下掩码: |
|
每一组的4个LCD管脚供占用一个32位的RAM地址,对应的每个LCD管脚依次占据8位,针对分组的每个LCD管脚起始位软件定义如下掩码: |
|
033最高规格可支持1/8Duty,也就是LCD管脚最多可复用成8个COM口,软件枚举出所有的COM |
|
基于如上的掩码和枚举定义,软件通过如下方法将需要配置的COM口的RAM地址对应位置1. |
|
举个例子,比如要设置LCD13为COM5,那么只需执行如下语句: 1.LCD_SET_DataBuff_COM(LCD_GroupMask_12_15,LCD_COMMASK1,LCD_COM5);
因此要实现对图19所示的4个COM口所在RAM区域进行配置需要执行如下四条语句:
|
3.4 LCD管脚配置编程技巧
033总共有32个LCD管脚LCD[31:0],每个LCD管脚均可复用成COM管脚或者SEG管脚,可由SEG/COM选择寄存器LCD_SCSEL来配置,寄存器定义如图20
图20 COM/SEG选择寄存器定义 |
上文中使用的硬件实例配置的复用方法为LCD[3:0]作为COM[3:0],LCD[27:9]作为SEG[19:1],基于该复用配置建立硬件互连关系以及图16的映射表,软件实现如下:
|
LCD的管脚能正常使用,除了配置上述的COM/SEG复用功能之外,LCD管脚还需要把模拟功能打开(对应于GPIO模拟功能使能)以及配置LCD管脚功能使能寄存器如图21把相应的LCD管脚使能。 |
图20 LCD管脚功能使能寄存器 |
本文实例只用到了LCD[3:0]以及LCD[27:9],因此软件只需要置位对应的管脚位
注意:为了更好的降低功耗,其他没有用到的LCD管脚对应的位必须置0 |
LCD管脚开启模拟功能的软件配置如下,LCD管脚和GPIO的对应关系请参考图16 |
|
3.5 LCD驱动器参数配置
在了解了LCD显示RAM和管脚复用的配置以及编程技巧后,还有一个管脚的配置就是关于LCD驱动器一些关键参数的配置,包括如下内容:
-
驱动器时钟源
-
帧频率
-
占空比
-
闪烁模式
-
轮显模式
-
驱动器电源类型
-
驱动波形类型
上述这些关键参数除了帧频率之外,全部都在LCD控制寄存器中配置,控制寄存器如图所示,具体也可参考用户手册。
基于本文选择的液晶显示屏,对LCD控制器的配置(包括使能LCD)如下: |
|
LCD的帧刷新频率可通过LCD_FSET寄存器的FS位来控制。通过设置FS值,使得帧刷新频率在25-120Hz之间 帧刷新频率=LCD时钟频率/(COM数*2*(FS*8+1))--------COM=2; COM=4 帧刷新频率=LCD时钟频率/(COM数*2*(FS*4+1))--------COM=6; COM=8 配置FS值为4,那么帧刷新频率=32KHz/(4*2*(4*8+1))≈120Hz |
3.6 显示示例
经过前面章节的阐述,31399金沙娱场城已经知道了LCD的驱动原理、使用033内置LCD驱动器的软件编程技巧等,基于上面的配置,这边以如下图显示绿色部分字符进一步说明最终要实现LCD显示更新的软件配置流程。
实际显示效果如下图所示