Arduino Mikrocontroller Tutorials - Module

LCD Display mit HD44780U Treiber IC

Bild Character LCD
Pinbelegung
1 VSS (Voltage Source) GND Spannungsversorgung
2 VDD (Voltage Drain) +5V Spannungsversorgung
3 VO (Contrast Control) analoge Spannung zwischen 0-5 V zur Kontrasteinstellung
4 RS (Register Select) Wählt zwischen Instruction Register (0=IR) und Data Register (1=DR)
5 RW (Read/Write) Auswahl ob vom LCD gelesen wird (RW=1) ober ob das LCD beschrieben wird (RW=0)
6 EN (Enable) Bei einem Wechsel von EN=HIGH auf EN=LOW werden die anliegenden Daten übernommen
7-14 D0 - D7 Data Bit 0 bis Data Bit 7
15 A Backlight +5V DC
16 K Backlight GND

LCD Buchstaben Displays gibt es in verschiedenen Größen. Meist werden 8x1 (Zeichen x Zeilen), 8x2, 16x2 oder 20x4 Displays eingesetzt. Auf diesen Displays lassen sich nur Zeichen ausgeben, die im entsprechenden Treiber IC wie dem HD44780U als Zeichensatz vordefiniert sind. Die Buchstaben und einige Sonderzeichen lassen sich per ASCII Code über die Datenleitungen auswählen.

Alle LCD Displays haben 14 bzw. mit Hintergrundbeleuchtung 16 Anschlüsse:

Der integrierte Interface IC hat zwei je ein Byte große Register die von außen beschrieben werden können. Das IR (Instruction Register) und das DR (Data Register). Die Auswahl des Registers erfolgt mit dem RS Pin (Register Select). Durch den Flankenwechsel des EN (Enable) Pins von HIGH auf LOW werden die in die Register geschriebenen Daten vom HD44780U übernommen und verarbeitet.

Instruction Register (RS=LOW)

Der hier vorgestellte Interface IC HD44780U kann Ein- oder Zwei-Zeilen Displays ansteuern. Über das erste Bit mit logischer '1', beginnend vom MSB, wird der Befehl ausgewählt (in der Tabelle blau gekennzeichnet). Teilweise können mit den nachfolgenden Stellen noch zusätzliche Optionen eingestellt werden (als X in der Tabelle dargestellt.)

Befehl D7 - D0 Beschreibung
Clear Display B00000001 Display löschen. Cursor wird oben links positioniert.
Return Home B00000010 Cursor wird oben links Positioniert (ohne den Displayinhalt zu löschen)
Entry Mode B000001XX 1= Schreibrichtung nach rechts
0= Schreibrichtung nach links

1= Displayinhalt wird bewegt
0= Cursor wird bewegt
Display Control B00001XXX 1= Display an, 0= Display aus
1=Cursor an, 0= Cursor aus
1= Cursor blinkt, 0= Cursor blinkt nicht
Cursor und Display Bewegung B0001XX00 0= Cursor bewegen, 1= Displayinhalt bewegen
1= nach rechts, 0= nach links
Function Set B001XXX00 1= 8-Bit Modus (D0-D7), 0= 4-Bit Modus (D4-D7)
1= zweireihiges Display, 0= einreihiges Display
1= Displayzeichen mit 5x10 dots, 0= Displayzeichen mit 5x8 dots
CGRAM (eigene Zeichen) B01XXXXXX Ein 64 Byte RAM Speicher steht zu speichern von eigenen Zeichen zur Verfügung. Bei einem Displayzeichen von je 8 Reihen können damit 8 Zeichen gespeichert werden. Auf die 8 Zeichen kann später mit dem ASCII Code 0-7 zugegriffen werden.
Speicheradresse 1. Zeichen: B01000000 - B01000111 | Speicheradresse 5. Zeichen: B01100000 - B01100111
Speicheradresse 2. Zeichen: B01001000 - B01001111 | Speicheradresse 6. Zeichen: B01101000 - B01101111
Speicheradresse 3. Zeichen: B01010000 - B01010111 | Speicheradresse 7. Zeichen: B01110000 - B01110111
Speicheradresse 4. Zeichen: B01011000 - B01011111 | Speicheradresse 8. Zeichen: B01111000 - B01111111
DDRAM (Cursor Position) B1XXXXXXX 0= Obere Zeile
1= Untere Zeile
Position 0-39 B10000000 - B10100111)
Position 0-39 B11000000 - B11100111)
Info:In einer Zeile können 40 Zeichen gespeichert werden wovon nur 16 Zeichen im Display ausgegeben werden. Durch das links und rechts schiften des Displayinhalts können die anderen Zeichen angezeigt werden.

