Hardware
Viele heute verwendete alphanumerischen LC-Displays (sieheAVR Thermometer) für ein Beispiel) basieren auf einem HD44780- oder einem kompatiblen Controller. Sie eigenen sich gut für die Verwendung mit einem Mikrocontroller, da sie über ein einfach anzusteuerndes paralleles Interface verfügen. Sie zeigen Buchstaben, Zahlen und einige Sonderzeichen in 5 × 7 Pixeln an, d.h. der Zeichensatz ist fest definiert. Zusätzlich kann das Aussehen von bis zu 8 Zeichen vom Benutzer festgelegt werden.
I/O-Pins
Im folgenden eine Übersicht der I/O-Pins mit den Bezeichnungen, wie sie üblicherweise in den Datenblättern verwendet werden.
D0 - D7 Bidirektionale Datenleitungen
RS Auswahl des Daten- bzw. Befehlsregisters
low: Ist das Display im Schreibmodus, so werden die Befehle an das
Display in das Instruction Register geschrieben. Ist es im Lesemodus,
so kann der Busy-Flag und der Addresss-Counter ausgelesen werden.
high: Das Daten-Register zum Lesen bzw. Schreiben des Displayinhalts
wird angesprochen.
R/W Mit dieser Leitung wird festgelegt, ob Daten aus einem der Register
gelesen bzw. in eines der Register geschrieben werden soll.
high: Lesen des ausgewählten Registers
low: Schreiben in das ausgewählte Register
E Dieser Pin dient dazu, einen Takt für die Datenübertragung vorzugeben.
low → high: Es wird der Zustand der RS- und R/W-Leitungen eingelesen
und falls geschrieben wird, der Zustand der Datenleitungen übernommen.
high → low: Wird gelesen, so liegen die Daten bis zu diesem Übergang
korrekt an den Datenleitungen an.
VCC Versorgungsspannung, meistens 5 Volt
GND Masse-Anschluss
VEE Kontrast-Spannung. Der Kontrast wird üblicherweise durch ein Poti
zwischen VCC und GND eingestellt, dessen Schleifer an VEE hängt.
Achtung: Es gibt auch Displays, die eine negative Kontrastspannung
benötigen, also genau im Datenblatt nachschauen.
Ansteuerung
Die Displays lassen sich über ein 4- oder 8-Bit-Datenbus (Pins D4
- D7
bzw. D0
- D7
) und 3 weitere Leitungen (RS
, E
, R/W
) steuern. Die
Datenbusbreite läßt sich während der Initialisierung durch die MCU festlegen. Damit kann man einige I/O-Pins sparen und
das Display komplett über einen 7 Bit breiten Port des Mikrocontrollers
ansteuern. Da im 4-Bit-Modus jeder Buchstabe und jeder Befehl mit zwei Takten
übertragen wird, ist die Ansteuerung etwas langsamer, was aber normalerweise
nicht weiter stört.
Zur Übertragung von Daten im 8-Bit-Modus werden die entsprechenden Signale auf
die Datenleitungen D0
- D7
, R/W
und RS
gelegt. Nun wird der Pegel von
E
von low auf high und wieder auf low geändert. Dabei übernimmt das Display
die Daten mit der fallenden Taktflanke. Sollen Daten gelesen werden, wird der
Pegel von E
von low auf high geändert, nun die Daten ausgelesen und der Pegel
von E
wieder zurück auf low gesetzt. Im 4-Bit-Modus wird ebenso verfahren,
wobei hier zunächst das höherwertige Nibble (Bits 4-7) und dann im zweiten
Schritt das niederwertige Nibble (Bits 0 - 3) übertragen wird.
Befehlssatz
Neben den Codes zur Darstellung des Displayinhalts gibt es einige Kommandos, mit denen das Display gesteuert werden kann. Hierbei handelt es sich um Befehle zum Ein- und Ausschalten, Positionieren des Cursors, etc.
In den Angaben zu den einzelnen Pins bedeutet 1 ein high-Pegel, also ein
5-Volt-Signal und 0 entsprechend einen low-Pegel. Wo ein *
steht, ist es egal,
welches Signal anliegt. Dort, wo ein Buchstabe steht, ist die Funktion dieses
Signals in der Beschreibung erläutert.
Display löschen bzw. zurücksetzen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 0 1
Der Displayinhalt wird gelöscht und der Cursor auf die erste Position in der ersten Zeile gesetzt.
Cursor auf Startposition setzen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 1 *
Der Cursor wird auf die Startposition gesetzt. Falls der Displayinhalt geshiftet wurde, wird auch der Shift zurückgesetzt.
Cursor-Richtung und Display-Shift
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 1 CD S
Dieser Befehl legt die Bewegungsrichtung des Cursors (CD=0
: Bewegung nach
links, CD=1
: Bewegung nach rechts) und den Display-Shift (S=0
: kein Shift,
S=1
: Display-Inhalt wird geshiftet) fest. Shift bedeutet, dass der gesamte
Inhalt des Displays um eine Position verschoben wird.
Display-Zustand
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 1 P C B`
Mit diesem Befehl kann das Display ein- oder ausgeschaltet werden (P=0
:
Display aus, P=1
: Display an), es kann der Cursor angezeigt werden (C=0
:
Cursor aus, C=1
: Cursor an) und es kann der Cursor blinkend dargestellt werden
(B=0
: ständig sichtbarer Cursor, B=1
: blinkender Cursor).
Cursor-Funktion
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 M SD * *
Mit diesem Befehl wird festgelegt, ob beim Schreiben eines Zeichens der Cursor
bewegt werden soll, oder ob der Display-Inhalt geshiftet werden soll (M=0
:
Cursor bewegen, M=1
: Display shiften) und, in welche Richtung geshiftet werden
soll (SD=0
: nach links shiften, SD=1
: nach rechts shiften)
Display-Einstellungen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 BW N F * *
Es kann festgelegt werden, ob die Daten in 2 mal 4-Bit-Häppchen oder auf einmal
als 8-Bit-Happen übertragen werden, (BW=0
: 4-Bit-Bus, BW=1
: 8-Bit-Bus),
wieviele Zeilen das Display anzeigt (N=0
: 1 Zeile, N=1
: 2 Zeilen) und
welcher Font verwendet wird (F=0
: 5 × 7 Punkte, F=1
: 5 × 10 Punkte)
Adresse im Zeichenerzeugungsspeicher setzen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 A5 A4 A3 A2 A1 A0
Es wird festgelegt, dass beim Schreiben in das Datenregister mit dem nächsten Befehl an der angegebenen Adresse in den Speicher der Zeichenerzeugung geschrieben wird (um eigene Zeichen zu definieren).
Adresse im Datenspeicher setzen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 A6 A5 A4 A3 A2 A1 A0
Es wird festgelegt, dass beim Schreiben in das Datenregister mit dem nächsten Befehl an der angegebenen Adresse in den Speicher geschrieben wird, in dem der Display-Inhalt abgelegt ist.
Busy-Flag und Adress-Zähler auslesen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 1 BF A6 A5 A4 A3 A2 A1 A0
Es werden der Busy-Flag (BF=0
: Display kann Befehl entgegennehmen, BF=1
:
Display ist beschäftigt) und der Addresscounter des zuletzt angesprochenen
Speichers ausgegeben.
Speicher beschreiben
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 0 D7 D6 D5 D4 D3 D2 D1 D0
Die anliegenden Daten werden in den zuletzt ausgewählten Speicher geschrieben.
Speicher auslesen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 1 D7 D6 D5 D4 D3 D2 D1 D0`
Es werden die Daten aus dem ausgewählten Speicher an der zuletzt festgelegten Adresse ausgegeben.
Timing
Fast alle an das Display übermittelten Befehle benötigen 40us zur Ausführung. Ausnahmen sind die Befehle "Löschen bzw. zurücksetzen des Displays" und "Cursor auf Startposition setzen". Diese benötigen 1,64ms zur Ausführung. Diese Zeiten gelten für alle Displays, sofern diese intern mit einer Frequenz von 250kHz arbeiten. Mir sind bisher aber keine Ausnahmen dazu bekannt. Es kann aber immer anhand des Busy-Flag festgestellt werden, ob bereits ein weiterer Befehl übermittelt werden kann.
Benutzerdefinierte Zeichen
Es können 8 benutzerdenifierte Zeichen mit den Zeichencodes 0 bis 7 festgelegt werden. Die Pixeldaten der Zeichen werden dazu in den Speicher des Zeichengenerators geschrieben. Jedes Zeichen benötigt 8 Bytes, wobei jeweils nur die Bits 0 bis 4 entsprechend den 5 Pixeln in einer Zeile relevant sind. Das erste Byte beschreibt die oberste Zeile, das letzte die unterste.
Initialisierung des Displays
Nach dem anlegen der Betriebsspannung bzw. nach einem Reset der MCU muss das Display in einen definierten Zustand gebracht werden. Dazu wird folgende Prozedur durchgeführt:
- Nach dem anlegen der Betriebsspannung ca. 15 ms warten, bis das Displays bereit ist, Befehle entgegenzunehmen
- Den Befehl 0x30 ("Display-Einstellungen") dreimal hintereinander schreiben und jeweils 1,64ms warten (die Abfrage des Busy-Flag ist hier noch nicht möglich). Das Display ist hier noch nicht im 4-Bit-Modus, daher wird nur das höherwertige Nibble (Bits 4-7) übertragen, falls nicht alls 8 Datenleitungen angeschlossen worden sind.
- Falls auf 4-Bit umgestellt werden soll, nun den Befehl dazu geben
- Display löschen
Zeichensatz
Der Zeichensatz dieser Displays entspricht im Wesentlichen dem ASCII-Zeichensatz. Damit liegen die Ziffern '0' - '9' zwischen 0x30 und 0x39, die Großbuchstaben 'A' - 'Z' zwischen 0x41 bis 0x5A und die Kleinbuchstaben 'a' - 'z' zwischen 0x61 bis 0x7A. Die anderen Zeichen können sich je nach Hersteller unterscheiden und sind deshalb am besten im Datenblatt des Chips bzw. des Displays nachzuschlagen.