HD44780
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.
Inhaltsverzeichnis
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 | Bezugspotenzial 0 Volt |
2 | UCC | Speisespannung + 5 Volt, ≈ 1 mA |
3 | U0 | Kontrastspannung, zwischen UCC und USS, typisch 0..1 V, kann auf USS gelegt oder via Potenziometer (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 | Registerauswahl 0 = Befehlsregister, 1 = Datenregister |
5 | R/W | Lese- oder Schreibzugriff; kann fest auf GND gelegt werden, wenn Busy-Auswertung durch Warten ersetzt wird 0 = Schreiben, 1 = Lesen |
6 | E | 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 dann entsprechend nach unten |
Speicher
Ein HD44780 besitzt mehrere Speicher. In ihnen wird der Inhalt des Displays sowie das Aussehen von Sonderzeichen gespeichert.
CGROM
Der Character Generator ROM enthält die Zeichen in Form von 5x8 oder 5x10 Punktmatrizen. Er kann nicht geändert werden, ausser 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 5x8 Pixel oder vier 5x10 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 1x16-Displays (1 Zeile, 16 Zeichen) oft in der Mitte des Displays ein Adresssprung von 0x07 auf 0x40; bei 2x16-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
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 |
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 Microcontroller
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 5V Betriebsspannung versorgt, die Kontrastspannung V0 bekommt man, indem man ein 10kΩ-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 5V angeschlossen werden, da 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
- Peter Fleurys LCD library for HD44780 based LCDs
- avr-libc Demo-Projekt für stdio
- Grundlagen und Code für 8051 von Erik Buchmann
- How to control a HD44780-based Character-LCD von Peter Ouwehand. Beispiele für 8051, PIC16C54, AT90S2313
- Firma wickenhäuser 8051 Compiler und Treiber für LCDs
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
- Benutzerspezifische Zeichen für den HD44780 mit dem Font and Bitmap Generator erstellen
- http://www.parallax.com/ProductInfo/Microcontrollers/BASICStampSoftware/LCDCharacterCreator/tabid/482/Default.aspx
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
- AVR-GCC-Tutorial/LCD-Ansteuerung
- Erweiterte LCD-Ansteuerung
- Pseudo-Graphische LCD-Ansteuerung
- Forumsbeitrag: Ermittlung der Startadresse der einzelnen Zeilen
- Forumsbeitrag: HD44780 Extender, transparente Serialisierung der Ansteuerung im 4 oder 8 Bit Modus
- Custom Character Generator for HD44780 LCD Modules
- Online led matrix font generator with binary and hex codes for Arduino