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

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

[复制链接]
goodboy3021 发布时间:2011-4-12 20:27
LCD的驱动不像LED那样,加上电压(LED实际上是电流驱动)就可以长期显示的。 # M* T$ _0 z: I+ b
LCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压,
" i( c& v4 g7 v6 Y% M不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时,   \# h, u9 v+ X$ H
在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以 7 K# k% B; X- R4 {- w/ z9 G
调节方波中每半个周期中显示的时间(即占空比)来实现。
5 B. b" a" q; I& k+ w7 @3 h9 I4 ~1 l; F) J& Q' D
    通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。 & n$ p; y; p5 R: ]& l8 J& J4 w
另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和
! L9 h, `# e$ J# [+ k7 X5 u某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑)。
$ I5 @: C: \1 N7 O% u  k/ D3 D3 D0 F( t/ p- Q( x# W
    像万利的板子上使用的这种LCD,有4个COM,还有16个SEG。要想某一SEG显示时,
2 Q& p: i4 j  M需要在对应的SEG和COM之间加上足够的交流电压。在万利的板子上,COM驱动使用了两个 / ^# i; |" O- A1 r) ]
电阻分压,输出电压为1/2Vcc,当不想让某位显示时,就将它的电压设置为1/2Vcc(通过
6 B$ R( h1 b- F, L设置IO口为高阻态来完成),这样加在对应的SEG和COM之间的电压只有1/2Vcc,不足以
0 Q" p8 k) _5 e/ ^+ v点亮对应的SEG。需要显示的,就将COM电压设置为0或者1,这样SEG电压跟COM电压相反的
! |9 A( _! }3 c' z7 w: S段就被点亮了(变黑),因为它们之间的电压为Vcc。通过定期扫描每个COM,即可稳定的 % N" X2 f9 k" A3 s- R  ~; M
在LCD上显示需要的图形了。需要显示字符或者数字时,自己先将对应的图案设计好,
/ H+ V6 V) w4 i; M$ X3 R在显示时,发送到相应的SEG和COM上即可。但是如果使用100%的时间都驱动的话,会造成 6 ^1 @+ n( b% _% M8 ], D: ?# k
对比度太高,甚至出现不该显示的地方也显示了。因此在显示一段时间后,就将COM和SEG都 / N; g/ p9 f) P  e
设置为低,以关闭它的显示,降低对比度。通过调节关闭时间的长短(PWM),可以调节 5 o& Y1 x+ x* l7 C
对比度。在下面的测试程序中,为了简化程序,使用了50%固定的占空比。 7 f- f' z3 Q4 h

/ y9 d# E+ }* @$ u    为了方便描述,我们把COM为低电平时点亮叫做正亮,COM为高电平时点亮叫做负亮。 ; J9 x! Q8 [5 k' ~: y8 w! e4 Y! C
扫描每个COM分成4个阶段:正亮,关闭,负亮,关闭。因此对于本板子上的LCD驱动,
* L: c% q. ^; r: X/ o2 B' e# {6 g总共有16个状态,每个COM都有上面所说的4个状态。我们每隔2ms就切换一次状态,这样 # v& [# ]* \/ B8 y$ k, T+ L9 Y
整个扫描周期就是2*16=32ms,基本上感觉不到闪烁。
2 ], T. e' a; ~; a( Z; `0 l: N' X. a' r# X0 p' l- L8 ?
    但是需要注意的是,这个LCD中的每个COM并不是刚好对应着显示图案中的一个字符的位置。
