Zitat :
|
Ein Balken in der ersten und dritten Zeile zeigt, dass der Kontrast mehr oder weniger OK ist, aber das LCD noch nicht initialisiert wurde. |
So isses.
Bei mir geht es so:
;**** Definierung der Befehle und Adressen im Display ****
.equ lcdon = 0b00001110 ; LCD einschalten Bit0 und 1 = 0 (Cursor off Blink off)
.equ lcdmode = 0b00111000 ; LCD Mode 8 Bit, 2 Zeilen
.equ lcdclear = 0b00000001 ; LCD löschen
.equ lcdentry = 0b00000110 ; bei eingabe eines Zeichen den Cursor um 1 erhöhen
.equ zeile1 = 0b10000000 ; Adr 0H Zeile 1 Spalte 1
.equ zeile1a = 0b10010100 ; Adr 14H Zeile 1 Spalte 2
.equ zeile2 = 0b11000000 ; Startadresse der zweiten Display Zeile
.equ zeile2a = 0b11010100 ; Adr 53H Zeile 2 Spalte 2
; **** Initialisierung des LCD Displays ******************
initlcd: rcall wait15ms ; 15ms auf Display warten
ldi temp1,lcdmode ; LCD-Mode setzten
rcall sendebefehl ; Befehl senden
rcall wait15ms ; 15ms warten
ldi temp1,lcdmode ; LCD-Mode setzten
rcall sendebefehl ; Befehl senden
rcall wait5ms ; 5ms warten
ldi temp1,lcdmode ; LCD-Mode setzten
rcall sendebefehl ; Befehl senden
rcall wait5ms ; 5ms warten
ldi temp1,lcdon ; LCD einschalten
rcall sendebefehl ; Befehl senden
rcall wait150us ; 150us warten
ldi temp1,lcdclear ; LCD löschen
rcall sendebefehl ; Befehl senden
rcall wait150us ; 150us warten
ldi temp1,lcdentry ; Entrymode setzten
rcall sendebefehl ; Befehl senden
rcall wait5ms ; 5ms warten
;weiter im Programm
;**** Senden von Befehlen und Daten an Display ***********
sendebefehl:
rcall busyflag
cbi portd,RS ; lösche BIT RS
cbi portd,RW ; lösche BIT RW
rcall ausgabe ; Befehl ausgeben
ret
sendedaten:
rcall busyflag ; Busyflag abfragen
sbi portd,RS ; setzten BIT RS
cbi portd,RW ; lösche BIT RW
rcall ausgabe ; Daten ausgeben
ret
ausgabe: out portb,temp1 ; Daten aus Register ausgeben
sbi portd,E ; setzten BIT E
nop ; kein Operation (warten)
nop
nop
cbi portd,E ; lösche BIT E
ret
busyflag:
push temp2
clr temp2 ; lösche Register temp2
out ddrb,temp2 ; Port B als Eingänge setzten
cbi portd,RS ; lösche BIT RS
sbi portd,RW ; setzte BIT RW
wb1: sbi portd,E ; setzten BIT E
nop ; keine Operation (warten)
nop
in temp2,pinb ; lese Port B in Register temp2 ein
cbi portd,E ; lösche BIT E
nop
sbrc temp2,Busy ; überspringe nächsten Befehl falls Busy flag
rjmp wb1 ; gelöscht ist
cbi portd,RW ; lösche BIT RW
ser temp2 ; setzte alle BITs im Register temp2
out ddrb,temp2 ; setzte Port B als Ausgang
pop temp2
ret
;**** Zeitschleifen **************************************
wait50us:ldi tim1,65 ; 50us warten bei 4MHz Taktfrequenz
; 50us / 750ns = 65
wait51: dec tim1 ; 250ns für DEC Befehl und 500ns für BRNE
brne wait51 ; Befehl = 750ns
ret ; 750ns * 65 Durchläufe = 50us
wait150us:rcall wait50us
rcall wait50us
rcall wait50us
ret
wait5ms: ldi tim2,100
wait5: rcall wait50us
dec tim2
brne wait5
ret
wait15ms:rcall wait5ms
rcall wait5ms
rcall wait5ms
ret
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
[ Diese Nachricht wurde geändert von: Jornbyte am 13 Nov 2004 22:13 ]