; ************************************************ ; TestLcd loescht das LCD-Display und gibt in Zeile ; 1 und 2 einen Test-Text aus. ; ************************************************ ; Erlaeuterungen zum LCD-Zugriff ; Hardware: Die 2-Zeilen-LCD-Anzeige muss auf das Board ; aufgesteckt sein, alle erforderliche Hardware ist ; schon auf dem Board vorhanden. Es genuegt eine 14- ; polige einreihige Buchsenleiste, die von der Loet- ; seite her auf die LCD aufgeloetet und in die 14- ; polige Steckerleiste auf dem STK-200-Board gesteckt ; wird. Das war's an Hardware. ; Software: Die Ansteuerung erfolgt in diesem Beispiel ; wie Memory (memory-mapped). Das hat den Vorteil, ; dass die gleichen Befehle wie fuer Memory benutzt ; werden koennen, das Herumeiern mit den verschiedenen ; Ports entfaellt 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 fuer die ; Befehle und $C000 fuer den Zugriff auf den Zeichen- ; generator und die Displayzeilen (jeweils Lesen und ; Schreiben. ; Da bei Memory-Betrieb der Zugriff sehr schnell er- ; folgen wuerde, muss das WAIT-Bit im MCUCR-Register ; gesetzt werden. Das macht zwar den RAM-Zugriff auch ; langsamer, aber das kann verschmerzt werden. Fuer ; 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 fuer das LSB der RAM- ; Adresse und den Datenbus (Multiplex) des SRAM, ; fuer 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. Loeschen des Displays ; 2. Setzen der Uebertragungsart (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 ueber- ; tragen werden koennen. Verwendete Register sind: ; mp: Allround-Register zur Uebergabe von Werten ; R26/R27: XL/XH, 16-Bit-Adresse fuer den ST X und LD X-Befehl ; ; ; 8515-Bibliothek laden .NOLIST .INCLUDE "8515def.inc" .LIST ; Register .def mp = R16 ; Multi-Purpose .def test = R17 ; Zaehlt die einzelnen Testphasen ; Reset-/Interrupt-Vektor rjmp main ; Unterprogramme zur LCD-Ansteuerung LcdWt: ; Warte bis das LCD-Busy-Flag geloescht 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: ; Loesche die LCD ldi mp,0x01 ; Der Loeschbefehl fuer 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-Uebertragung, 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 ; Zurueck 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 ; Zurueck aus dem Unterprogramm LcdTs: ; Schreibe das Wort "Test" in die aktuelle Zeile push mp ; Rette die Zeilenadresse in mp rcall LcdWt ; Warte, bis Display verfuegbar 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, Zurueck 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 ldi mp,0b00001111 ; Befehl fuer Display On, Cursor On und Blink rcall LcdBef ; Gib Befehl an die Anzeige weiter ret ; Zurueck 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 Ausgaenge 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 ; Loesche die LCD sec ; Carry wieder an fuer 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 fuer immer