Pfad: Home =>
AVR-Übersicht =>
Hardware => LCD
; ************************************************
; TestLcd löscht das LCD-Display und gibt in
Zeile 1 und 2 einen Test-Text aus.
; ************************************************
; Erläuterungen zum LCD-Zugriff
; Hardware:
; Die LCD-Routinen setzen voraus, dass eine entsprechende
; LCD angeschlossen ist. Das LCD-Board kann mit einer
; Buchsenleiste nach unten hin bestückt werden, so
; dass sie direkt auf das STK200 aufgesetzt werden kann.
;
;Der aufgelötete Connector ...
;
; ... kann direkt auf das Board aufgesteckt werden und ...
;
; ... passt von der Anschlussfolge her schon genau.
; Die 2-Zeilen-LCD-Anzeige muss auf das Board
; aufgesteckt sein, alle erforderliche Hardware ist
; schon auf dem Board vorhanden. Es genügt eine 14-
; polige einreihige Buchsenleiste, die von der Löt-
; seite her auf die LCD aufgelötet und in
die 14-
; polige Steckerleiste auf dem STK-200-Board gesteckt
; wird. Das war's an Hardware.
; Ach ja: der Kontrastregler muss noch justiert werden
; sonst ist nichts zu sehen. Also ohne Ansteuerung so
; einstellen, dass die schwarzen Kästchen gerade
; verschwinden.
; Software: Die Ansteuerung erfolgt in
diesem Beispiel
; wie Memory (memory-mapped). Das hat den Vorteil,
; dass die gleichen Befehle wie für Memory benutzt
; werden können, das Herumeiern mit den verschiedenen
; Ports entfällt und gleichzeitig SRAM am Board be-
; trieben werden kann. (Die Beispiel-Programme auf
; dem Internet-Server sind alle I/O-mapped und ver-
; tragen sich nicht mit gleichzeitigem Memory-Betrieb!).
; Die Adresse der LCD-Steuerung ist $8000 für die
; Befehle und $C000 für den Zugriff auf den Zeichen-
; generator und die Displayzeilen (jeweils Lesen und
; Schreiben.
; Da bei Memory-Betrieb der Zugriff sehr schnell er-
; folgen würde, muss das WAIT-Bit
im MCUCR-Register
; gesetzt werden. Das macht zwar den RAM-Zugriff auch
; langsamer, aber das kann verschmerzt werden. Für
; schnelle RAM-Zugriffe kann das Bit
zeitweise wieder
; Null gesetzt werden, dann ist der Nachteil weg.
; Verwendete Ports: Es werden die gleichen Ports verwendet
; wie beim RAM-Zugriff, also:
; Port A ist abwechselnd Adress-Bus
für das LSB der RAM-
; Adresse und den Datenbus (Multiplex) des SRAM,
; für die LCD werden diese nicht verwendet, sind
; aber bei Memory-Mapping blockiert!
; Port C ist der obere Adress-Bus
beim SRAM, verwendet
; von der LCD werden Bit 7 (Adresse)
und 6 (RS-
; Signal an der LCD).
; Port D Bit
6 ist /RD (Read) am SRAM, nicht benutzt von LCD
; Bit 7 ist /WR (Write) am SRAM
und an der LCD
;
; Ablauf des Testprogrammes: Nacheinander werden folgende
; Schritte durchlaufen:
; 0. Warten, bis die LCD nicht mehr das BUSY-Flag gesetzt hat
; 1. Löschen des Displays
; 2. Setzen der Übertragungsart (8-Bit),
des festen Anzeige-
; fensters und anderer Eigenschaften des Displays
; 3. Ausgabe von zwei Testzeilen mit Text.
; Bei jedem Schritt wird vorher eine Leuchtdiode angemacht,
; so dass bei einem Scheitern an der Nummer der Lampe der
; fehlerhafte Schritt erkannt werden kann. Wenn alles durch-
; laufen wird, sollte die LED 4 an sein und der Text auf der
; LCD zu lesen sein (eventuell Kontrast justieren).
;
; Aufbau der Software: Alle Ansteuerungen der LCD erfolgen
; als Unterprogramme, die leicht in andere
Programme über-
; tragen werden können. Verwendete Register sind:
; mp: Allround-Register zur Übergabe von Werten
; R26/R27: XL/XH, 16-Bit-Adresse für
den ST X und LD
X-Befehl
;
;
; 8515-Bibliothek laden
.NOLIST
.INCLUDE "8515def.inc"
.LIST
; Register
.def mp = R16 ;
Multi-Purpose
.def test = R17 ;
Zählt die einzelnen Testphasen
RJMP main
; Unterprogramme zur LCD-Ansteuerung
LcdWt: ; Warte bis das LCD-Busy-Flag gelöscht ist
LDI XH,0x80
; Oberes Byte der RAM-Adresse der
LCD
LDI XL,0x00
; Unteres Byte der RAM-Adresse der
LCD
LD mp,X
; Lese Busy flag und AC-Adresse
ROL mp
; Schiebe Bit 7 in
das Carry-Flag
BRCS LcdWt
; Wenn Eins, dann noch busy, weiter
RET
LcdCl: ; Lösche die LCD
LDI mp,0x01
; Der Löschbefehl für die LCD lautet 01h
LcdBef: ; Gib den Befehl in mp an die
LCD, wenn diese bereit ist
PUSH mp
; Der Befehl in mp wird noch gebraucht,
auf Stapel
RCALL LcdWt
; Warte, bis Anzeige Befehle entgegen nimmt
POP mp
; Nehme Befehl wieder vom Stapel
ST X,mp
; Gib ihn an die LCD weiter
RET ; Ende des Unterprogrammes
LcdInit: ; Initiiert die Arbeitsweise der LCD
LDI mp,0b00111000
; 8-Bit-Übertragung, nicht vier
Bit
RCALL LcdBef
; an LCD geben
LDI mp,0b00000110
; Increment, Display freeze
RCALL LcdBef
; an LCD geben
LDI mp,0b00010000
; Cursor move, nicht shift
RCALL LcdBef
; an LCD geben
RET ; Zurück
LcdBu: ; Schreibe den Buchstaben in
mp in die LCD
PUSH mp
; Der Buchstabe wird noch gebraucht, auf Stapel
RCALL LcdWt
; Warte bis die LCD wieder kann
POP mp
; Hole Buchstaben wieder vom Stapel
LDI XH,0xC0
; Der Speicher der LCD ist auf Adresse 0C00h
ST X,mp
; Schreibe Buchstabe auf LCD
RET ; Zurück
aus dem Unterprogramm
LcdTs: ; Schreibe das Wort "Test" in
die aktuelle Zeile
PUSH mp
; Rette die Zeilenadresse in mp
RCALL LcdWt
; Warte, bis Display verfügbar ist
POP mp
; Stelle Zeilenadresse wieder her
ORI mp,0x80
; Setze Bit 7 der Zeilenadresse
RCALL LcdBef
; Gib den Befehl an die LCD weiter
LDI mp,'T'
; Buchstabe T
RCALL LcdBu
; Schreibe Buchstabe in mp auf LCD
LDI mp,'e'
; Buchstabe e
RCALL LcdBu
; Schreibe auf LCD
LDI mp,'s'
; Buchstabe s
RCALL LcdBu
; Schreibe auf LCD
LDI mp,'t'
; Buchstabe t
RCALL LcdBu
; Schreibe auf LCD
RET ; Fertig, Zurück
LcdTst: ; Schreibe das Wort "Test" in
Zeile 1 und 2
LDI mp,0x00
; Zeile 1 beginnt an der Adresse 00h im Display
RCALL LcdTs
; Schreibe Test in Zeile 1
LDI mp,0x40
; Zeile 2 beginnt an der Adresse 40h im Display
RCALL LcdTs
; Schreibe Test in Zeile 2
RCALL LcdWt
; Warten bis LCD fertig ist
LDI mp,0b00001111
; Befehl für Display On, Cursor On und Blink
RCALL LcdBef
; Gib Befehl an die Anzeige weiter
RET ; Zurück
aus dem Unterprogramm
; Hauptprogramm
main: LDI mp,LOW(RAMEND)
;Initiate Stackpointer
OUT SPL,mp
; wegen verwendeten Unterprogrammen
LDI mp,HIGH(RAMEND)
OUT SPH,mp
; Port B steuert die LEDs an
LDI mp,0xFF
; Alles Ausgänge
OUT DDRB,mp
; an Datenrichtungsregister Port
B
; Geht wieder nicht complilieren:
; SBI MCUCR,SRE
; Setze das SRAM-Bit im MCU-Register
; Ersatz:
IN mp,MCUCR
; Lese MCU-Control-Register
ORI mp,0xC0
; Setze Bit 7 (SRAM) und Bit
6 (WAIT-STATE)
OUT MCUCR,mp
; Hier startet der eigentliche Test der LCD
LDI test,0xFE
; Setze Bit 0 auf 0 = Lampe 0 an
OUT PORTB,test
; Lampe 0 an
RCALL LcdWt
; Einfach nur warten,
;falls ein Fehler passiert, bleibt er
hier stecken
SEC ; Setze Carry
Flag 1
ROL test
; Schiebe die Null eins links, Lampe 1 an
OUT PORTB,test
RCALL LcdCl
; Lösche die LCD
SEC ; Carry wieder
an für Lampe 2 an
ROL test
; Und reinschieben in test
OUT PORTB,test
RCALL LcdInit
; Einige Initiierungen der Arbeitsweise
SEC ; Setze Carry
Flag 1
ROL test
; Schiebe weiter, Lampe 3 an
OUT PORTB,test
RCALL LcdTst
; Schreibe die beiden Testzeilen
SEC ; Carry wieder
1
ROL test
; Test ist zu Ende, Lampe 4 an
OUT PORTB,test
ende: RJMP ende
; Loop für immer
©2002-2006 by http://www.avr-asm-tutorial.net