Data Register (RS=HIGH)

Durch das parallele anlegen entsprechend logischer Pegel an den Datenleitungen (D0-D7) können Zeichen aus dem Treiber-IC Speicher ausgewählt werden. Die Bits an den Datenleitungen entsprechen weitestgehend dem ASCII Code. Über den ASCII Code 0 - 7 (was normalerweise Steuerzeichen entspricht die hier nicht verwendet werden) können 8 eigene, vorher gespeicherte Zeichen, ausgewählt werden.

Im IR kann über das Funktion-Set Byte definiert werden ob die Daten 8-Bit-weise übertragen werden oder um Leitungen einzusparen als 2x 4 Bit. Wird der 2x 4 Bit Modus gewählt werden zwei mal hintereinander die Eingänge D4-D7 gelesen, jeweils nach dem der EN-Pin von HIGH auf LOW geschaltet wurde. Die beiden Halbbytes (oder Nibble), beginnend mit dem höheren, werden intern wieder zusammengesetzt.

Im 4-Bit-Modus werden alle Daten und Einstallungen für das IR und RS als 8 Bit übertragen. Also immer 2x 4 Bit hintereinander. Ganz zu Beginn gibt es jedoch eine Ausnahmen. Mit '0010' muss zunächst auf den 4 Bit Modus umgestellt werden. Danach kommt noch einmal der vollständige 'Function Set' Befehlt mit '0010' und '1000' (für 4-Bit Übertragung und zweizeiligem Display)

Programmcode

