HD44780

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Der HD44780 ist ein Steuer-IC für Textdisplays (siehe LCD). Praktisch alle Textdisplays werden mit diesem oder einem kompatiblen Controller (z. B. KS0066) angesteuert.

Allgemeine Ansteuerung

Pinbelegung

Die Pinbelegung des ICs selber ist für den Anwender praktisch uninteressant. Hier ist die häufigste Anschluss-Belegung der damit ausgestatteten LCD-Module angegeben.

ACHTUNG: Es gibt Displays mit abweichender Anschluss-Belegung, falscher Anschluss kann zur Zerstörung führen! Daher immer das zugehörige Datenblatt zu Rate ziehen.

Pin Funktion Beschreibung
1 USS GND, Bezugspotenzial 0 Volt
2 UCC, VDD Speisespannung + 5 Volt, ≈ 1 mA
3 U0 Kontrastspannung, zwischen UCC und USS, typisch 0…1 V, kann auf USS gelegt oder via Potentiometer (Richtwert 10 kΩ) angeschlossen werden.
Bei großflächigen LCDs oder LCDs für den erweiterten Temperaturbereich kann auch eine negative Kontrastspannung im Bereich von 0…−5 V nötig sein.
4 RS Register Select, Registerauswahl
0 = Befehlsregister, 1 = Datenregister
5 R/W Read/Write, Lese- oder Schreibzugriff; kann fest auf GND gelegt werden, wenn Busy-Auswertung durch Warten ersetzt wird
0 = Schreiben, 1 = Lesen
6 E Enable, Freigabe- und Taktleitung (Achtung! Diese Leitung hat im Gegensatz zu den anderen bei einigen Displays keinen internen Pullup, man muss also einen externen vorsehen, falls man mit Open-Drain-Ausgängen arbeitet.)
7 DB0 Datenleitung (bleibt im 4-Bit-Modus offen)
8 DB1 Datenleitung (bleibt im 4-Bit-Modus offen)
9 DB2 Datenleitung (bleibt im 4-Bit-Modus offen)
10 DB3 Datenleitung (bleibt im 4-Bit-Modus offen)
11 DB4 Datenleitung
12 DB5 Datenleitung
13 DB6 Datenleitung
14 DB7 Datenleitung
15 A Anode der LED-Hintergrundbeleuchtung (fakultativ)
16 K Katode der LED-Hintergrundbeleuchtung (fakultativ)
Es gibt auch Displays ohne die Datenleitungen DB0–3 (werden nur im 4-Bit-Modus angesteuert), dann rutschen die Bezeichnungen entsprechend nach unten.

Speicher

Ein HD44780 besitzt mehrere Speicher. In ihnen wird der Inhalt des Displays sowie das Aussehen von benutzerdefinierten Sonderzeichen gespeichert.

CGROM

Der Character Generator ROM enthält die Zeichen in Form von 5×8- oder 5×10-Punktmatrizen. Er kann nicht geändert werden, außer man sendet einen EEPROM zu Hitachi für eine Massenproduktion. Es sind viele verschiedene ROMs (Zeichensätze, engl. fonts) verfügbar. Er ist für den Anwender nicht zugänglich.

CGRAM

Im Character Generator RAM können acht 5×8 Pixel oder vier 5×10 Pixel große benutzerdefinierte Zeichen abgelegt werden. Braucht man keine benutzerdefinierten Zeichen, kann man diesen Bereich als Auslagerungsspeicher für den ansteuernden Mikrocontroller benutzen. Dazu muss aber die R/W-Leitung angesteuert werden.

DDRAM

Im Display Data RAM ist der Inhalt des LCDs gespeichert. Die Kodierung orientiert sich weitestgehend am ASCII-Zeichensatz.

Das DDRAM hat üblicherweise mehr Speicherstellen als das Display gleichzeitig anzeigt. Durch Anwenden der Display-Shift-Befehle können die nicht sichtbaren Zeichen zur Anzeige gebracht werden.

Benachbarte Zeichen haben im DDRAM nicht zwangsweise auch aufeinanderfolgende Adressen. So ist etwa bei 1×16-Displays (1 Zeile, 16 Zeichen) oft in der Mitte des Displays ein Adresssprung von 0x07 auf 0x40; bei 2×16-Displays ist der Sprung auf 0x40 normalerweise (programmiererfreundlich) zwischen Ende der ersten und Beginn der zweiten Zeile. Näheres ist dem Datenblatt zu entnehmen.

Kommandos

HD44780-Befehlssatz
Befehl RS RW D7 D6 D5 D4 D3 D2 D1 D0
Bildschirminhalt löschen 0 0 0 0 0 0 0 0 0 1
Cursor auf Startpos 0 0 0 0 0 0 0 0 1 X
Modus festlegen 0 0 0 0 0 0 0 1 I/D S
Display/Cursor 0 0 0 0 0 0 1 D C B
Cursor/Display schieben 0 0 0 0 0 1 S/C R/L X X
Funktionen 0 0 0 0 1 DL N F X X
CGRAM-Adresse setzen 0 0 0 1 CGRAM-Adresse
DDRAM-Adresse setzen 0 0 1 DDRAM-Adresse
Adresse/Status lesen 0 1 BF CG-/DDRAM-Adresse
Daten in DDRAM/CGRAM schreiben 1 0 Daten
Daten aus DDRAM/CGRAM lesen 1 1 Daten


