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

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

[复制链接]
goodboy3021 发布时间:2011-4-12 20:27
LCD的驱动不像LED那样,加上电压(LED实际上是电流驱动)就可以长期显示的。
1 e" j5 u5 G0 ]. h6 W! bLCD驱动必须使用交流电压驱动才能保持稳定的显示,如果在LCD上加上稳定的直流电压, 6 F; u/ C1 u8 q& c
不但不能正常显示,时间久了还会损坏LCD。一段LCD由背电极和段电极组成,需要显示时,
; _; K2 r$ h+ m, ?, W, i在背电极和段电极之间加上合适的交流电压(通常使用方波)。为了调节对比度,可以
  S5 f+ V: q( l9 L8 k7 |调节方波中每半个周期中显示的时间(即占空比)来实现。
" X' {- |1 a7 }% R- Q
* s7 a: ^+ }6 [4 P( d1 s1 C5 f* ^    通常,为了节约驱动口,将多个背电极连在一起,形成公共背电极端:COM。 & N+ |7 H% f7 }9 `
另外,再将属于不同COM的段电极连接在一起,形成公共段电极端:SEG。当在某个COM和
% F+ o" c8 q* O4 s4 o7 G( q某个SEG之间加了足够的交流电压之后,就会将对应的段点亮(实际上是变黑)。
' I9 Z8 D9 O. l/ D7 M# S0 A4 j! s' V$ f& }* V- E' y* V% A1 {
    像万利的板子上使用的这种LCD,有4个COM,还有16个SEG。要想某一SEG显示时, " l# d0 I5 z- B  H1 i& ^
需要在对应的SEG和COM之间加上足够的交流电压。在万利的板子上,COM驱动使用了两个 2 r5 q& Z$ u1 p+ Q2 n  Z, g) ^1 E
电阻分压,输出电压为1/2Vcc,当不想让某位显示时,就将它的电压设置为1/2Vcc(通过 1 i4 t$ _4 g& }. M
设置IO口为高阻态来完成),这样加在对应的SEG和COM之间的电压只有1/2Vcc,不足以 6 T& {8 k& W2 ]
点亮对应的SEG。需要显示的,就将COM电压设置为0或者1,这样SEG电压跟COM电压相反的 + O8 l( X; R! r/ a2 e% O/ d9 ?
段就被点亮了(变黑),因为它们之间的电压为Vcc。通过定期扫描每个COM,即可稳定的 8 }4 c, E6 A2 D: A% g0 }; W7 X
在LCD上显示需要的图形了。需要显示字符或者数字时,自己先将对应的图案设计好,
$ Q2 O7 T# V7 v' A! E0 R* w在显示时,发送到相应的SEG和COM上即可。但是如果使用100%的时间都驱动的话,会造成 / B4 q8 c2 s% `) H; P( a) b0 v
对比度太高,甚至出现不该显示的地方也显示了。因此在显示一段时间后,就将COM和SEG都 ' H7 A$ e* E# a% n, P* j
设置为低,以关闭它的显示,降低对比度。通过调节关闭时间的长短(PWM),可以调节 # V& I+ V+ S! b' l6 O! ?3 f
对比度。在下面的测试程序中,为了简化程序,使用了50%固定的占空比。
2 b" \& _2 i, Y) j, L7 v  i
/ p, b) ~, s, }" v. d, W5 L    为了方便描述,我们把COM为低电平时点亮叫做正亮,COM为高电平时点亮叫做负亮。
8 T2 W1 n) X+ D4 {扫描每个COM分成4个阶段:正亮,关闭,负亮,关闭。因此对于本板子上的LCD驱动, . A# P5 k& k" @7 k. o" \; c
总共有16个状态,每个COM都有上面所说的4个状态。我们每隔2ms就切换一次状态,这样
" N  k7 S; m" K整个扫描周期就是2*16=32ms,基本上感觉不到闪烁。 ! }2 q* j% f4 }+ @! u; |+ i, q$ V
: i* H; H) x2 O
    但是需要注意的是,这个LCD中的每个COM并不是刚好对应着显示图案中的一个字符的位置。 ' g& `8 s5 S) m9 h
每个COM都对应着每个显示字符中的相同4段!换句话说,要显示第一个字符位置的字符,每个 . l9 `' p3 Z+ }1 M4 p- @% h# a2 x
COM都要被用到。因此,要改变某个字符位置的显示,就需要改变每次COM输出时对应的SEG中   g% p* q4 C# x( x: Z! f
的4段。为此,建立一个缓冲区,当需要修改显示字符时,就修改缓冲区中的内容。这个缓冲区
" d! y2 ]4 o0 O' P& b有4行,每行中有16个SEG,对应着一个COM。需要修改显示时,把每行中对应的4个SEG设置为
: c* o# e5 S. F需要的值,这样就实现了某个显示位置图案的修改。
( E0 _( Q& k7 K" G$ ~4 N+ T
5 x3 T- G( p+ L/ c    为了显示字符,需要事先把需要显示的字符按照SEG和COM的分布,制作成数据保存起来, " z  E  K& l! W) }8 B  |1 a
需要显示时,就把它复制到显示缓冲区中对应的位置去。另外,由于输入的参数是字符的ASCII码,
- f7 O4 Y& K' N4 \因此还需要将ASCII码转换为对应的字符图案的索引值。使用一个专门的函数来完成这些转换和 * @& q- M- J' j/ y% f, \
填充缓冲区,在需要修改显示数据时,就调用该函数。 ' m& O  T3 X) }0 s$ N
2 R# N- A5 |( i5 o1 e
    为了方便大家对这个LCD的驱动方式和编程,下面简单的画一下驱动的波形图。
. X4 w9 b! b. E( S( ~& n& w8 c& k9 g; E& s2 B2 J& H( h
 ) o) i8 |* ?. _% k/ G) r

+ d1 z1 h2 _" Z9 _3 D% [6 r& }* l! F驱动波形 (原文件名cdDriver.GIF) / o3 g9 T+ [% z0 z. A
2 _  O) @+ n% C6 t0 O6 e/ t; k* N8 f
    这里只画出2个SEG波形图,实际有16个SEG,只要你理解了2个SEG的,那么16个的也是一样的意思。 - K2 ^; m! ], T8 [/ d, `
