Ansteuerung eines alphanumerischen LC-Display (mit PIC-Mikrocontroller, Elektronik)
4. Software (in Assembler)
4.1. Benötigte Register und Portdefinition
Register:
Für die softwaremäßige LC-Display-Ansteuerung werden neben einigen PIC internen
Register (SFR, Spezielle Funktions-Register) noch zwei Hilfsregister (TEMP1 und
TEMP2) benötigt. Diese beiden Register sind so genannte temporäre Register. D.h. Sie
werden nur kurzzeitig verwendet und können daher auch in beliebigen anderen
Unterprogrammen verwendet werden.
Portdefinition:
Im Allgemeinen wird bei jeder Anwendung das LC-Display an einem beliebigen Port
angeschlossen. Damit dies in der Software nur an einer Stelle berücksichtigt werden
muss befindet sich in der Software eine Portdefinition. Diese besteht aus den folgenden
Parametern:
- LCD_DATA: Dieser Parameter gibt den Port für den Datenbus an. (zum
Beispiel Port A, Port B,..). Achtung: Es wird der 4-bit-Datenbus
verwendet, welcher aus dem höheren Nibble des verwendeten
Ports besteht.
- LCD_DATA_TRIS: Dieser Parameter ist für die Initialisierung des Ports für den
Datenbus zuständig. Achtung: Wird für den Parameter LCD_DATA der PORTA verwendet, so muss der
Parameter LCD_DATA_TRIS den Parameter TRISA beinhalten!
- LCD_CTRL: Dieser Parameter gibt den Port für die Steuerleitungen an. (z.B.
Port A, Port B,..)
- LCD_CTRL_TRIS: Dieser Parameter ist für die Initialisierung des Ports für die
Steuerleitungen zuständig. Achtung: Wird für den Parameter LCD_CTRL der PORTA verwendet, so muss
der Parameter LCD_CTRL_TRIS den Parameter TRISA beinhalten!
- LCD_RS: Dieser Parameter gibt den Portpin der Steuerleitung Register-Select an.
- LCD_RW: Dieser Parameter gibt den Portpin der Steuerleitung Read-Write an.
- LCD_E: Dieser Parameter gibt den Portpin der Steuerleitung Enable an.
Eine mögliche Portdefinition ist:
LCD_DATA equ PORTB
LCD_DATA_TRIS equ TRISB
LCD_CTRL equ PORTB
LCD_CTRL_TRIS equ TRISB
LCD_RS equ 1
LCD_RW equ 2
LCD_E equ 3
4.2. Initialisierung (Unterprogramm "INIT")
Dieses Unterprogramm dient zur Initialisierung des Mikrocontrollers. Bei diesem
Beispiel ist hier, für die Ansteuerung des LC-Displays, nur die Definition der
verwendeten Portpins als Ausgang notwendig.
4.3. Unterprogramme für die LCD-Ansteuerung
Zur Ansteuerung eines alphanumerischen LC-Displays sind 5 Unterprogramme notwendig:
- Zuerst muss das LC-Display initialisiert werden. Das Unterprogramm LCDINIT
übernimmt diese Aufgabe
- Befehle an das LC-Display werden mit dem Unterprogramm LCDBEFEHL erzeugt,
während die am LC-Display anzuzeigenden Zeichen mit dem Unterprogramm
LCDZEICHEN erzeugt werden
- Das LC-Display benötigt etwas Zeit zur Abarbeitung der Anweisungen und setzt
dabei ein so genanntes Busy-Flag. Das Unterprogramm LCDBUSY überprüft dieses
Flag, und wartet solange bis das LC-Display für eine Anweisung bereit ist
- Während der Initialisierung des LC-Displays benötigt das LC-Display verschiedene
Zeitverzögerungen. Diese werden mit dem Unterprogramm VERZ100US erzeugt,
wobei die Verzögerungszeit über einem Parameter eingestellt werden kann.
Nun aber zu den einzelnen Unterprogrammen im Detail:
4.3.1. Unterprogramm LCDINIT
Aufgabe:
Dieses Unterprogramm initialisiert das LC-Display (siehe auch Abschnitt
3. Befehle zur Ansteuerung eines LC-Display)
Vorgehensweise:
- Die Steuerleitungen des LC-Displays (E, RS, R/W) auf Low legen
- 15 ms warten
- Befehl: 8-bit-Interface an LCD
- 4,1 ms warten
- Wiederholung des Befehls: 8-bit-Interface an LCD
- 0,1 ms warten
- Wiederholung des Befehls: 8-bit-Interface an LCD
- Warten, bis LCD für weitere Anweisungen bereit ist
- Befehl: 4-bit-Interface an LCD; Achtung: ab nun müssen Befehle an das LCD mit
dem Unterprogramm LCDBEFEHL erfolgen
- Befehl: Display löschen und Cursor home
- Befehl: 4 Bit, 2 Zeilen, 5x7
- Befehl: Display aus, Cursor aus, Blinken aus
- Befehl: Shift aus
- Befehl: Display ein
4.3.2. Unterprogramm LCDBEFEHL
Aufgaben:
Dieses Unterprogramm sendet einen Befehl nibbleweise an das LC-Display.
Vorgehensweise:
- Der Befehl, welcher an das LC-Display übertragen wird, befindet sich als 8-Bit-Wert
im Arbeitsregister (w-Register). Diesen zunächst im temporären Register TEMP1
zwischenspeichern.
- Warten bis das LC-Display für einen Befehl bereit ist. (Dazu ist das Unterprogramm
LCDBUSY zuständig).
- Für die Kommunikation mit dem LC-Display steht "nur" ein 4-Bit-Datenbus zur
Verfügung. Der 8-bit-Befehl wird daher nibbleweise an das LC-Display übertragen.
Zuerst wird das höherwertigere Nibble auf den 4-Bit-Datenbus gelegt. Dabei dürfen
nur die für den Datenbus definierten Leitungen verändert werden. Die restlichen vier
Portpins dürfen nicht verändert werden.
- Read-Write-Steuerleitung löschen, da es sich hier um eine Schreibanweisung
handelt.
- Register-Select-Steuerleitung löschen, da es sich hier um einen Befehl handelt.
- Eine fallende Flanke auf der Enable-Steuerleitung durch Toggeln erzeugen. (Das
LC-Display liest nun das höherwertigere Befehlsnibble ein)
- Nun das niederwertigere Befehlsnibble auf den 4-Bit-Datenbus legen. Auch hier
dürfen nur die für den Datenbus definierten Leitungen verändert werden. Die
restlichen vier Portpins dürfen nicht verändert werden.
- Eine fallende Flanke auf der Enable-Steuerleitung durch Toggeln erzeugen. (Das
LC-Display liest nun das niederwertigere Befehlsnibble ein).
Anmerkungen:
Dieses Unterprogramm unterscheidet sich zum Unterprogramm LCDZEICHEN nur
dadurch, dass hier die Register-Select-Steuerleitung gelöscht ist, da mit diesem
Unterprogramm Befehle an das LC-Display übertragen werden.
Das temporäre Register TEMP1 dient hier nur als Hilfsregister. Es wird hier nur
kurzzeitig verwendet und kann daher auch in anderen Unterprogrammen verwendet
werden.
4.3.3. Unterprogramm LCDZEICHEN
Aufgaben:
Dieses Unterprogramm sendet ein Zeichen, welches am LC-Display ausgegeben wird,
nibbleweise an das LC-Display.
Vorgehensweise:
- Das Zeichen, welches am LC-Display ausgegeben werden soll, befindet sich als 8-
Bit-Wert im Arbeitsregister (w-Register). Diesen Wert zunächst im temporären
Register TEMP1 zwischenspeichern
- Warten bis das LC-Display für ein Zeichen bereit ist. (Dazu ist das Unterprogramm
LCDBUSY zuständig)
- Für die Kommunikation mit dem LC-Display steht "nur" ein 4-bit-Datenbus zur
Verfügung. Der 8-bit-Wert wird daher nibbleweise an das LC-Display übertragen
- Zuerst wird das höherwertigere Nibble auf den 4-Bit-Datenbus gelegt. Dabei dürfen
nur die für den Datenbus definierten Leitungen verändert werden. Die restlichen vier
Portpins dürfen nicht verändert werden.
- Read-Write-Steuerleitung löschen, da es sich hier um eine Schreibanweisung
handelt.
- Register-Select-Steuerleitung setzen, da es sich hier um ein Zeichen handelt,
welches am LC-Display ausgegeben werden soll.
- Eine fallende Flanke auf der Enable-Steuerleitung durch Toggeln erzeugen. (Das
LC-Display liest nun das höherwertige Zeichennibble ein)
- Nun das niederwertigere Zeichennibble auf den 4-Bit-Datenbus legen. Auch hier
dürfen nur die für den Datenbus definierten Leitungen verändert werden. Die
restlichen vier Portpins dürfen nicht verändert werden.
- Eine fallende Flanke auf der Enable-Steuerleitung durch Toggeln erzeugen. (Das
LC-Display liest nun das niederwertigere Zeichennibble ein)
Anmerkungen:
Dieses Unterprogramm unterscheidet sich zum Unterprogramm LCDBEFEHL nur
dadurch, dass hier die Register-Select-Steuerleitung gesetzt ist, da mit diesem
Unterprogramm am LC-Display auszugebende Zeichen an das LC-Display
übertragen werden.
Das temporäre Register TEMP1 dient hier nur als Hilfsregister. Es wird hier nur
kurzzeitig verwendet und kann daher auch in anderen Unterprogrammen verwendet
werden.
4.3.4. Unterprogramm LCDBUSY
Aufgabe:
Dieses Unterprogramm prüft das Busy-Flag des LC-Displays, und verlässt es erst wenn
das Busy-Flag low ist, also wenn das LC-Display bereit für einen Befehl oder für ein
auszugebendes Zeichen ist.
Vorgehensweise:
- Der Datenport muss als Eingang definiert werden, da nun der Zustand
(insbesondere der Zustand des Busy-Flags) des LC-Displays gelesen wird. Dazu muss
aber in die Registerbank 1 des PIC gewechselt werden und anschließend wieder
zurück zur Registerbank 0.
- Register-Select-Steuerleitung löschen, da es sich hier um einen Befehl handelt.
- Read-Write-Steuerleitung setzen, da es sich hier um eine Leseanweisung handelt.
- Eine fallende Flanke auf der Enable-Steuerleitung durch Toggeln erzeugen. (Das
LC-Display gibt nun das höherwertigere Nibble auf den 4-Bit-Datenbus.)
- Den 4-Bit-Wert vom Datenbus einlesen und im Hilfsregister TEMP2 sichern.
- Eine weiter fallende Flanke auf der Enable-Steuerleitung durch Toggeln erzeugen.
(Das LC-Display gibt nun das niederwertigere Nibble auf den 4-Bit-Datenbus
- Den 4-Bit-Wert vom Datenbus einlesen und mit dem Hilfsregister TEMP2 zu einem
8-Bit-Wert verschmelzen.
- Das Busy-Flag (Bit 7 von TEMP2) überprüfen. Ist dieses Flag gesetzt, die soeben
durchgeführten Schritte so oft wiederholen bis das LC-Display das Busy-Flag löscht.
- Ist das Busy-Flag low, (also gelöscht) die Read-Write-Steuerleitung wieder
zurücksetzen und den Datenport wieder als Ausgang definieren. Dazu muss aber
wieder in die Registerbank 1 des PIC gewechselt werden und anschließend wieder
zurück zur Registerbank 0.
Anmerkung:
Das temporäre Register TEMP2 dient hier nur als Hilfsregister. Es wird hier nur
kurzzeitig verwendet und kann daher auch in anderen Unterprogrammen verwendet
werden.
4.3.5. Unterprogramm VERZ100US
Aufgabe:
Dieses Unterprogramm erzeugt eine Zeitverzögerung. Der Übergabeparameter (im w-
Register) gibt dabei an, wie oft eine Zeitverzögerung von 100µs erfolgen soll. Der
mögliche Zeitverzögerungsbereich liegt hier daher im Bereich von 100µs und 25,5ms
(=255 x 100us).
Anmerkung:
Die temporären Register TEMP1 und TEMP2 dienen hier nur als Übergabe- bzw. als
Hilfsregister. Diese Register werden hier nur kurzzeitig verwendet und können daher
auch in anderen Unterprogrammen verwendet werden.
Das Hilfsregister TEMP2 muss je nach verwendetem Takt mit unterschiedlichen
Werten geladen werden:
Takt Wert von TEMP2
-------------------------------
4 MHz 25
12 MHz 75
20 MHz 125

Autor: Buchgeher Stefan
Erstellt: 19. Februar 2004
Letzte Änderung: 23. Februar 2011