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

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

[复制链接]
goodboy3021 发布时间:2011-4-12 20:27
LCD的驱动不像LED那样,加上电压(LED实际上是电流驱动)就可以长期显示的。 1 W, ~8 ~* n6 J" v+ S
LCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压,
/ C) |1 n! E/ q不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时,
) b3 _1 V/ F5 b6 `" _& Y; i在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以
6 |- e! V) K% j9 o8 N* w& l: q调节方波中每半个周期中显示的时间(即占空比)来实现。
4 Q! x8 p- U+ e' J6 `& C; ~# s0 h# p, A: a7 Y! I6 ?/ Q
    通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。
" K# L6 {0 c% x4 f  r2 A# U8 k另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和 + g, T0 y# q  ~8 n
某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑)。 4 ~, U" n; S3 o9 i) a) C8 t

4 i' U2 e8 y" t    像万利的板子上使用的这种LCD,有4个COM,还有16个SEG。要想某一SEG显示时, 1 p- T% P2 u9 }8 L/ c" ?
需要在对应的SEG和COM之间加上足够的交流电压。在万利的板子上,COM驱动使用了两个
; U- E, e7 X! I; V: C电阻分压,输出电压为1/2Vcc,当不想让某位显示时,就将它的电压设置为1/2Vcc(通过
7 p2 j9 L& k& K3 C" O设置IO口为高阻态来完成),这样加在对应的SEG和COM之间的电压只有1/2Vcc,不足以
' f. R& ]/ w; h; G% {点亮对应的SEG。需要显示的,就将COM电压设置为0或者1,这样SEG电压跟COM电压相反的
: _* a# w+ U9 |  I段就被点亮了(变黑),因为它们之间的电压为Vcc。通过定期扫描每个COM,即可稳定的 7 N1 j- k0 ~0 b9 {2 B: `0 a% [
在LCD上显示需要的图形了。需要显示字符或者数字时,自己先将对应的图案设计好, 3 s: A& p6 {, x2 ~# v
在显示时,发送到相应的SEG和COM上即可。但是如果使用100%的时间都驱动的话,会造成 : O4 [1 p: M# Y+ Q/ [7 y% d0 v
对比度太高,甚至出现不该显示的地方也显示了。因此在显示一段时间后,就将COM和SEG都 $ O6 ~5 c( e  f' N& Z+ e
设置为低,以关闭它的显示,降低对比度。通过调节关闭时间的长短(PWM),可以调节
4 {+ z7 ^4 P' @- X对比度。在下面的测试程序中,为了简化程序,使用了50%固定的占空比。 / Q9 X3 Q# \4 v
6 X% Y+ o4 [1 N6 K: ^; Y" T
    为了方便描述,我们把COM为低电平时点亮叫做正亮,COM为高电平时点亮叫做负亮。 4 w4 i. b7 ]5 V3 x$ _
扫描每个COM分成4个阶段:正亮,关闭,负亮,关闭。因此对于本板子上的LCD驱动, 0 F# o8 |0 I& l  t& l9 w# L: A/ i
总共有16个状态,每个COM都有上面所说的4个状态。我们每隔2ms就切换一次状态,这样   Y" o6 i/ F: D% o. c, i
整个扫描周期就是2*16=32ms,基本上感觉不到闪烁。 5 z' ]$ a8 B5 N: U+ k2 ]
% H1 j! M+ [' D& M+ ^9 I& H8 D
    但是需要注意的是,这个LCD中的每个COM并不是刚好对应着显示图案中的一个字符的位置。
% `( d3 b/ M. O' j; S每个COM都对应着每个显示字符中的相同4段!换句话说,要显示第一个字符位置的字符,每个 / b% n5 K: [8 q1 r% G
COM都要被用到。因此,要改变某个字符位置的显示,就需要改变每次COM输出时对应的SEG中 ( R! ?) c: m  \+ V4 m
的4段。为此,建立一个缓冲区,当需要修改显示字符时,就修改缓冲区中的内容。这个缓冲区
# w1 G; }  g$ }6 ~- {! h有4行,每行中有16个SEG,对应着一个COM。需要修改显示时,把每行中对应的4个SEG设置为 " u$ c5 z& M5 H- y& V
需要的值,这样就实现了某个显示位置图案的修改。
0 e4 g' d; y; M, k* c0 s4 Y0 u+ g
3 M4 |" c/ c! k, U6 o0 C, a    为了显示字符,需要事先把需要显示的字符按照SEG和COM的分布,制作成数据保存起来, , o6 Z5 _. l& u8 v
需要显示时,就把它复制到显示缓冲区中对应的位置去。另外,由于输入的参数是字符的ASCII码, ; Z9 ]9 j: t: R( {# K$ a! z* p  F, l
因此还需要将ASCII码转换为对应的字符图案的索引值。使用一个专门的函数来完成这些转换和 + Q; q  z5 D5 v( _9 l* ~& @
填充缓冲区,在需要修改显示数据时,就调用该函数。 8 l3 p# V( D( V+ M  D
& k+ W9 o0 h( }" t# E
    为了方便大家对这个LCD的驱动方式和编程,下面简单的画一下驱动的波形图。
$ i; C" \+ t  G" I8 _! k" D8 z- o; C/ |+ M8 M) q
 
. U8 l, L4 j0 c9 Y2 ^
. D9 \: p7 C# y, \* p驱动波形 (原文件名cdDriver.GIF) 
! o( B8 A$ O& W$ |) Y% X. t) Y$ @+ B
& V. i9 h5 m7 R7 r' S' U9 c8 S    这里只画出2个SEG波形图,实际有16个SEG,只要你理解了2个SEG的,那么16个的也是一样的意思。
2 X( C/ k  Z% c. V如图所示,所有偶数阶段都是关闭显示阶段,这时COM和SEG都是0,将不会有段被点亮,通过调节关闭
) [- j$ u( O% |- N5 p8 }显示阶段所占的时间百分比,即可调节总体显示的对比度。SEG和COM之间电平相差1格的显示不出来或者
; N4 k7 X5 g% d9 `! j3 i浓度不够,而SEG和COM之间电平相差2格的则可以显示出来或者浓度较深。例如第一阶段中的SEG1和COM1
* U2 G2 M! Y2 f8 S' ^% C之间相差2格,第三阶段中COM1和SEG1相差2格,因而SEG1和COM1之间的交叉点(即点1)被显示。又如
% E+ c+ C2 v: m第九阶段的SEG1和COM3之间相差2格,第十一阶段中的COM3和SEG1之间相差2格,因而SEG1和COM3之间的 3 }( P+ \& `; T7 N4 P
交叉点(即点5)被显示出来。其它点以此类推。
3 a9 y/ {7 ]2 d0 _3 _: g: H5 \$ c; Q
    最后,再来看看万利板子上的LCD的COM和SEG之间的关系图,如下图所示。
( C- S* Y0 j/ M- W( U% x
( _1 m' a, H$ y1 w9 v1 O4 c% G 
9 H" h$ T- H. O. Z1 \
" ~8 k) B4 I% E# b+ J' ^9 l( S段码分布 (原文件名cdDriver1.GIF) 
: m$ a7 I5 A5 H. i9 F( Z4 a9 V5 S9 [( j% K5 j; L, P
2 L0 F3 S2 ]6 [8 J9 x) O
    图中显示,S0、S1、S2、S3属于第一个字符,在显示第一个字符时,只要在对应的COM选中时,   ?5 N1 V0 U5 g3 B) [/ I# L
将需要显示的SEG放在上面即可。其余几个字符类似。例如要显示一个数字3,则应该将A段、B段、C段、D段、G段、K段显示。
$ g5 H$ d9 F, s3 j某段显示,用1表示,不显示用0表示,得到的各段值如下: 4 O: g4 q6 A( h1 B6 M2 D& J5 m
X=0 I="0" A="1" DP="0" & [6 h4 ]& [0 q0 g0 {0 J- [
F=0 H="0" J="0" B="1" ) m# J( f! {* U% f3 x; d# h0 `
E=0 G="1" K="1" C="1" 3 L* M1 c4 n/ I8 {$ i4 O- J$ a1 [
L=0 M="0" N="0" D="1" ' ~5 c! ]: D8 t  D4 h) N3 j
注意是低位在先的,把每行用十六进制来表示(高位在先),就是0x4,0x8,0xE,0x8。它们分别对应着
2 Y  P2 [" L2 Z' aCOM1~COM3选中时S3~S0的输出值。为了方便管理,将这4个十六进制值合并为一个2字节的值0x48E8保存。 3 d6 z0 b% u- Z
其它各字符的构造方式相同。显示时,分别取出各段的值写入到对应的缓冲区去。 0 e+ W" J" A% v
) J6 h) f8 }# u
扫描LCD的程序流程如下: ( B& L) p5 Q& V' i3 h
①、COM1设置为低电平,其余COM为1/2高电平,设置PE口为需要的电平(16个段码),延时2ms;
. @# x( c6 q: Y& |②、4个COM、PE口均设置为低电平,关闭显示,延时2ms; + l, \' E" p1 B! w" [% J
③、COM1设置为高电平,其余COM为1/2高电平,设置PE口为需要的电平(第一步16个段码的取反),延时2ms。
% `5 \( i! S! o( [0 r! {④、4个COM、PE口均设置为低电平,关闭显示,延时2ms; # w: d. {+ R* r' i
然后对剩下的3个COM重复前面4个步骤,这样一个完整的扫描就完成了。   C8 I9 E4 h) l, i/ f9 N& M

# V( y  L+ ]% J具体的实现代码比较长,这里就不再贴出了,在工程包中的LCD.C中可以查看。该测试工程包使用软件延时的 8 X, |" Q" T4 F+ g
方法来实现LCD的扫描,实际使用时,可以将扫描代码放在定时器中断中处理。该测试程序使用一个时钟功能来 / O. O, \3 R+ s- u( m: B9 i
演示LCD的显示,显示为xx分xx秒。从这里下载整个测试的工程包(不下载的也可以去帮忙看看、顶一下,谢谢): * T- L1 o) u8 J% @8 M4 y3 ]
http://blog.ednchina.com/computer00/142101/message.aspx " Q- o8 F8 C& K' N+ F
; @5 m; M+ s/ V+ p  F3 X5 B  v
 
收藏 评论1 发布时间:2011-4-12 20:27

举报

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

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

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

所属标签

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