Hallo
Ich sitze jetzt schon einige Tage an meinem Code und es stellt sich allmählich eine gewisse Betriebsblindheit ein.
Findet jemand den Fehler in meinem Code?
Folgendes Problem: Ich habe hier ein 2x16-LCD, das jedoch keine Zeichen anzeigen will.
Ich kann es zwar initialisieren (obere Balkenreihe verschwindet), jedoch zeigt es keine Zeichen an.
Kann mal wer über den Code rüberschauen?
Code:
.equ LCD_DAT_PORT =PORTC ;Port für Datenleitungen definieren
.equ LCD_STRG_PORT =PORTA ;Port definieren, an dem RS, RW und E angeschlossen sind
.equ LCD_DDR =DDRC ;Datenrichtungsregister LCD-Datenport
.equ LCD_PIN =PINC ;Pin-Register LCD-Datenport
.equ LCD_E =7 ;Enable-Pin definieren
.equ LCD_RS =5 ;Register-Select-Pin definieren
.equ LCD_RW =6 ;Read-Write-Pin definieren
.equ Schlussmarke =0 ;Schlussmarke für längeren Text, ASCII-Wert
.def LCD_Puffer =R16 ;Register für Daten/Befehlübergabe
.def LCD_TMP1 =R17 ;Arbeitsregister für LCD-Routinen, wird bei Verwendung auf dem Stack gesichert
.def LCD_TMP2 =R18 ;Arbeitsregister für LCD-Routinen, wird bei Verwendung auf dem Stack gesichert
.equ LCD_FunctionSet =0b00101110 ;FunctionSet: 0b001 DL N F * * DL=8/4-Bit, N=1/2 Zeilen, 5x8/5x10
.equ LCD_Display =0b00001000 ;Display Ein/Aus: 0b00001 D C B D=Display Ein/Aus, C=Kursor Ein/Aus, B=Blinken Ein/Aus
.equ LCD_EntryMode =0b00000110 ;Entry Mode Set: 0b000001 I S I=Kursor Laufrichtung, S=Shift Ein/Aus
;============
;Ports konfigurieren
;Stack initialisieren, usw
;============
rcall LCD_initialisieren
rcall Warte_50ms
rcall Warte_50ms
ldi LCD_Puffer, 'W'
rcall LCD_Befehluebergabe
rcall Warte_50ms
Ende:
rjmp Ende
;==================================================================
;..................................................................
;LCD initialisieren - 8-Bit-Modus
;..................................................................
;==================================================================
LCD_initialisieren:
push LCD_TMP1
ldi LCD_TMP1, 0b00110000
out LCD_DAT_PORT, LCD_TMP1
rcall LCD_Enable
rcall Warte_1ms
rcall Warte_1ms
rcall Warte_1ms
rcall Warte_1ms
rcall Warte_10us
ldi LCD_TMP1, 0b00110000
out LCD_DAT_PORT, LCD_TMP1
rcall LCD_Enable
rcall Warte_100us
ldi LCD_TMP1, 0b00110000
out LCD_DAT_PORT, LCD_TMP1
rcall LCD_Enable
ldi LCD_TMP1, LCD_FunctionSet ;Function Set
out LCD_DAT_PORT, LCD_TMP1
rcall LCD_Enable
rcall Warte_10us
rcall Warte_10us
rcall Warte_25us
ldi LCD_TMP1, LCD_Display ;Display und Kursor einstellen
out LCD_DAT_PORT, LCD_TMP1
rcall LCD_Enable
rcall Warte_10us
rcall Warte_10us
rcall Warte_25us
ldi LCD_TMP1, LCD_EntryMode ;Entry Mode Set
out LCD_DAT_PORT, LCD_TMP1
rcall LCD_Enable
rcall Warte_1ms
rcall Warte_1ms
pop LCD_TMP1
ret
;==================================================================
;..................................................................
;LCD Befehl uebergeben
;..................................................................
;==================================================================
LCD_Befehluebergabe:
out LCD_DAT_PORT, LCD_Puffer
cbi LCD_STRG_PORT,LCD_RS
nop
nop
nop
rcall LCD_Enable
rcall LCD_BusyFlag
ret
;==================================================================
;..................................................................
;LCD Daten uebergeben
;..................................................................
;==================================================================
LCD_Datenuebergabe:
out LCD_DAT_PORT, LCD_Puffer
sbi LCD_STRG_PORT,LCD_RS
nop
nop
nop
rcall LCD_Enable
rcall LCD_BusyFlag
cbi LCD_STRG_PORT,LCD_RS
ret
;==================================================================
;..................................................................
;LCD Enable-Routine
;..................................................................
;==================================================================
LCD_Enable:
sbi LCD_STRG_PORT, LCD_E
nop
nop
nop
cbi LCD_STRG_PORT, LCD_E
ret
;==================================================================
;..................................................................
;LCD Busyflag abwarten
;..................................................................
;==================================================================
LCD_BusyFlag:
push LCD_TMP1
ldi LCD_TMP1, 0b00000000 ;Portpin 7 als Eingang konfigurieren um das BF auszulesen
cbi LCD_STRG_PORT,LCD_RS
sbi LCD_STRG_PORT,LCD_RW
out LCD_DDR, LCD_TMP1
LCD_WarteBF: ;Warteschleife, wird verlassen sobald Pin 7 gesetzt wird
sbic LCD_PIN, 7
jmp LCD_WarteBF
ldi LCD_TMP1, 0b11111111
out LCD_DDR, LCD_TMP1
pop LCD_TMP1
ret
Lesezeichen