Kodierung der Steuerbits
Bit 0 1
I/D Cursorposition dekrementieren Cursorposition inkrementieren
S Displayinhalt fest Displayinhalt weiterschieben
D Display aus Display an
C Cursor aus Cursor an
B Cursor blinkt nicht Cursor blinkt
S/C Cursor bewegen Displayinhalt schieben
R/L Nach links schieben Nach rechts schieben
DL 4-Bit-Interface 8-Bit-Interface
N 1-zeiliges Display 2/4-zeiliges Display
F 5×7-Font 5×10-Font
BF Kann Kommandos annehmen Ist beschäftigt

Ansteuerung per Mikrocontroller

Die Ansteuerung eines HD44780-basierten Displays gestaltet sich sowohl in Bezug auf den Hardware- als auch den Softwareaufwand recht einfach. Sie eignet sich somit sehr gut als Übungsprojekt für Anfänger.

Das HD44780-Interface besteht aus acht Datenleitungen (D0–D7) sowie den drei Steuerleitungen RS (Register Select), R/W (Read/Write) und E (Enable). Die Displays werden mit 5 Volt Betriebsspannung versorgt, die Kontrastspannung V0 bekommt man, indem man ein 10-kΩ-Potentiometer zwischen VCC und GND anschließt und den mittleren Anschluss als Kontrastspannung verwendet. Bei ca. 0,5 Volt werden dann die Pixel sichtbar. Optional haben viele Displays noch eine LED-Beleuchtung eingebaut; diese kann manchmal direkt an 5 V angeschlossen werden, falls der Vorwiderstand auf der LCD-Platine integriert ist. Oft ist aber auch ein externer Vorwiderstand nötig! Darum vorher besser im Datenblatt nachschauen.

Möchte man IO-Pins am Mikrocontroller sparen, kann das Display im 4-Bit-Modus betrieben werden, die Dateneingänge D0 bis D3 bleiben dann offen. Durch zusätzliche Bauteile (AVR-Tutorial: Schieberegister) kann die Zahl der benötigten Port-Pins noch weiter reduziert werden.

Beispielprogramme zur Ansteuerung findet man zuhauf im Internet, u. a. auch hier: AVR-Tutorial: LCD und AVR-GCC-Tutorial: LCD-Ansteuerung.

Fertige Projekte oder Bibliotheken

Sonderzeichen

\40  ! \41 " \42 # \43 $ \44  % \45 & \50 ( \51 ) \52 * \53 Plus-Zeichen
\54 Komma \55 Minus-Zeichen \56 Punkt \57 Schrägstrich \72 Doppelpunkt \73 Semikolon \74 < \75 Gleichheitszeichen \76 > \77  ?
\100 @ \134 eckige Klammer links \136 eckige Klammer rechts \137 accent circonflexe \138 Unterstrich \140 accent grave \173 geschweifte Klammer links \174 senkrechter Strich \175 geschweifte Klammer rechts \176 Pfeil nach rechts
\177 Pfeil nach links \260 Minuszeichen \333 Kastenrahmen \337 hochgestellter Kastenrahmen(wie Potenz) \340 gr. alpha \341 ä \342 β (als ß brauchbar) \343 ε klein epsilon \344 µ \350 √ Wurzelzeichen
\351 hoch minus 1 \353 hoch x \356 ñ (spanisch) \357 ö \363 ∞ Zeichen unendlich \364 Ohm \365 ü \366 Σ gr.Summe \367 π (klein) \371 u mit strich rechts unten
\375 geteilt durch \377 alle Leuchtpunkte eingeschaltet

Für die 5 Kleinbuchstaben mit Unterlänge 'g', 'j', 'p', 'q' und 'y' stehen mit Offset 80h solche mit tatsächlicher Unterlänge zur Verfügung.

Im 7-Bit-ASCII-Bereich passen nur die Zeichen '\' (Backslash) und '~' (Tilde) nicht. Zur Wiedergabe portabler ASCII-Daten (typischerweise aus externer Quelle, etwa Dateinamen einer SD-Karte oder SMS-Text) muss man diese beiden Kodepositionen in 2 der 8 möglichen benutzerdefinierten Zeichen transkodieren.

Wie nutzt man diese Sonderzeichen in C oder C++?

Angegeben sind die Oktalnotationen der Sonderzeichen. Diese bettet man dreistellig in den String ein: "\3502" ergibt √2 auf der Anzeige und belegt 2 Bytes (mit der terminierenden Null 3 Bytes) im Programm- bzw. Datenspeicher.

Ist diese Notation für häufig benutzte Symbole zu unleserlich oder lästig, nutzt man die compilerseitige Stringkonstanten-Verkettung:

   #define WURZEL "\350"
   ...
     emit (WURZEL "2")
   // dasselbe wie emit ("\350" "2") und dasselbe wie emit ("\3502")
   // Das Leerzeichen zwischen WURZEL und "2" ist nicht erforderlich.

Damit "√2" im Programmquelltext funktioniert, ist 1. der Quelltext in UTF-8 zu schreiben und 2. eine UTF-8-zu-HD44780-Konvertierroutine zu schreiben. Das kommt allenfalls für größere Mikrocontroller in Frage.

Benutzerdefinierte Sonderzeichen

Mit den benutzerdefinierten Sonderzeichen steht für 8 Zeichenpositionen Vollgrafik zur Verfügung, so dass sich bspw. einfache Signalverläufe in einem 40×8-Pixel-Feld darstellen lassen.

Siehe auch

Weblinks