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
Alles anzeigen
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
Alles anzeigen
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.