;Initialisierungstest fuer LCD-Anzeige
;mit KS0066U-kompatiblem Controllerchip
;8-Bit-Mode; 4-Zeilen
;Daten-/Steuerbits auf PORTA, Bit D0 bis D7
;Enableimpuls erster Controller auf PORTC, Bit D0
;RS-Impuls auf PORTC, Bit D1
;Enableimpuls zweiter Controller auf PORTC, Bit D2
;R/WQuer auf Masse fest verdrahtet;
;Routine wird einmal durchlaufen und
;sistiert dann beim Label "Schleife"
;mit Ausgabe TEXT*TEXT*TEXT* etc...
;CPU Takt 1 MHz
.nolist
.include "m128def.inc"
.list
.def zeit = r16
.def zeit1 = r17
.def zeit2 = r18
.def temp = r19
.def temp1 = r20
.equ daten = porta
.equ impuls = portc
;Stack Initialisierung:
ldi temp, low(ramend)
out SPL, temp
ldi temp, high(ramend)
out SPH, temp
;Initialisierung; Datenrichtungsregister auf 8-Bit-Breite
;setzen und interne Pull-up-Widerstaende aktivieren:
ldi temp, 0xFF
out ddra, temp
ldi temp, 0xFF
out ddrc, temp
rjmp Start
Start:
rcall Einschaltverzoegerung
; rcall LCD_Initialisierung
rjmp Hauptprogramm
Einschaltverzoegerung:
rcall Verzoegerung_gross
rcall Verzoegerung_gross
rcall Verzoegerung_gross
rcall LCD_Initialisierung
Hauptprogramm:
rcall Text_Ausgabe
LCD_Initialisierung:
;LCD Reset, Acht-Bit-Modus initialisieren:
ldi temp, $30
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
ldi temp, $30
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
ldi temp, $30
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross ;Aller guten Dinge sind drei
;Zeilenzahl vier, Display einschalten:
ldi temp, 0b00110000 ;Extension D/L, N "und" F
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Anzeige ON/OFF Control definieren:
ldi temp, 0b00001000 ;Display off, 4-zeilig ein
out daten, temp ;"und" Hex01 => 4 Zeilen
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Anzeige ON/OFF Control definieren:
ldi temp, 0b00110000 ;4-zeilig wieder aus
out daten, temp ;Acht-Bit-Modus ein
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
nop
;Entry Mode Set:
ldi temp, 0b00000110 ;Cursor increment, no shift
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Cursor move, display shift:
ldi temp, 0b00000110 ;Cursor increment, no shift
out daten, temp ;Diese Aktion wird jedesmal ohne
sbi impuls, 0 ;Schreib-Lese-Funktion
rcall Verzoegerung ;ausgeführt
cbi impuls, 0 ;dient zur "Suchfunktion"
rcall Verzoegerung_gross ;und, um den Inhalt zu "lesen"
;kann also hier auch wegfallen
;Display on, cursor on:
ldi temp, 0b00001111 ;Cursor on/increment, no blink
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Display clear, cursor home:
ldi temp, 0b00000001 ;es werden "space", Hex 20
out daten, temp ;in alle Display-RAM-Stellen
sbi impuls, 0 ;geschrieben, dauert laenger
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
rcall Verzoegerung_gross
ret
Text_Ausgabe:
nop
sbi impuls, 1
sbi impuls, 0
ldi temp1, 'T'
out daten, temp1
rcall Verzoegerung
nop
nop
cbi impuls, 0
rcall Verzoegerung
cbi impuls, 1
sbi impuls, 1
sbi impuls, 0
ldi temp1, 'E'
out daten, temp1
nop
rcall Verzoegerung
nop
cbi impuls, 0
rcall Verzoegerung
cbi impuls, 1
sbi impuls, 1
sbi impuls, 0
ldi temp1, 'X'
out daten, temp1
rcall Verzoegerung
nop
cbi impuls, 0
rcall Verzoegerung
cbi impuls, 1
sbi impuls, 1
sbi impuls, 0
ldi temp1, 'T'
out daten, temp1
nop
rcall Verzoegerung
nop
cbi impuls, 0
rcall Verzoegerung
cbi impuls, 1
sbi impuls, 1
sbi impuls, 0
ldi temp1, '*'
out daten, temp1
nop
rcall Verzoegerung
nop
cbi impuls, 0
rcall Verzoegerung
cbi impuls, 1
rcall Verzoegerung_gross
nop
ret
Verzoegerung: ; nc=[1+6x(255-1)+5]=6x{255}=0,3825 ms
ldi zeit, 0xFF
Verzoegerungs_Schleife:
dec zeit
cpi zeit, 1
brlt Verzoegerungs_Schleife
ret
Verzoegerung_gross:
ldi zeit, 0xDF
ldi zeit1, 0x89
; ldi zeit2, 0xFF
rjmp Verzoegerungs_Schleife2
Verzoegerungs_Schleife2:
dec zeit
cpi zeit, 1
brlt Verzoegerungs_Schleife2
ldi zeit, 0xFF
dec zeit1
cpi zeit1, 1
brlt Verzoegerungs_Schleife2
; ldi zeit1, 0xFF
; dec zeit2
; cpi zeit2, 1
; brlt Verzoegerungs_Schleife2
; nop
ret
Ich habe mir nochmals das Signaldiagramm genauer angeschaut, kann es sein das das Display eine fallende Flanke nach jedem Hex 30 benötigt?
;Initialisierungstest fuer LCD-Anzeige
;mit KS0066U-kompatiblem Controllerchip
;8-Bit-Mode; 4-Zeilen
;Daten-/Steuerbits auf PORTA, Bit D0 bis D7
;Enableimpuls erster Controller auf PORTC, Bit D0
;RS-Impuls auf PORTC, Bit D1
;Enableimpuls zweiter Controller auf PORTC, Bit D2
;R/WQuer auf Masse fest verdrahtet;
;Routine wird einmal durchlaufen und
;sistiert dann beim Label "Schleife"
;mit Ausgabe TEXT*TEXT*TEXT* etc...
;CPU Takt 1 MHz
.nolist
.include "m128def.inc"
.list
.def zeit = r16
.def zeit1 = r17
.def zeit2 = r18
.def temp = r19
.def temp1 = r20
.equ daten = porta
.equ impuls = portc
;Stack Initialisierung:
ldi temp, low(ramend)
out SPL, temp
ldi temp, high(ramend)
out SPH, temp
;Initialisierung; Datenrichtungsregister auf 8-Bit-Breite
;setzen und interne Pull-up-Widerstaende aktivieren:
ldi temp, 0xFF
out ddra, temp
ldi temp, 0xFF
out ddrc, temp
rjmp Start
Start:
rcall Einschaltverzoegerung
; rcall LCD_Initialisierung
rjmp Hauptprogramm
Einschaltverzoegerung:
rcall Verzoegerung_gross
rcall Verzoegerung_gross
rcall Verzoegerung_gross
rcall LCD_Initialisierung
Hauptprogramm:
rcall Text_Ausgabe
LCD_Initialisierung:
;LCD Reset, Acht-Bit-Modus initialisieren:
ldi temp, $30
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
ldi temp, $30
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
ldi temp, $30
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross ;Aller guten Dinge sind drei
;Zeilenzahl vier, Display einschalten:
ldi temp, 0b00111000 ;Extension D/L, N "und" F
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Anzeige ON/OFF Control definieren:
ldi temp, 0b00001000 ;Display off, 4-zeilig ein
out daten, temp ;"und" Hex01 => 4 Zeilen
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Anzeige ON/OFF Control definieren:
ldi temp, 0b00111000 ;4-zeilig wieder aus
out daten, temp ;Acht-Bit-Modus ein
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
nop
;Display clear, cursor home:
ldi temp, 0b00000001 ;es werden "space", Hex 20
out daten, temp ;in alle Display-RAM-Stellen
sbi impuls, 0 ;geschrieben, dauert laenger
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
rcall Verzoegerung_gross
ret
;Entry Mode Set:
ldi temp, 0b00000111 ;Cursor increment, no shift
out daten, temp
sbi impuls, 0
rcall Verzoegerung
cbi impuls, 0
rcall Verzoegerung_gross
;Cursor move, display shift:
; ldi temp, 0b00000110 ;Cursor increment, no shift
; out daten, temp ;Diese Aktion wird jedesmal ohne
; sbi impuls, 0 ;Schreib-Lese-Funktion
; rcall Verzoegerung ;ausgeführt
; cbi impuls, 0 ;dient zur "Suchfunktion"
; rcall Verzoegerung_gross ;und, um den Inhalt zu "lesen"
;kann also hier auch wegfallen
;Display on, cursor on:
; ldi temp, 0b00001111 ;Cursor on/increment, no blink
; out daten, temp
; sbi impuls, 0
; rcall Verzoegerung
; cbi impuls, 0
; rcall Verzoegerung_gross
;Text_Ausgabe:
; nop
; sbi impuls, 1
; sbi impuls, 0
; ldi temp1, 'T'
; out daten, temp1
; rcall Verzoegerung
; nop
; nop
; cbi impuls, 0
; rcall Verzoegerung
; cbi impuls, 1
; sbi impuls, 1
; sbi impuls, 0
; ldi temp1, 'E'
; out daten, temp1
; rcall Verzoegerung
; nop
; nop
; cbi impuls, 0
; rcall Verzoegerung
; cbi impuls, 1
; sbi impuls, 1
; sbi impuls, 0
; ldi temp1, 'X'
; out daten, temp1
; rcall Verzoegerung
; nop
; nop
; cbi impuls, 0
; rcall Verzoegerung
; cbi impuls, 1
; sbi impuls, 1
; sbi impuls, 0
; ldi temp1, 'T'
; out daten, temp1
; rcall Verzoegerung
; nop
; nop
; cbi impuls, 0
; rcall Verzoegerung
; cbi impuls, 1
; sbi impuls, 1
; sbi impuls, 0
; ldi temp1, '*'
; out daten, temp1
; rcall Verzoegerung
; nop
; nop
; cbi impuls, 0
; rcall Verzoegerung
; cbi impuls, 1
; rcall Verzoegerung_gross
; nop
; ret
Verzoegerung: ; nc=[1+6x(255-1)+5]=6x{255}=0,3825 ms
ldi zeit, 0xFF
Verzoegerungs_Schleife:
dec zeit
cpi zeit, 1
brlt Verzoegerungs_Schleife
ret
Verzoegerung_gross:
ldi zeit, 0xDF
ldi zeit1, 0x89
; ldi zeit2, 0xFF
rjmp Verzoegerungs_Schleife2
Verzoegerungs_Schleife2:
dec zeit
cpi zeit, 1
brlt Verzoegerungs_Schleife2
ldi zeit, 0xFF
dec zeit1
cpi zeit1, 1
brlt Verzoegerungs_Schleife2
; ldi zeit1, 0xFF
; dec zeit2
; cpi zeit2, 1
; brlt Verzoegerungs_Schleife2
; nop
ret