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

; Reset-/Interrupt-Vektor

   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