你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

万利的STM32学习板上的LCD(无驱动段式玻璃片式)驱动原理及编程实现

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

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

    像万利的板子上使用的这种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分成4个阶段:正亮,关闭,负亮,关闭。因此对于本板子上的LCD驱动,
总共有16个状态,每个COM都有上面所说的4个状态。我们每隔2ms就切换一次状态,这样
整个扫描周期就是2*16=32ms,基本上感觉不到闪烁。

    但是需要注意的是,这个LCD中的每个COM并不是刚好对应着显示图案中的一个字符的位置。
每个COM都对应着每个显示字符中的相同4段!换句话说,要显示第一个字符位置的字符,每个
COM都要被用到。因此,要改变某个字符位置的显示,就需要改变每次COM输出时对应的SEG中
的4段。为此,建立一个缓冲区,当需要修改显示字符时,就修改缓冲区中的内容。这个缓冲区
有4行,每行中有16个SEG,对应着一个COM。需要修改显示时,把每行中对应的4个SEG设置为
需要的值,这样就实现了某个显示位置图案的修改。

    为了显示字符,需要事先把需要显示的字符按照SEG和COM的分布,制作成数据保存起来,
需要显示时,就把它复制到显示缓冲区中对应的位置去。另外,由于输入的参数是字符的ASCII码,
因此还需要将ASCII码转换为对应的字符图案的索引值。使用一个专门的函数来完成这些转换和
填充缓冲区,在需要修改显示数据时,就调用该函数。

    为了方便大家对这个LCD的驱动方式和编程,下面简单的画一下驱动的波形图。

 

驱动波形 (原文件名cdDriver.GIF) 

    这里只画出2个SEG波形图,实际有16个SEG,只要你理解了2个SEG的,那么16个的也是一样的意思。
如图所示,所有偶数阶段都是关闭显示阶段,这时COM和SEG都是0,将不会有段被点亮,通过调节关闭
显示阶段所占的时间百分比,即可调节总体显示的对比度。SEG和COM之间电平相差1格的显示不出来或者
浓度不够,而SEG和COM之间电平相差2格的则可以显示出来或者浓度较深。例如第一阶段中的SEG1和COM1
之间相差2格,第三阶段中COM1和SEG1相差2格,因而SEG1和COM1之间的交叉点(即点1)被显示。又如
第九阶段的SEG1和COM3之间相差2格,第十一阶段中的COM3和SEG1之间相差2格,因而SEG1和COM3之间的
交叉点(即点5)被显示出来。其它点以此类推。

    最后,再来看看万利板子上的LCD的COM和SEG之间的关系图,如下图所示。

 

段码分布 (原文件名cdDriver1.GIF) 


    图中显示,S0、S1、S2、S3属于第一个字符,在显示第一个字符时,只要在对应的COM选中时,
将需要显示的SEG放在上面即可。其余几个字符类似。例如要显示一个数字3,则应该将A段、B段、C段、D段、G段、K段显示。
某段显示,用1表示,不显示用0表示,得到的各段值如下:
X=0 I="0" A="1" DP="0"
F=0 H="0" J="0" B="1"
E=0 G="1" K="1" C="1"
L=0 M="0" N="0" D="1"
注意是低位在先的,把每行用十六进制来表示(高位在先),就是0x4,0x8,0xE,0x8。它们分别对应着
COM1~COM3选中时S3~S0的输出值。为了方便管理,将这4个十六进制值合并为一个2字节的值0x48E8保存。
其它各字符的构造方式相同。显示时,分别取出各段的值写入到对应的缓冲区去。

扫描LCD的程序流程如下:
①、COM1设置为低电平,其余COM为1/2高电平,设置PE口为需要的电平(16个段码),延时2ms;
②、4个COM、PE口均设置为低电平,关闭显示,延时2ms;
③、COM1设置为高电平,其余COM为1/2高电平,设置PE口为需要的电平(第一步16个段码的取反),延时2ms。
④、4个COM、PE口均设置为低电平,关闭显示,延时2ms;
然后对剩下的3个COM重复前面4个步骤,这样一个完整的扫描就完成了。

具体的实现代码比较长,这里就不再贴出了,在工程包中的LCD.C中可以查看。该测试工程包使用软件延时的
方法来实现LCD的扫描,实际使用时,可以将扫描代码放在定时器中断中处理。该测试程序使用一个时钟功能来
演示LCD的显示,显示为xx分xx秒。从这里下载整个测试的工程包(不下载的也可以去帮忙看看、顶一下,谢谢):
http://blog.ednchina.com/computer00/142101/message.aspx

 
收藏 评论1 发布时间:2011-4-12 20:27

举报

1个回答
泉水叮咚-257423 回答时间:2011-4-26 10:48:09

RE:万利的STM32学习板上的LCD(无驱动段式玻璃片式)驱动原理及编程实现

说的很详细,就是图片看不到

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版