HD44780 LC-Display

Hardware

Viele heute verwendete alphanumerischen LC-Displays (siehe hier für ein Beispiel eines solchen Displays) basieren auf einem HD44780- (oder 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. Ausserdem kann das Aussehen von 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
lo 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
hi 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
hi Lesen des ausgewählten Registers
lo Schreiben in das ausgewählte Register
E Dieser Pin dient dazu, einen Takt für die Datenübertragung vorzugeben.
lo → hi Es wird der Zustand der RS- und R/W-Leitungen eingelesen und - falls geschrieben wird - der Zustand der Datenleitungen übernommen
hi → lo 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, D/W und RS gelegt. Nun wird der Pegel von E von lo auf hi und wieder auf lo geändert. Dabei übernimmt das Display die Daten mit der fallenden Taktflanke. Sollen Daten gelesen werden, wird der Pegel von E von lo auf hi geändert, nun die Daten ausgelesen und der Pegel von E wieder zurück auf lo 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 hi-Pegel, also ein 5-Volt-Signal und 0 entsprechend einen lo-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=2: 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 der 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.

Verwandte Themen

Werbung

Metadaten