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







Zitieren

Lesezeichen