Hallo
Ich habe meine Bemühungen, ein LCD über einen AVR zu steuern, mal wieder aufgenommen und mir dazu mal was auf Lochraster zusammengelötet.
Das LCD und der AVR sind folgendermaßen verschaltet:
Das ist das Hauptprogramm:
- #include"m8def.inc"
- .equ LCD_Port = PortB
- .equ PIN_E = 4
- .equ PIN_RS = 5
- .equ PIN_RW = 7
- .equ LCD_Konfi = 0b00101011
- ldi R16, LOW(RAMEND)
- out SPL, R16
- ldi R16, HIGH(RAMEND)
- out SPH, R16
- ldi R16, 0b00111111 ;Displayport konfigurieren, RW liegt auf PB7
- out DDRB, R16
- rcall Warte_25ms
- rcall LCD_initialisieren
- ldi R16, 'T'
- rcall LCD_Befehluebergabe
- S:
- rjmp S
Displayroutinen:
- ;=================================================================
- ;.................................................................
- ;Display-Routinen
- ;Benutzte Register sind: R16, R17 (werden gesichert)
- ;
- ;Initialisierung für 4 Bit-Betrieb
- ;Benötigt Warteschleifen-Routinen, Stapelspeicher
- ;Datenpins, E, RW und RS müssen an einen Port
- ;
- ;Direktiven:
- ;
- ;.equ LCD_PORT = PortD (Port definieren)
- ;.equ LCD_DDR = DDRD (zugehöriges Richtungsregister definieren)
- ;.equ PIN_E = 4 (Enable-Pin definieren)
- ;.equ PIN_RS = 5 (Register-selevt-Pin definieren)
- ;.equ Pin_RW = 3 (Read-Write-Pin definieren)
- ;.equ LCD_Konfi = 0b00000001 (Konfigurationsbefehl für Display)
- ;
- ;
- ;
- ;LCD_initialisieren -LCD im 4-Bit-Modus initialisieren
- ;LCD_Befehluebergabe -Befehl an LCD übergeben
- ;LCD_Datenuebergabe -Daten an LCD übegeben
- ;LCD_Zahlen8dez -8-Bit-Zahl dezimal darstellen, führende Nullen werden unterdrückt
- ;
- ;Unterroutinen:
- ;LCD_Enable
- ;
- ;..................................................................
- ;==================================================================
- ;==================================================================
- ;..................................................................
- ;LCD initialisieren
- ;..................................................................
- ;==================================================================
- LCD_initialisieren:
- rcall Warte_25ms
- push R16
- rcall LCD_Enable
- ldi R16, 0b00000011
- out LCD_PORT, R16
- rcall LCD_Enable
- rcall Warte_10ms
- rcall LCD_Enable
- rcall Warte_100us
- rcall Warte_100us
- rcall LCD_Enable
- rcall Warte_100us
- rcall Warte_100us
- ldi R16, 0b00000010
- out LCD_Port, R16
- rcall LCD_Enable
- rcall Warte_100us ;4-Bit-Modus eingestellt
- ldi R16, LCD_Konfi ;Display konfigurieren
- rcall LCD_Befehluebergabe
- pop R16
- ret
- ;==================================================================
- ;..................................................................
- ;LCD enable-Routine
- ;..................................................................
- ;==================================================================
- LCD_Enable:
- sbi LCD_PORT, PIN_E
- nop
- nop
- nop
- nop
- nop
- cbi LCD_PORT, PIN_E
- ret
- ;==================================================================
- ;..................................................................
- ;LCD Befehl uebergeben
- ;..................................................................
- ;==================================================================
- LCD_Befehluebergabe: ;ACHTUNG: Das zu uebergebene Bit in R16 ablegen, R16 wird nicht gesichert
- cbi LCD_PORT, PIN_RS ;Delay-Zeit 50us, weitere Zeit muss angefügt werden
- nop
- nop
- nop
- swap R16 ;Erstes Nibble übertragen
- andi R16, 0b00001111
- out LCD_PORT, R16
- rcall LCD_Enable
- rcall Warte_10us
- swap R16 ;Zweites Nibble übertragen
- andi R16, 0b00001111
- out LCD_PORT, R16
- rcall LCD_Enable
- rcall Warte_50us
- ret
- ;==================================================================
- ;..................................................................
- ;LCD Daten uebergeben
- ;..................................................................
- ;==================================================================
- LCD_Datenuebergabe: ;ACHTUNG: Das zu uebergebene Bit in R16 ablegen, R16 wird nicht gesichert
- sbi LCD_PORT, PIN_RS
- nop
- nop
- nop
- swap R16 ;Erstes Nibble übertragen
- andi R16, 0b00001111
- out LCD_PORT, R16
- rcall LCD_Enable
- rcall Warte_10us
- swap R16 ;Zweites Nibble übertragen
- andi R16, 0b00001111
- out LCD_PORT, R16
- rcall LCD_Enable
- rcall Warte_50us
- ret
- ;==================================================================
- ;..................................................................
- ;LCD Zahlen dezimal darstellen (8-Bit)
- ;..................................................................
- ;==================================================================
- LCD_Zahlen8dez: ;Zahlen in R16 übergeben, R16 wird nicht gesichert
- push R17
- mov R17, R16
- LCD_Zahlen8dez_1: ;Hunderterstellen zählen
- subi R17, 100
- BRCS LCD_Zahlen8dez_2
- inc R16
- rjmp LCD_Zahlen8dez_1
- LCD_Zahlen8dez_2: ;R16 an Display übergeben und löschen
- subi R17, -100
- rcall LCD_Datenuebergabe
- clr R16
- LCD_Zahlen8dez_3: ;Zehnerstellen zählen
- subi R17, 10
- BRCS LCD_Zahlen8dez_4
- inc R16
- rjmp LCD_Zahlen8dez_3
- LCD_Zahlen8dez_4: ;R16 an Display übergeben und löschen
- subi R17, -10
- rcall LCD_Datenuebergabe
- clr R16
- LCD_Zahlen8dez_5: ;Einerstellen zählen
- subi R17, 1
- BRCS LCD_Zahlen8dez_6
- inc R16
- rjmp LCD_Zahlen8dez_5
- LCD_Zahlen8dez_6: ;R16 an Display übergeben und R17 wiederherstellen
- subi R17, -10
- rcall LCD_Datenuebergabe
- pop R17
- ret
Mein Problem ist nun: es funktioniert nicht. Kontrast ist ok, die Leitungen sind auch alle sauber, keine Übergänge ect...trotzdem tut das LCD nix, außer eine Zeile schwarzer Balken anzuzeigen.
Ich habe vorhin mal wild ein paar Befehle an das LCD gesendet, irgendwas...da hat mal der Cursor geblinkt und seine Position geändert, das war aber Zufall da ich nur iwelche Zeichen als Befehl anstatt als Daten gesendet habe.
Display ist das hier:
http://www.pollin.de/shop/dt/O…LCD_Modul_TC1602E_01.html
Kann mir iwer helfen? Im Internet hab ich nix dazu gefunden, so ziemlich alle, die das Problem hatten, haben das in C umgesetzt.