LCD驱动必须由交流电压驱动,以保持稳定的显示。如果在LCD上增加稳定的直流电压,它不仅不能正常显示,而且会在很长一段时间内损坏LCD。当需要显示时,在背电极和段电极之间增加适当的交流电压(通常使用方波)。为了调整对比度,可以调整方波中每半个周期中显示的时间(即空比)。
通常,为了节省驱动端口,将多个背电极连接在一起,形成一个公共背电极端:COM。此外,将不同COM的段电极连接在一起,形成一个公共段电极端:SEG。当在COM和SEG之间增加足够的交流电压时,相应的段点亮(实际上是黑色的)。
例如,瑞显熙公司设计的PCBA模块上使用的LCD有4个COM和16个SEG。为了显示某个SEG,需要在相应的SEG和COM之间增加足够的交流电压。在瑞显熙的板上,COM驱动使用两个电阻分压,输出电压为1/2VCC。当不想让某个显示时,将其电压设置为1/2VCC(通过将IO口设置为高阻态来完成),这样相应的SEG和COM之间的电压只有1/2VCC,不足以点亮相应的SEG。如果需要显示,将COM电压设置为0或1,这样SEG电压与COM电压相反的部分就会被点亮(变黑),因为它们之间的电压是VCC。通过定期扫描每个COM,您可以在LCD上稳定显示所需的图形。当需要显示字符或数字时,首先设计相应的图案,然后发送到相应的SEG和COM。但是,如果使用100%的时间驱动,对比度会过高,甚至不应该显示的地方也会显示出来。因此,显示一段时间后,COM和SEG设置为低,关闭其显示,降低对比度。对比度可以通过调整关闭时间(PWM)来调整。在下面的测试程序中,为了简化程序,使用了50%的固定比例。
为了便于描述,我们通常称COM为低功率点亮为正亮,COM为高功率点亮为负亮。扫描每个COM分为四个阶段:正亮、关闭、负亮和关闭。因此,板上的LCD驱动器有16个状态,每个COM都有上述4个状态。我们每2ms切换一次状态,这样整个扫描周期是2*16=32ms,基本上没有闪烁。
但需要注意的是,LCD中的每个COM并不仅仅对应于显示图案中一个字符的位置。每个COM对应于每个显示字符中相同的四段!换句话说,每个COM都应该用来显示第一个字符位置的字符。因此,为了改变字符位置的显示,有必要在每个COM输出时更改相应的SEG中的四段。为此,建立缓冲区,当需要修改显示字符时,修改缓冲区的内容。这个缓冲区有四行,每行有16个SEG,对应一个COM。当需要修改显示时,将每行对应的4个SEG设置为所需值,从而修改显示位置图案。
为了显示字符,需要根据SEG和COM的分布提前将要显示的字符制作成数据保存。当需要显示时,将其复制到显示缓冲区的相应位置。此外,由于输入参数是字符的ASCII码,因此需要将ASCII码转换为相应字符图案的索引值。使用特殊函数完成这些转换并填充缓冲区,并在需要修改显示数据时调用该函数。
为了方便大家对LCD的驱动模式和编程,下面简单画一下驱动波形图。
这里只画了两个SEG波形图,实际上有16个SEG,只要你理解两个SEG,那么16个也是一样的意思。如图所示,所有偶数阶段都是关闭显示阶段。此时,COM和SEG为0,不会点亮。通过调整关闭显示阶段的时间百分比,可以调整整体显示的对比度。SEG和COM之间的电平差不能显示或浓度不够,而SEG和COM之间的电平差可以显示或浓度较深。例如,第一阶段SEG1和COM1之间的差异为2,第三阶段COM1和SEG1之间的差异为2,因此SEG1和COM1之间的交叉点(即点1)被显示。另一个例子是第九阶段SEG1和COM3之间的差异为2,第十一阶段COM3和SEG1之间的差异为2,因此SEG1和COM3之间的交叉点(即点5)被显示。其他点以此类推。