HD44780 LC-Display

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.

LinkedIn logo mail logo