LED数码管的驱动是比较简单也容易理解的,多位数码管一般是LED阵列的形式,每个数字使用一个公共端,不同数字的对应同笔段使用一个控制端;驱动采用分时扫描没个数字位,动态显示。但是LED比较费电,我想做一个用电池供电的钟,用发光管电池就撑不了多久了。于是我考虑用液晶。 |
这是我的程序:(因为刚刚开始用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, 1< ldi r16, 1< ldi r16, 1< ldi r16, 31 sts OCR2A, r16 ; preset compare A ldi r16,1< ldi r16, 1< ldi r16, 1< 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, (1< clr r2 iniw:sleep dec r2 brne iniw ldi r16, (1< 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 reti calcor: ; translate R10~~R13 to R5~~R8 clr r5 clr r6 clr r7 clr r8 ldi ZH, high(table<<1) ldi ZL, low(table<<1) add ZL, r10 lpm ; load table da rcall filler ldi ZL, low(table<<1) add ZL, r11 lpm rcall filler ldi ZL, low(table<<1) add ZL, r12 lpm rcall filler ldi ZL, low(table<<1) add ZL, r13 lpm rcall filler ret filler: rol r0 rol r5 rol r0 rol r5 rol r0 rol r6 rol r0 rol r6 rol r0 rol r7 rol r0 rol r7 rol r0 rol r8 rol r0 rol r8 ret |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< 1f 1a 2f 2a 3f 3a 4f 4a > -- ---- COM1
< 1g 1b 2g 2b 2g 3b 4g 4b > -- ---- COM2
< 1e 1c 2e 2c : 3e 3c 4e 4c > -- ---- COM3
1d 1h 2d 2h 3d 3h 4d -- ---- COM4
其中 12,13,14,15 是4个公共端; 2,3控制第一个数字; 4,5第二个; 7,8第三个; 9,10第四个。
############################################################
前年,有一个家用热水器控制项目,硬件与软件是分开搞的.为了省成本,硬件工程师不用专用液晶驱动IC,把我搞得够呛.整个项目20天时间,光液晶驱动程序用去了10多天.
I/O端口SEG与COM口分别串接一只电阻,再并联一只电阻到地,
这样,对液晶来讲,I/O口是电源/地,定时改变SEG/COM的H/L电平,相当于1/2VCC的交流信号.
当SEG/COM同时为H或L电平时,对液晶来讲,都是关,SEG/COM电平不等时,段码就能显示出来.
明白了这个道理,用C语言写出来不难.
推荐阅读最新更新时间:2024-03-16 15:11