LED数码管的驱动是比较简单也容易理解的,多位数码管一般是LED阵列的形式,每个数字使用一个公共端,不同数字的对应同笔段使用一个控制端;驱动采用分时扫描没个数字位,动态显示。但是LED比较费电,我想做一个用电池供电的钟,用发光管电池就撑不了多久了。于是我考虑用液晶。 在这边的电子市场我买到一个4位笔段式液晶屏,4个数字最中间有冒号,边上还有几个箭头符号,一共有15个引脚,正合适用AVR来驱动做一个钟。 笔段式LCD屏的结构与LED数码管很相似,但是由于是液晶,工作机理上不同,驱动方式也有很大差异: (1) LED有正负之分,液晶笔划没有。 (2) LED在直流电压下工作,液晶需要交流电压,防止电解效应。 (3) LED需要电流提供发光的能量,液晶笔划显示状态下电流非常微弱。 (4) LED对微小电流不反应,液晶则很敏感。 不难看出,用LED的驱动方式来对待LCD屏是行不通的。我在买回来测试这块屏之前没有意识到,于是走了不少的弯路。与LED驱动不同的是需要给每个笔划加上一个交流电压。一般用30-60Hz的方波就可以了,频率再低显示会有所波动,频率高了功耗也会增加,因为LCD对电路呈现容性。而且,正负电压都可以“点亮”液晶。 好在AVR的I/O口可以三态输出,也就是除了高/低电平,还可以呈现高阻抗,相当于断开连接。于是我想到了这样的办法:不需要显示的那一组笔划对应的公共端悬空(I/O口选择三态),那么就不会加上电压了。照这个思路,我的实验电路焊好,出来的显示却是一团糟:笔划都黑了看不清。我这才考虑到液晶本身的问题:阻抗高,而且有电容,是不可一边悬空的!这个道理也许跟CMOS输入端差不多。查找了一些关于液晶的资料,大致知道LCD屏不是那么简单的,驱动方式通常是1/N, 也就是电压不止高低两档。可是单片机I/O没有那么多输出状态可以选择。 1/2 Bias驱动 不显示的液晶笔划两端电压相等,显示的不等。这样一个要求在扫描方式 下不能满足,于是改为电压等级不同。1/2 Bias驱动就是这样的,如下: COM1 V+ ---- ---- 1/2 ---- ---- ---- ---- GND ---- ---- COM2 V+ ---- ---- 1/2 ---- ---- ---- ---- GND ---- ---- SEG1 V+ -------- -------- 1/2 GND -------- -------- SEG2 V+ ---- -------- ---- 1/2 GND -------- -------- 如此,在 COM1,SEG1 选择的笔划上,加上的电压为 -1/2, -1, +1/2, +1 ... 在 COM1,SEG2 选择的笔划上,加上的电压为 +1/2, -1, -1/2, +1 ... 在 COM2,SEG1 选择的笔划上,加上的电压为 -1, -1/2, +1, +1/2 ...在 COM2,SEG2 选择的笔划上,加上的电压为 0, -1/2, 0, +1/2 ... 计算一下大致的平均功率(如果液晶灰度与电压平方成正比,实际不是这样)前三者是一样的,都是 1+(1/2)^2=5/4, 对于最后一个 0+(1/2)^2=1/4 因此显示的功率比为 5:1, 显示状态会是这样: SEG1 SEG2 : : COM1 - - - O - - - O : : COM2 - - - O - - - x AVR I/O没有能力输出 1/2 Vcc 的电压(ADC在这里就不要考虑了, 浪费I/O还不如用静态液晶屏), 因此没有办法实现真正的 1/2 Bias驱动。但是注意到要提供一个一半电源电压也不是难事,既然AVR I/O口可以三态,我们用两个电阻分压将端口“拉”到1/2 Vcc就好了,于是,1/2 Bias驱动的做法可以这样: Vcc | [ ] [ ] 1Meg [ ] | Port pin-----+------------ to LCD COMx | [ ] [ ] 1Meg [ ] | GND
取电阻 1Meg 是综合耗电与分压效果考虑的。这样在 COMx 就可以产生三种电压值,就达到了1/2 Bias动态驱动的目的。实现起来在前面的基础上增加电阻即可,我的屏有4个公共端,因此用了8个电阻,数字就能够显示出来了。 虽然显示的确做到了,然而效果却不能让我满意。具体表现就是需要正对着LCD屏看才是很清晰的;如果斜着看,就可能一片混浊了,没有达到实用。用2节Ni-MH供电时候正着看没问题,用2节干电池(电压提高一点)就不是很清晰了。如前面的分析,那些没有被选择的笔段其实也加上了变化的电压,只不过与选择的比段相比电压平均有效值低一些。这两个的差异足够显著,才能保证显示效果。 再分析 1/2 Bais 驱动在我的LCD屏上 1/4 分时扫描的结果:一个周期内,“点亮”的笔段平均功率=1^2+(1/2)^2+(1/2)^2+(1/2)^2=7/4, 而没有被“点亮”的笔段为=0+(1/2)^2+(1/2)^2+(1/2)^2=3/4, 两者之比 7:3 跟前面的例子分析对比看出,从 1/2 分时扫描变到 1/4 分时扫描,显出来的笔段和不显的笔段上,电压产生平均功率的对比从 5:1 变到 7:3 了。我尝试从软件上改变扫描时序,也不能改进显示效果,看来 1/2 Bias 不够用的了。 我查了Nokia 3310液晶手册其中对于LCD电压输出时序的描述。恰好里面有一个图,绘出了行和列控制线上的波形。从坐标轴上看出Vlcd和Vss之间另外还有4个电压等级。这么多种电压用AVR I/O实现已经不现实了。 我再考虑选用带有LCD驱动功能的MCU, AVR只有一款ATmega169, |