// I/O Ports festlegen #define RS 3 #define RW 4 #define EN 5 byte dataLine[8] = {6, 7, 8, 9, 10, 11, 12, 13}; // Konstante definieren #define DR 1 #define IR 0 void setup() { pinMode(RS, OUTPUT); // 0=Instruction Register, 1=Data Register pinMode(RW, OUTPUT); // 0=Write, 1=Read digitalWrite(RW, LOW); // RW dauerhaft auf Write setzen pinMode(EN, OUTPUT); // 1-<0=Daten übernehmen for (byte i = 0; i < 8; i++) pinMode(dataLine[i], OUTPUT); // Konfiguration LCD datenSenden(IR, B00111000); // Function Set (8 Bit Übertragung, 2 Zeilen Display) datenSenden(IR, B00001110); // Display Control datenSenden(IR, B00000001); // Clear Display } void loop() { datenSenden(DR, 'H'); // H an Cursor Position schreiben datenSenden(IR, B11000111); // Cursor verschieben datenSenden(DR, 'X'); // X an Cursor Position schreiben datenSenden(IR, B10001111); // Cursor erneut verschieben datenSenden(DR, 'H'); // H an Cursor Position schreiben delay(2000); for (int i = 0; i < 5; i++) { datenSenden(IR, B00011000);} // Display Bewegen delay(1000); for (int i = 0; i < 5; i++) { datenSenden(IR, B00010000);} // Cursor bewegen delay(1000); //Eigenes Zeichen in CGRAM speichern //(nach jedem schreiben wird Adresse automatisch um 1 hochgezählt) datenSenden(IR, B01000000); // Ein Zeichen hat 8 Linien und 5 Spalten (Spalten=letzte 5 Bit) datenSenden(DR, B00001110); datenSenden(DR, B00001110); datenSenden(DR, B00000100); datenSenden(DR, B00000100); datenSenden(DR, B00011111); datenSenden(DR, B00000100); datenSenden(DR, B00001010); datenSenden(DR, B00001010); datenSenden(IR, B00000001); // Clear Display datenSenden(DR, 0); // ASCII 0=eigenes Zeichen schreiben datenSenden(IR, B00001100); // Cursor aus while (true); }
Funktion datenSenden() void datenSenden(bool reg, byte daten) { digitalWrite(RS, reg); for (byte i = 0; i < 8; i++) { digitalWrite(dataLine[i], bitRead(daten, i)); } digitalWrite(EN, HIGH); digitalWrite(EN, LOW); delay(20); // Wichtig, damit Display Zeit hat um die Daten zu verarbeiten }

Programmcode mit der Bibliothek LiquidCrystal.h

LiquidCrystal myLCD (RS, EN, D4, D5, D6, D7)

Erstellt eine Instanz von von LiquidCrystal und übergibt die entsprechenden Anschlusspins. Hier wird LiquidCrystal im 4-BitModus betrieben und der RW Pin des Displays ist hardwareseitig dauerhaft fuf Gnd gelegt (Write Modus)

myLCD.begin(Anzahl Stellen, Anzahl Zeilen)

Nimmt die Grundeinstellungen vor und muss als allererstes Kommando aufgerufen werden.

myLCD.clear()

Löscht das Display und setzt den Cursor links in die erste Reihe.

myLCD.home()

Setzt den Cursor ganz links in die ersten Reihe. Ohne den Displayinhalt zu löschen.

myLCD.setCursor(Stelle, Zeile)

Setzt den Cursor an die entsprechende Stelle (0= vorderste Stelle) in der entsprechenden Zeile (0= oberste Zeile). Je Zeile kann der Cursor an 40 Stellen (0-39) gesetzt werden. Wenn der Displayinhalt mit scrollDisplayLeft() oder scrollDisplayRight() noch nicht bewegt wurde werden standardmäßig die ersten 16 Stellen angezeigt.

myLCD.cursor() und myLCD.noCursor()

Mit diesen Befehlen wird der Cursor als Unterstrich an der Stelle an der als nächste geschrieben werden soll angezeigt. Mit noCursor() wird der Unterstrich wieder ausgeblendet.

myLCD.blink() und myLCD.noBlink()

Mit diesem Befehl wird der Cursor als blinkendes Rechteck an der Stelle angezeigt, an der als nächstes geschrieben wird. Mit noBlink() wird das blinkende Rechteck wieder ausgeschalten.

myLCD.display() und myLCD.noDisplay()

Mt diesen Befehlen kann der Displayinhalt aus und wieder eingeschaltet werden. Im ausgeschalteten Zustand bleibt der Inhalt gespeichert. Die Hintergrundbeleuchtung bleibt auch im ausgeschalteten Modus an.

myLCD.scrollDisplayLEFT() und myLCD.scrollDisplayRight()

Durch diese Befehle kann der sichtbare Ausschnitt (die 16 derzeit angezeigten Stellen) nach links oder rechts bewegt werden.

myLCD.autoscroll() und noAutoscroll()

Mit autoscroll()kann auf einer Displaystelle geschrieben werden. Anstatt dass sich der Cursor weiterbewegt bewegt sich mit diesen Befehlen der ganze Displayinhalt. Mit noAutoscroll() wird wieder auf die Cursor Bewegung geschalten.

leftToRight() und rightToLeft()

Legt die schreibrichtung fest. Also die Bewegung des Cursors nach dem ein Buchstabe geschrieben wurde.

myLCD.write() und myLCD.print()

Mit diesen Befehlen können einzelne Zeichen (character) oder ganze Strings auf das display übertragen werden.

#include "LiquidCrystal.h" // I/O Ports festlegen #define RS 3 #define EN 5 #define D4 10 #define D5 11 #define D6 12 #define D7 13 LiquidCrystal LCD (RS, EN, D4, D5, D6, D7); void setup() { LCD.begin(16, 2); LCD.clear(); } void loop() { LCD.write('H'); LCD.print("allo"); while (true); }