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

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

[复制链接]
goodboy3021 发布时间:2011-4-12 20:27
LCD的驱动不像LED那样,加上电压(LED实际上是电流驱动)就可以长期显示的。
4 p. e9 h! r( m, v8 ULCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压,
) ]  v$ k- b) X7 A% J1 x不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时,
( l% L- z4 M0 U$ [) `9 a在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以
& U* L; {8 a$ p' Q5 g; U0 E! n调节方波中每半个周期中显示的时间(即占空比)来实现。 . h; a' q, [* C+ B" n) [4 b$ R/ |

- \* r/ K) _2 z1 r$ I+ g    通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。
# t( S: J5 K* L7 Z/ ]0 s$ b% N  X另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和 : f7 a$ Y( c; k; D: [# d0 l
某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑)。
0 `2 [2 f8 V/ `) V
& |1 I4 I. @9 J/ ~% K# o    像万利的板子上使用的这种LCD,有4个COM,还有16个SEG。要想某一SEG显示时, , P3 D3 F( w  M
需要在对应的SEG和COM之间加上足够的交流电压。在万利的板子上,COM驱动使用了两个
0 l  u& r/ y% I" Z电阻分压,输出电压为1/2Vcc,当不想让某位显示时,就将它的电压设置为1/2Vcc(通过
* M. h6 q+ G* p- m0 N5 N9 t. j( {设置IO口为高阻态来完成),这样加在对应的SEG和COM之间的电压只有1/2Vcc,不足以
* e5 T0 L2 X9 B2 O: X点亮对应的SEG。需要显示的,就将COM电压设置为0或者1,这样SEG电压跟COM电压相反的 & c7 l! g$ K9 A
段就被点亮了(变黑),因为它们之间的电压为Vcc。通过定期扫描每个COM,即可稳定的 1 e" }# h5 _: r7 h* h6 [) z& ?
在LCD上显示需要的图形了。需要显示字符或者数字时,自己先将对应的图案设计好, # p! v( u. n6 X' w
在显示时,发送到相应的SEG和COM上即可。但是如果使用100%的时间都驱动的话,会造成 / E3 K, X2 `, v; ^: ~
对比度太高,甚至出现不该显示的地方也显示了。因此在显示一段时间后,就将COM和SEG都 ( P0 o/ W; u- r2 z. B
设置为低,以关闭它的显示,降低对比度。通过调节关闭时间的长短(PWM),可以调节 ) p& O! W/ h8 H) B3 S, Z, b! a* C
对比度。在下面的测试程序中,为了简化程序,使用了50%固定的占空比。
+ J+ ?% b+ N  M! B. t5 [" W3 T
# h7 A8 c% m, g5 C$ n5 c8 w! ]; p    为了方便描述,我们把COM为低电平时点亮叫做正亮,COM为高电平时点亮叫做负亮。 ) g; h% t* g4 B6 m; b
扫描每个COM分成4个阶段:正亮,关闭,负亮,关闭。因此对于本板子上的LCD驱动,
; E- x0 W1 P. y# f6 P, h总共有16个状态,每个COM都有上面所说的4个状态。我们每隔2ms就切换一次状态,这样 ! k- j& [! s9 o' U+ e" H1 d3 x/ e
整个扫描周期就是2*16=32ms,基本上感觉不到闪烁。
. n' }5 C  B! ^; _1 ?% l/ I% U5 d
    但是需要注意的是,这个LCD中的每个COM并不是刚好对应着显示图案中的一个字符的位置。 + A  h) ~1 ^# U9 L# T, t! p" B
每个COM都对应着每个显示字符中的相同4段!换句话说,要显示第一个字符位置的字符,每个 % c2 D" g! s6 B/ a  Y
COM都要被用到。因此,要改变某个字符位置的显示,就需要改变每次COM输出时对应的SEG中 * @" @2 ~% g; `" k
的4段。为此,建立一个缓冲区,当需要修改显示字符时,就修改缓冲区中的内容。这个缓冲区 2 A: A" C# \6 o% I. O
有4行,每行中有16个SEG,对应着一个COM。需要修改显示时,把每行中对应的4个SEG设置为
4 _9 {7 v$ l# h8 [! K" L: w$ D+ w需要的值,这样就实现了某个显示位置图案的修改。
* C0 O$ M8 r. W$ _, J( P0 Q% @6 ^4 _2 ^' s" {, C
    为了显示字符,需要事先把需要显示的字符按照SEG和COM的分布,制作成数据保存起来, . i6 _: f( Z! _2 R' X
需要显示时,就把它复制到显示缓冲区中对应的位置去。另外,由于输入的参数是字符的ASCII码, - c* n$ w% O5 o0 _) C; J4 b
因此还需要将ASCII码转换为对应的字符图案的索引值。使用一个专门的函数来完成这些转换和
) {9 `: N, k+ S2 M; U* y填充缓冲区,在需要修改显示数据时,就调用该函数。
7 U4 f1 d. A" }4 E* T+ `: z8 `4 i
    为了方便大家对这个LCD的驱动方式和编程,下面简单的画一下驱动的波形图。
) l$ T# f; m& r% Q3 q# v* Z( ]3 [, ?% A" a5 [
 
, l* I# h2 o* L0 i4 i; w1 r9 l7 g
: U( i9 w. c0 K/ w驱动波形 (原文件名cdDriver.GIF)   C7 p4 w( l" a! y- x
  m0 y& M  ]+ c3 \0 J
    这里只画出2个SEG波形图,实际有16个SEG,只要你理解了2个SEG的,那么16个的也是一样的意思。 / S6 c( n' T6 ^! L. t$ b" h+ M
如图所示,所有偶数阶段都是关闭显示阶段,这时COM和SEG都是0,将不会有段被点亮,通过调节关闭
3 {6 t6 }9 C5 I9 {; j- c  b& q显示阶段所占的时间百分比,即可调节总体显示的对比度。SEG和COM之间电平相差1格的显示不出来或者
, m6 R3 d# U6 X$ Q: ?* f% p. D浓度不够,而SEG和COM之间电平相差2格的则可以显示出来或者浓度较深。例如第一阶段中的SEG1和COM1 3 I. W: \* w% X9 W( A
之间相差2格,第三阶段中COM1和SEG1相差2格,因而SEG1和COM1之间的交叉点(即点1)被显示。又如 ) `( X8 Z* q  r9 z8 g4 e5 e
第九阶段的SEG1和COM3之间相差2格,第十一阶段中的COM3和SEG1之间相差2格,因而SEG1和COM3之间的 / |1 b2 g0 `, [9 X8 n- C! h* G
交叉点(即点5)被显示出来。其它点以此类推。 % F- A! _, q( E: `0 D: C( i7 x* r% ]
- e4 N8 x0 d- M  p& b
    最后,再来看看万利板子上的LCD的COM和SEG之间的关系图,如下图所示。
/ r3 c7 p8 Z: M5 _+ R- U9 H8 b7 _+ h
" b" ~+ r1 F/ U; Z6 v : ]6 f+ X8 c+ p% b/ D' x

- ^3 @; _* _& @$ K2 E" {  f段码分布 (原文件名cdDriver1.GIF) 
- ]! i0 J' z4 [% Y+ y9 Z8 V2 j+ H: ~7 p1 F% q6 F' U

9 f/ {( m  }8 j/ `% o2 O    图中显示,S0、S1、S2、S3属于第一个字符,在显示第一个字符时,只要在对应的COM选中时, $ q" p3 U' I5 ~% n& x
将需要显示的SEG放在上面即可。其余几个字符类似。例如要显示一个数字3,则应该将A段、B段、C段、D段、G段、K段显示。 2 ^! X* b% Y$ R: W6 d" T6 a- u
某段显示,用1表示,不显示用0表示,得到的各段值如下:
3 K) n6 c/ e9 C$ @0 C) ^X=0 I="0" A="1" DP="0"
. A  a; B6 z7 n/ q' l' hF=0 H="0" J="0" B="1" 9 k- \5 j- B! ~
E=0 G="1" K="1" C="1" - ^) p8 @4 Q: P: M6 c: a- k% ^
L=0 M="0" N="0" D="1" : {1 c+ I" c3 S5 I* P9 Z0 O- V) v
注意是低位在先的,把每行用十六进制来表示(高位在先),就是0x4,0x8,0xE,0x8。它们分别对应着
# k# \5 ]" A) T. WCOM1~COM3选中时S3~S0的输出值。为了方便管理,将这4个十六进制值合并为一个2字节的值0x48E8保存。
! k1 d' b0 G" m4 u+ w! f其它各字符的构造方式相同。显示时,分别取出各段的值写入到对应的缓冲区去。 * J) L+ p( x( G0 A5 r$ C& {, Q8 H

3 \& f7 u" W3 x扫描LCD的程序流程如下:
1 m1 @" P9 O* C6 _) _①、COM1设置为低电平,其余COM为1/2高电平,设置PE口为需要的电平(16个段码),延时2ms; 3 Q1 L  H5 x( f- @
②、4个COM、PE口均设置为低电平,关闭显示,延时2ms; % w# o% \0 J) S2 h
③、COM1设置为高电平,其余COM为1/2高电平,设置PE口为需要的电平(第一步16个段码的取反),延时2ms。
, Z. v  S# I' q% K④、4个COM、PE口均设置为低电平,关闭显示,延时2ms; ) G2 g! m  k9 M. b8 S0 y
然后对剩下的3个COM重复前面4个步骤,这样一个完整的扫描就完成了。 8 G/ X+ O  D# a4 C
5 k% h8 I/ [) I7 a( L$ v) x
具体的实现代码比较长,这里就不再贴出了,在工程包中的LCD.C中可以查看。该测试工程包使用软件延时的
# q. |* V; l" F+ n4 d' x0 g" {方法来实现LCD的扫描,实际使用时,可以将扫描代码放在定时器中断中处理。该测试程序使用一个时钟功能来
1 T& w5 u- u( _7 A演示LCD的显示,显示为xx分xx秒。从这里下载整个测试的工程包(不下载的也可以去帮忙看看、顶一下,谢谢): 9 _! G/ x) ~! G, G% o
http://blog.ednchina.com/computer00/142101/message.aspx
  ]+ @7 {, E: R# a2 Q
4 n# ^, O. m7 L: i2 d 
收藏 评论1 发布时间:2011-4-12 20:27

举报

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

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

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

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版