微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机引脚直接驱动LCD

单片机引脚直接驱动LCD

时间:11-18 来源:互联网 点击:

封装形式不适合DIY。Microchip有一款PIC16F913, 有28DIP的封装,看上去正合适。暂时不知道价格,我先找来它的手册看看。详细看了LCD驱动模块的部分,我发现PIC16F913也只有1/2 Bias驱动和1/3 Bias驱动两种选项,分时最多为1/4分时驱动,对于我的屏正好。
1/3 Bias 驱动需要将Vcc--GND之间的电压三等分,一个周期驱动波形示例如下:
COM1: V+ --------
2/3 --------
1/3 --------
GND --------
COM2: V+ --------
2/3 --------
1/3 --------
GND --------
SEG1: V+ --------
2/3 --------
1/3 --------
GND --------
SEG2: V+ --------
2/3 --------
1/3 --------
GND --------
在 (COM1,SEG1) 笔段上,电压为 +1, -1/3, -1, +1/3 ... 在(COM1,SEG2)上为 +1/3, +1/3, -1/3, -1/3 ... 在(COM2,SEG1)上:+1/3, +1/3, -1/3, -1/3 ... 在(COM2,SEG2)上:-1/3, +1, +1/3, -1 ...
于是计算平均功率,在 (COM1,SEG1)和(COM2,SEG2)上面是 2*1^2+2*(1/3)^2=20/9 在(COM1,SEG2)和(COM2,SEG1)上面是 4*(1/3)^2=4/9, 两者之比 5:1
假如不是上图的 1/2 分时驱动而是 1/4 分时驱动,这个比例将变为
2*1^2+6*(1/3)^2 vs 8*(1/3)^2 = 3:1
若将原来的 1/2 Bias 改用 1/3 Bias 驱动,对于我的LCD屏这个比值从 7:3 改善为 3:1 了。既然PIC16F913只设计了 1/2 Bias与1/3 Bias,用起来应该问题不大。
AVR单个I/O口要实现4种电压输出——不可能吧,我是想不出来了。AVR最多只有三种电压输出,能不能对这个电压再做等分呢?一番思索之后我想这样行不行:就4等分吧.
COM1: V+ --------
3/4
1/2 -------- --------
1/4
GND --------
COM2: V+ --------
3/4
1/2 -------- --------
1/4
GND --------
SEG1: V+
3/4 -------- ---------
1/2
1/4 ----------------
GND
SEG2: V+
3/4 ----------------
1/2
1/4 -------- ---------
GND
我的做法就是 SEGx 输出有两种:3/4*Vcc 和 1/4*Vcc, 而 COMy 输出有三种:Vcc, GND, 1/2*Vcc. 对于每个I/O口,并不需要4种电压输出。当然这样跟1/3 Bias驱动是不一样的,但是却达到了 1/3 Bias 驱动的效果,只不过加在液晶笔段上的电压绝对值最大不是 Vcc 而是 3/4*Vcc 了,因此电源电压也需要提高。这里计算省略。
这种驱动方式我称之为 "伪1/3 Bias驱动". 对于 COMy 的处理和前面一样,对于 SEGx, 将I/O输出电压改变一下,高电平3/4*Vcc, 低电平1/4*Vcc就好了。我的做法是:
/-------------- I/O Port pin
|
[ ]
[ ] 1Meg
[ ]
|
to LCD SEGx --------------+
|
[ ]
[ ] 1Meg
[ ]
|
|
1/2 Vcc
这里的 1/2 Vcc 可以将电源电压用电阻分压得到,我想的办法是直接接个几uF电容到GND, 实验是成功的。因为随着扫描的进行,这个地方的平均电压是输出高电平和低电平的一半。
目前我做了一个Mega48V的秒计数器,再改改就能把钟做出来了。

 
这是我的程序:(因为刚刚开始用AVR,从最简单的开始,就直接用汇编了)
Timer2用外接32768晶振提供时钟,整个系统耗电大约30微安。
; lcddisplay.asm
; Test raw LCD display
.include "m48def.inc"
.org 0x0000
rjmp start
.org OC2Aaddr
rjmp isr_timer2
.org 0x0020
table:
.DB 0b11101101, 0b00101000, 0b10110101, 0b10111001
.DB 0b01111000, 0b11011001, 0b11011101, 0b10101000
.DB 0b11111101, 0b11111001
start:
ldi r16, 1out MCUCR, r16 ; disable all I/O pull-up
ldi r16, 1ldi r16, 1sts TCCR2A, r16 ; CTC mode
ldi r16, 31
sts OCR2A, r16 ; preset compare A
ldi r16,1; ldi r16,1sts TCCR2B, r16
ldi r16, 1out TIFR2, r16 ; clear flag
ldi r16, 1sts TIMSK2, r16 ; enable interrupt on compare match A
ser r16
out DDRD, r16 ; Port D output -- LCD segment control
clr r5
ldi r16, 0x55
mov r6, r16
clr r7
clr r8
ldi r16, 9
mov r10, r16
mov r11, r16
mov r12, r16
mov r13, r16
dec r10
sei ; enable global interrupt
ldi r16, (1out SMCR, r16 ; use Idle mode here, waiting 1 second
clr r2
iniw:sleep
dec r2
brne iniw
ldi r16, (1out SMCR, r16 ; use power-save mode
nop
nop
clr r2
loop:
nop
nop
sleep
nop
nop
dec r2
dec r2
breq adjtime
rjmp loop
adjtime:
ldi r17, 10
inc r10
cp r10, r17
brne updcount
clr r10
inc r11
cp r11, r17
brne updcount
clr r11
inc r12
cp r12, r17
brne updcount
clr r12
inc r13
cp r13, r17
brne updcount
clr r13
updcount:
rcall calcor
rjmp loop
isr_timer2:
clr r16
out DDRC, r16 ; float all COMx pins
bst r4, 1
brts show34
bst r4, 0
brts show2
mov r0, r5
ldi r18, 1
rjmp sel
show2:
mov r0, r6
ldi r18, 1<1
rjmp sel
show34:
bst r4, 0
brts show4
mov r0, r7
ldi r18, 1<2
rjmp sel
show4:
mov r0, r8
ldi r18, 1<3
sel:
bst r4, 2
brtc lcden
com r0
com r16
lcden:
out PORTC, r16
out PORTD, r0
out DDRC, r18
iext:inc r4

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top