如图所示,所有偶数阶段都是关闭显示阶段,这时COM和SEG都是0,将不会有段被点亮,通过调节关闭
  B+ K- D1 D' X显示阶段所占的时间百分比,即可调节总体显示的对比度。SEG和COM之间电平相差1格的显示不出来或者 $ o( j6 {4 {- h$ {, M3 M
浓度不够,而SEG和COM之间电平相差2格的则可以显示出来或者浓度较深。例如第一阶段中的SEG1和COM1 5 I4 d3 ^& N! \& G# c% ?
之间相差2格,第三阶段中COM1和SEG1相差2格,因而SEG1和COM1之间的交叉点(即点1)被显示。又如 7 m8 E) X, u8 W* @
第九阶段的SEG1和COM3之间相差2格,第十一阶段中的COM3和SEG1之间相差2格,因而SEG1和COM3之间的 + V" O, y& V& Y$ t
交叉点(即点5)被显示出来。其它点以此类推。
3 p6 r  A4 \* m/ F; L9 [# Y4 Q& P/ i' Z+ S
    最后,再来看看万利板子上的LCD的COM和SEG之间的关系图,如下图所示。 ; D+ ^& i1 `" c

: ^3 O2 `6 l$ q+ _/ X 
( E6 [" F, m' A8 d. M7 y/ ] + j, e' Z9 f% W6 a
段码分布 (原文件名cdDriver1.GIF) 9 V, `; `( ~: q8 y6 b9 |

7 f) @6 y2 C% Q  U. a* x
! d! G( B# I' ~" }0 j    图中显示,S0、S1、S2、S3属于第一个字符,在显示第一个字符时,只要在对应的COM选中时,
; j4 ?: a! T3 }/ |' y5 a将需要显示的SEG放在上面即可。其余几个字符类似。例如要显示一个数字3,则应该将A段、B段、C段、D段、G段、K段显示。
, Y4 V; j. v4 j- s, k某段显示,用1表示,不显示用0表示,得到的各段值如下: : X9 j5 U) G' w6 f# I6 T2 W
X=0 I="0" A="1" DP="0"
6 g9 B; ]- N, X1 C) ~8 u& V+ {$ {F=0 H="0" J="0" B="1"
2 u! {9 U. D; H# @E=0 G="1" K="1" C="1" , V6 q( k' v6 o, U1 c' S. O
L=0 M="0" N="0" D="1"
! n( I( ^# c- x6 N& k注意是低位在先的,把每行用十六进制来表示(高位在先),就是0x4,0x8,0xE,0x8。它们分别对应着
: V# ~/ n1 u, g. M) O# DCOM1~COM3选中时S3~S0的输出值。为了方便管理,将这4个十六进制值合并为一个2字节的值0x48E8保存。 & D( ^1 \# z5 w0 e! I: e6 ]- f
其它各字符的构造方式相同。显示时,分别取出各段的值写入到对应的缓冲区去。 / F* B0 k# x& _- V( P' b$ Y

: P) z2 B/ g/ p2 W扫描LCD的程序流程如下: " P- @- u( i& O0 P) ]& g7 e5 F! Q" ^$ G( p
①、COM1设置为低电平,其余COM为1/2高电平,设置PE口为需要的电平(16个段码),延时2ms; 0 n7 N9 G- J. l
②、4个COM、PE口均设置为低电平,关闭显示,延时2ms;
; N6 A2 m# M$ Q③、COM1设置为高电平,其余COM为1/2高电平,设置PE口为需要的电平(第一步16个段码的取反),延时2ms。 $ \$ j# Y6 m8 s6 J* m# g' R4 |
④、4个COM、PE口均设置为低电平,关闭显示,延时2ms;
& Z' \4 G3 ^5 L  k, ~  k然后对剩下的3个COM重复前面4个步骤,这样一个完整的扫描就完成了。
6 [4 j1 {. d, Y+ |! q% \2 Y4 y/ t+ Z4 n2 U1 {
具体的实现代码比较长,这里就不再贴出了,在工程包中的LCD.C中可以查看。该测试工程包使用软件延时的 " {8 I; v+ `8 w8 H0 ?
方法来实现LCD的扫描,实际使用时,可以将扫描代码放在定时器中断中处理。该测试程序使用一个时钟功能来
: J% Q% M( s, [演示LCD的显示,显示为xx分xx秒。从这里下载整个测试的工程包(不下载的也可以去帮忙看看、顶一下,谢谢):
. j* [: C, c, M5 q* R8 Jhttp://blog.ednchina.com/computer00/142101/message.aspx
- a( T7 n9 C$ ?- O) g
# d8 y: p7 E' K" Q9 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 手机版