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