;LCD-Routinen für Text-Punktmatrix-LCD ;mit Controller 50530. 8 Zeilen je 24 Zeichen ;Seiko C338008 / Samsung 0282A (www.pollin.de Nr: 120141) ;Version mit frei definierbaren Steuerleitungen. ;Diese Routinensammlung baut auf Beispielen von Andreas Schwarz ;und T.S. auf und ist von ...HanneS... zusammengestellt worden. ; hannes.lux@gmx.de / www.hannes.de.md ;============================================================================ ;Folgende Routinen können aufgerufen werden: ;---------------------------------------------------------------------------- ; lcd_init ;initialisiert und löscht den Controller des LCD ;---------------------------------------------------------------------------- ; lcd_data ;übergibt das Byte im Register "wl" zur Textausgabe ;an den Ringbuffer ;---------------------------------------------------------------------------- ; lcd_out ;gibt ein Zeichen aus dem Ringbuffer an das LCD aus ;Aufruf per Mainloop durch Timer synchronisiert ;---------------------------------------------------------------------------- ; locate Zeile,Spalte ;Macro, setzt Ausgabeposition auf Zeile 0-7 ;und Spalte 0-23 (über Ringbuffer) ;============================================================================ ;Die Datei "LCDprint.inc" stellt einige Ausgaberoutinen zur Verfügung, die ;die Ausgabe von Texten und Zahlen erleichtert. Zusammen mit "locate" wird ;die Ausgabe von Menütexten, Zahlen usw. ähnlich einfach wie in BASIC. ;============================================================================ ;Die Ausgabe erfolgt über einen Ringbuffer ;Die Übergabe der Daten erfolgt über das Register "wl", das im Hauptprogramm ;zu deklarieren ist. Weiterhin muss das Register "wh" deklariert sein. ;============================================================================ ;Anschlussbelegung: ;Die 4 Datenleitungen sollten in einem Nibble liegen. ;Dies kann ein unteres oder oberes Nibble sein. ;Die Auswahl geschieht mit "lcddatmsk" ;Die Steuerleitungen des LCD können über alle ;verfügbaren Ports frei gewählt werden, was diesen ;Treiber sehr flexibel macht. ;---------------------------------------------------------------------------- .equ lcdport=portc ;Port, an dem die 4 Datenleitungen des LCD ;angeschlossen sind. .equ lcddatmsk=$f0 ;Maske auf LCD-Datenpins. ;$0f - LCD ist an Bit 0...3 des Ports angeschlossen. ;$f0 - LCD ist an Bit 4...7 des Ports angeschlossen. ;---------------------------------------------------------------------------- .equ c1port=portc ;Port, an dem I/OC1 angeschlossen ist .equ c1=3 ;Pin, an dem I/OC1 angeschlossen ist ;---------------------------------------------------------------------------- .equ c2port=portc ;Port, an dem I/OC2 angeschlossen ist .equ c2=1 ;Pin, an dem I/OC2 angeschlossen ist ;---------------------------------------------------------------------------- .equ enableport=portc ;Port Anschluss Enable des Controllers. .equ enable=2 ;Pin Anschluss Enable des Controllers. ;---------------------------------------------------------------------------- ; Dieser Treiber arbeitet ohne R/W (ohne Busy-Abfrage) ;.equ rwport=portc ;Port, an dem R/W angeschlossen ist ;.equ rw=0 ;Pin, an dem R/W angeschlossen ist ;============================================================================ ;============================================================================ ; Aufrufbare Routine, initialisiert und löscht das LCD ; Benutzt der Einfachheit halber eine Warteschleife ;---------------------------------------------------------------------------- lcd_init: ;LCD-Initialisierung in wl,lcdport-1 ;Datenrichtung LCD-Datenport holen sbr wl,lcddatmsk ;benutzte Datenpins als Ausgang out lcdport-1,wl ;definieren sbi c2port-1,c2 ;I/OC2-Leitung als Ausgang sbi enableport-1,enable ;enable-Leitung als Ausgang sbi c1port-1,c1 ;I/OC1-Leitung als Ausgang ; sbi rwport-1,rw ;Read/Write-Leitung als Ausgang rcall wait10ms ldi wl,0b11011010 ;SF (4-Bit, 5x7) rcall lcd_command ;ausführen rcall wait10ms ldi wl,0b01010000 ;SE (Cursor++) rcall lcd_command ; rcall wait10ms ; ldi wl,0b00111100 ;SD (Display ein) (Cursor sichtbar) ldi wl,0b00110100 ;SD (Display ein) (Cursor aus) rcall lcd_command ; rcall wait10ms ldi wl,0 ;WS (Disp-Start auf 0) rcall lcd_startadr rcall wait10ms ; ldi wl,0b00001101 ;SU (keine Unterstreichung) ; rcall lcd_command ; ; Code geht weiter... ;============================================================================ ; Interne Routine, löscht das LCD, gehört zu lcd_init ;---------------------------------------------------------------------------- lcd_clear: ;Sendet den Befehl zum Löschen des Displays ldi wl,0b00000001 ;CH (Clear-Home) rcall lcd_command ;ausführen ; Code geht weiter... ;============================================================================ ; Interne Routine, wird nur von lcd_init und lcd_clear aufgerufen ;---------------------------------------------------------------------------- wait10ms: ;wartet etwa 10 Millisekunden (per Timer0 synchronisiert) push wl cbr flags,1<