單片機引腳直接驅(qū)動LCD
LED數(shù)碼管的驅(qū)動是比較簡單也容易理解的,多位數(shù)碼管一般是LED陣列的形式,每個數(shù)字使用一個公共端,不同數(shù)字的對應(yīng)同筆段使用一個控制端;驅(qū)動采用分時掃描沒個數(shù)字位,動態(tài)顯示。但是LED比較費電,我想做一個用電池供電的鐘,用發(fā)光管電池就撐不了多久了。于是我考慮用液晶。 |
這是我的程序:(因為剛剛開始用AVR,從最簡單的開始,就直接用匯編了) Timer2用外接32768晶振提供時鐘,整個系統(tǒng)耗電大約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, 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控制第一個數(shù)字; 4,5第二個; 7,8第三個; 9,10第四個。
############################################################
前年,有一個家用熱水器控制項目,硬件與軟件是分開搞的.為了省成本,硬件工程師不用專用液晶驅(qū)動IC,把我搞得夠嗆.整個項目20天時間,光液晶驅(qū)動程序用去了10多天.
I/O端口SEG與COM口分別串接一只電阻,再并聯(lián)一只電阻到地,
這樣,對液晶來講,I/O口是電源/地,定時改變SEG/COM的H/L電平,相當(dāng)于1/2VCC的交流信號.
當(dāng)SEG/COM同時為H或L電平時,對液晶來講,都是關(guān),SEG/COM電平不等時,段碼就能顯示出來.
明白了這個道理,用C語言寫出來不難.
評論