LCD

Jiri Libra Jiri.Libra
Středa Březen 17 12:02:59 CET 2004


> >nebyl by nekdo ochoten podelit se se mnou o kus kodu pro AVR na ovladani
> >znakoveho LCD displeje v 4-bit. modu? Mam 16x2 s podsvicenim a nemuzu ho
> >rozchodit s 90S2313. Pres paralelni port PC me to chodilo. Asi mam spatny
> >casovani nebo co. Jednak cekam na busy flag a jednak tam mam vsude
spoustu
> >delay a porad se to chova nejak divne.
>
> Co je divne?
> Co brani zaslani inkriminovane casti kodu do konference?
> J. Hanzal

Tak jo, posilam to. Jen jestli se v tom nekdo vyzna. Trosku jsem to
okomentoval.
Mam tam vsude cekaci smycky okomentovany ;*******. Opakuje se 256x, skoro
vsude. Nejlepsi vysledek, jakeho jsem dosahl je ten, ze me to napise ABCD,
ale mezi pismankama jsou mezery, ktery jsem tam neposlal. Kdyz tu smycku
zkratim, chova se to divne.
Jedu na 12MHz, DB7-DB4 displeje je na PB7-BP4 90s2313ky, E je na PB3, R/W na
PB2 a RS na PB1.
Diky
Jirka
=======================================
.include "2313def.inc"
.org $000 ; tabulka vektoru preruseni

 rjmp RESET ; reset handler

.org $00b

.def temp=R16
.def A=R17
.def cnt=R18
.def l=R19
.def B=R20

RESET:
 ;-------------------------
 ldi r16,low(RAMEND)
 out SPL,r16

 ser temp
 out DDRB, temp       ;PB as output
 out PORTB, temp

 ldi l,0          ;pocet opakovani v w:, 0=256x

 rcall LCD_init    ;inicializce

 ldi A, 0x80         ;vyslani retezce ABCD
 rcall LCD_inst
 ldi A, 0x41
 rcall LCD_char
 ldi A, 0x42
 rcall LCD_char
 ldi A, 0x43
 rcall LCD_char
 ldi A, 0x44
 rcall LCD_char

again:
 rjmp again
 ;----------------------

w:  ;cekaci smycka
 mov cnt, l
w1:
 dec cnt
 brne w1
 ret

LCD_init:   ;inicializace
 ldi A, 0b01000000     ;prepnuti do 4 bit
 out PORTB, A
 rcall w ;*************************    TOTO je cekaci smycka, mam je skoro
vsude, pro sichr
 sbi PORTB, 3     ;E=1
 rcall w ;*************************
 cbi PORTB, 3    ;E=0
 rcall w ;*************************
 rcall LCD_wait   ;cekej na busy flag


 ldi A, 1           ;inicializacni prikazy
 rcall LCD_inst
 ldi A, 2
 rcall LCD_inst
 ldi A, 6
 rcall LCD_inst
 ldi A, 12
 rcall LCD_inst
 ldi A, 20
 rcall LCD_inst
 ldi A, 40
 rcall LCD_inst
 ret

LCD_inst:    ;poslani instrukce
 clr B
 rjmp LCD_send
LCD_char:   ;poslani dat
 ldi B, 2
 rjmp LCD_send

LCD_send:
 mov temp, A
 andi temp, 0xF0
 or temp,  B     ;nastavi/vzmaze RS
 out PORTB, temp
 rcall w ;*************************
 sbi PORTB, 3
 rcall w ;*************************
 cbi PORTB, 3
 mov temp, A
 lsl temp
 lsl temp
 lsl temp
 lsl temp
 or temp,  B
 out PORTB, temp
 rcall w ;*************************
 sbi PORTB, 3
 rcall w ;*************************
 cbi PORTB, 3
 rcall LCD_wait
 ret

LCD_wait:    ;ceka na busy flag
 clt  ;T=0
 cbi DDRB, 7 ;PB7 as input
 sbi PORTB, 2 ;set WR=1
wait:
 rcall w ;*************************
 sbi PORTB, 3
 rcall w ;*************************
 sbis PINB,7 ;if DB7=1 then skip
 set  ;T=1
 rcall w ;*************************
 cbi PORTB, 3
 rcall w ;*************************
 sbi PORTB, 3
 rcall w ;*************************
 cbi PORTB, 3
 rcall w ;*************************
 brtc wait  ;byl-li DB7=1, jdi na wait
 cbi PORTB, 2 ;set RW=0
 sbi DDRB, 7 ;PB7 as output
 rcall w ;*************************
 ret







Další informace o konferenci Hw-list