& B9 Y' a. C8 e! y3 _! {每个COM都对应着每个显示字符中的相同4段!换句话说,要显示第一个字符位置的字符,每个 : _, p; U2 K1 T( a% |) `: e7 o! K
COM都要被用到。因此,要改变某个字符位置的显示,就需要改变每次COM输出时对应的SEG中 1 e- `) r: M2 }$ ^. A" V
的4段。为此,建立一个缓冲区,当需要修改显示字符时,就修改缓冲区中的内容。这个缓冲区 $ Y& E5 H, M3 i. P. v! ^
有4行,每行中有16个SEG,对应着一个COM。需要修改显示时,把每行中对应的4个SEG设置为 # p" v) ~9 D1 G* o
需要的值,这样就实现了某个显示位置图案的修改。
8 }4 c* `% i6 T, y9 s% T- C( m: q! `( ^% e( J# T; U
    为了显示字符,需要事先把需要显示的字符按照SEG和COM的分布,制作成数据保存起来,
! V0 w+ m5 _4 Q& k需要显示时,就把它复制到显示缓冲区中对应的位置去。另外,由于输入的参数是字符的ASCII码, ' Y: l; d4 v1 S! X3 E* k- i
因此还需要将ASCII码转换为对应的字符图案的索引值。使用一个专门的函数来完成这些转换和 $ ^4 O: f& t+ [9 J. y' s
填充缓冲区,在需要修改显示数据时,就调用该函数。 5 V( E) u7 a9 X6 w- u+ D; x. o/ ^

! x% j6 K8 X: e5 @) ]6 [& R$ o    为了方便大家对这个LCD的驱动方式和编程,下面简单的画一下驱动的波形图。 8 ?- ~2 }; J2 y

& f* k+ \  m) [* O* j ' E- X! w! q8 t) I
. C: X$ {9 i' j" t( ^
驱动波形 (原文件名cdDriver.GIF) 
! x2 J& _' m) u$ Y2 B1 H7 f$ @9 w; D% s/ W% V0 K( d$ ~
    这里只画出2个SEG波形图,实际有16个SEG,只要你理解了2个SEG的,那么16个的也是一样的意思。 ; y, S" P2 I9 \
如图所示,所有偶数阶段都是关闭显示阶段,这时COM和SEG都是0,将不会有段被点亮,通过调节关闭 . l+ y$ r& y4 L9 {7 ]+ u
显示阶段所占的时间百分比,即可调节总体显示的对比度。SEG和COM之间电平相差1格的显示不出来或者
; j0 Z0 f# j2 u; q  w浓度不够,而SEG和COM之间电平相差2格的则可以显示出来或者浓度较深。例如第一阶段中的SEG1和COM1
* ~/ C% Q9 {* N. W* D5 [' k之间相差2格,第三阶段中COM1和SEG1相差2格,因而SEG1和COM1之间的交叉点(即点1)被显示。又如
( Z+ V3 G; G* J! `! y% d+ ^! V第九阶段的SEG1和COM3之间相差2格,第十一阶段中的COM3和SEG1之间相差2格,因而SEG1和COM3之间的
, z0 J8 v7 A% A! S& z# J4 P4 Z- M5 h/ H! l交叉点(即点5)被显示出来。其它点以此类推。
- [9 d8 O4 g8 `' f
2 s% _( L* n, S4 a    最后,再来看看万利板子上的LCD的COM和SEG之间的关系图,如下图所示。 ' a2 |: `$ e1 h

# n+ F$ R, K% I/ r* {* J  d4 u 
8 e( i" X2 ]# p: I
8 s) S! Y+ W& N* k1 ^5 d5 t段码分布 (原文件名cdDriver1.GIF) 
0 G! J" M4 T. |  ^) B& E% y* Q# u! {1 I
1 {& g) _+ E: f5 ~5 m! g
    图中显示,S0、S1、S2、S3属于第一个字符,在显示第一个字符时,只要在对应的COM选中时,
8 K  F5 X9 y, u1 {: L, a  d0 `2 z将需要显示的SEG放在上面即可。其余几个字符类似。例如要显示一个数字3,则应该将A段、B段、C段、D段、G段、K段显示。 / }4 p7 p8 e5 a4 f* W5 S) |! x
某段显示,用1表示,不显示用0表示,得到的各段值如下:
" B% S9 T* Q, Z+ {X=0 I="0" A="1" DP="0" # k  V4 L4 M9 ?( ]/ M) Y1 w6 Y, F# u
F=0 H="0" J="0" B="1"
. r7 A1 _' V: ^0 s! N2 c3 mE=0 G="1" K="1" C="1"
, l7 U3 ?2 O$ b- z) v- aL=0 M="0" N="0" D="1"
7 m6 K' a0 _! j1 j1 _注意是低位在先的,把每行用十六进制来表示(高位在先),就是0x4,0x8,0xE,0x8。它们分别对应着 % N, \9 x6 w+ j* E
COM1~COM3选中时S3~S0的输出值。为了方便管理,将这4个十六进制值合并为一个2字节的值0x48E8保存。
& @% P1 O/ j* o* [- g其它各字符的构造方式相同。显示时,分别取出各段的值写入到对应的缓冲区去。 # f1 h  m' Y1 ?& M" ~

  d: j! \; Z1 H% I$ c: `# r扫描LCD的程序流程如下: 2 B3 q; F+ Y2 M
①、COM1设置为低电平,其余COM为1/2高电平,设置PE口为需要的电平(16个段码),延时2ms; # J) W1 R0 m0 E4 V. [
②、4个COM、PE口均设置为低电平,关闭显示,延时2ms; 9 U  y; b! C9 L9 E. {
③、COM1设置为高电平,其余COM为1/2高电平,设置PE口为需要的电平(第一步16个段码的取反),延时2ms。
0 k% A  N7 f/ R+ j* g2 ?% ]  S2 U④、4个COM、PE口均设置为低电平,关闭显示,延时2ms;
- n: D7 Y5 f' l% k) J然后对剩下的3个COM重复前面4个步骤,这样一个完整的扫描就完成了。
7 y. `2 @- ?. ]2 L5 L3 @1 m" n, Y1 T
具体的实现代码比较长,这里就不再贴出了,在工程包中的LCD.C中可以查看。该测试工程包使用软件延时的
' }/ w1 D# a6 I方法来实现LCD的扫描,实际使用时,可以将扫描代码放在定时器中断中处理。该测试程序使用一个时钟功能来
! T, @! C3 \. n6 {演示LCD的显示,显示为xx分xx秒。从这里下载整个测试的工程包(不下载的也可以去帮忙看看、顶一下,谢谢): , s' P% W* ?) f% d
http://blog.ednchina.com/computer00/142101/message.aspx # P- C; h# ?# w* x

4 p* }% D6 \% `* o( ?" v 
赞 收藏 评论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 手机版