Dot-Matrix-LC-Displays

Dot-Matrix-LC-Displays werden heutzutage überall dort eingesetzt, wo sich Informationen am einfachsten durch Texte und/oder Grafiken weitergeben lassen.
Einen sehr großen Anteil machen Intelligente Textdisplays aus, die einen eigenen Controller haben, der das Display "verwaltet". Soll heißen, man muss sich nicht um jeden Pixel einzeln kümmern, sondern füttert den Controller nur noch mit Daten, die er dann für das Display aufbereitet und weitergibt.

Aber wie funktioniert das Ganze?
Nun, im Endeffekt funktionieren LC-Display nach dem gleichen Prinzip:
Der Controller "scannt" (mit oder ohne der Hilfe von externen Zählern) die einzelnen Spalten des Displays ab und gibt gleichzeitig anzuregenden Zeilen ein Signal, sodass die Flüssigkristalle an diesen Stellen angeregt werden. Je nach dem, wie die Flüssigkristalle angeregt werden, verändern sie die Polarisation des Lichtes. Über zwei Polarisationsfolien, die sich jeweils oberhalb und unterhalb der "Glasplatte" befinden, wird nur Licht einer bestimmten Polarisation durchgelassen. Wird die Polarisation durch die Flüssigkristalle verändert, kommt kein Licht mehr durch und die Stelle ist dunkel.

Das zur groben Funktionsweise des LC-Displays.

Der für uns wichtigere Teil an "intelligenten" LC-Displays ist der Controller. Er übernimmt die so ziemlich wichtigste Arbeit an LCD-Modulen:
Er bietet ein (meist) leicht zugängliches Interface zur Ansteuerung, speichert die gesetzten Daten zwischen und gibt sie schließlich an das LCD aus.
Dazu kommen Features, wie Zeichengeneratoren, die die Arbeit mit den Modulen erleichtern - man muss die Zeichen nicht mehr selbst erstellen und spart dadurch wertvollen Speicher (besonders bei Mikrocontrollern). Zudem werden die Übertragungszeiten auf ein angenehmes Minimum verkleinert.

Einen der bekanntesten Controller für LCDs ist wohl der HD44780 von Hitachi, der speziell für Text-Display entwickelt wurde. In der Kette der Text-LCD-Controller reihten sich auch Samsung mit dem LSI KS0070B bzw. KS0076B und Toshiba mit dem T6961 ein (um nur die zwei bekanntesten zu nennen). Die beiden Hersteller nahmen sich den HD44780 als Vorbild, wodurch kompatible und teilweise sogar schnellere Controller entstanden sind.

Bei Grafik-LCDs ist der wohl bekannteste Controller Toshibas T6963, der bei einem sehr weiten Spektrum von LC-Displays eingesetzt wird. Aber auch Epson/Seiko (z. B. SED1520, SED1530 oder auch welche mit exotischeren Namen wie S1D15G14) und auch Phillips (z. B. PCF8544, allgemein viele I²C-Produkte) stellen Controller für Grafik-LCDs her. Diese haben meistens keine Zeichengeneratoren, was eigentlich sehr schade ist, dafür aber das Einsatzspektrum der ICs vergrößert (zu welchem Preis? *fg*).


Um etwas konkreter zu werden, gehe ich nun speziell auf Textbasierte LC-Display ein, da sie besonders für den Einsatz am PC interessant sind.

Die oben genannten Controller besitzen eigentlich immer einen Speicher von 80 Zeichen. Dies reicht für Displays bis 4x20 (4 Zeilen mit je 20 Zeichen).
Darüber werden meist 2 Controller "parallel" geschaltet. Damit sind Displays bis 4x40 möglich. Die Displayhälften sind je nach dem in links und rechts oder oben und unten aufgeteilt.
Hier eine kleine Übersicht der üblichen Displaygrößen:

1x08 1 Controller
2x08
1x16
2x16
4x16
2x20
4x20
2x24
4x40 2 Controller

Natürlich gibt es auch Exoten wie 4x27 oder 8x24, was allerdings eher Seltenheiten sind. Ab und zu bei Pollin vorbeischauen lohnt sich.

Die technischen Daten der Displays sind meist in diesem Rahmen:

Bezeichnung: Kürzel: Bedingung: Standard-Werte:
Minimum Normal Maximum
Versorgungs-
spannung:
Vdd 5V-LCDs 4,7 5,0 5,5 V
3V-LCDs 2,7 3,0 5,3 V
Stromaufnahme: Idd 5V 1,6   <10 mA

Zur Ansteuerung haben die Displays einen 8 Bit breiten Datenport und zusätzlich 3 Steuerleitungen.
Das ist eigentlich schon eine haushohe Einladung, solche Displays an die parallele Schnittstelle anzuschließen:

Anschluss des Displays am Parallelport
Sämtliche Widerstände (außer R13) haben einen Wert von 1kOhm. Sie sind zwar kein muss, ich empfehle sie aber, da sie den Betrieb nicht beeinflussen, allerdings die parallele Schnittstelle vor ungewollten Kurzschlüssen schützt. Den EAGLE-Schaltplan sowie das Layout gibt es im Downloadbereich.

Für alle Textbrowser-Benutzer sei diese Tabelle:

Display 25 Pol-SubD-Stecker
1 Vss GND/Masse 18-25 Masse
2 Vdd +5V --  
3 Vo Kontrastspannung --  
4 RS Registerauswahl 16 Init
5 R/W Lesen/Schreiben 14 Autofeed
6 E Daten übernehmen 1 Strobe
7 DB0 Datenbus (DB0-DB7 für 8 Bit-Betrieb, DB4-DB7 für 4 Bit-Betrieb) D0 Daten
8 DB1 D1
9 DB2 D2
10 DB3 D3
11 DB4 D4
12 DB5 D5
13 DB6 D6
14 DB7 D7
15 A/Vee 4,2V LED-Versorgungsspannung
16 K GND/Masse für LED-Backlight

 

Ok, Hardwareseitig war's das.
Jetzt geht es zur Ansteuerung.
Hier scheiden sich (zumindest am PC) die Wege: Die meisten nehmen zu jaLCDs, viele LcdHype und noch ein paar andere wählen LCDSmartie.

Ich habe mich für keine der verschiedenen Möglichkeiten entschieden, da ich selber etwas auf die Beine stellen wollte.
Also wird der Befehlssatz des Controllers (wie oft verwende ich das Wort eigentlich noch?) interessant:

Befehl RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
Display löschen 0 0 0 0 0 0 0 0 0 1
Cursor an Anfang 0 0 0 0 0 0 0 0 1 x
Entry mode set 0 0 0 0 0 0 0 1 I/D S
Display an/aus 0 0 0 0 0 0 1 D C B
Cursor/Display shift 0 0 0 0 0 1 S/C R/L x x
Function Set 0 0 0 0 1 DL N F x x
CG-RAM Adresse setzen 0 0 0 1 CG-RAM Adresse
DD-RAM Adresse setzen 0 0 1 DD-RAM Adresse
Busy Flag/Adresse lesen 0 1 BF Adresszähler für CG-RAM bzw. DD-RAM
Daten in CG-/DD-RAM schreiben 1 0 Zu schreibende Daten
Daten aus CG-/DD-RAM lesen 1 1 Gelesene Daten

Beschreibung:

Cursor an Anfang
Setzt den Adresszähler des DD-RAMs auf Adresse 0. Der Inhalt des DD-RAMs bleibt unverändert.
Der Cursor wird an die erste Position der ersten Position der ersten Zeile gesetzt.

Entry mode set
I/D:  1 = Adresspointer inkrementieren, 0 = Adresspointer dekrementieren
S:    1 = Displayinhalt schieben, 0 = Displayinhalt nicht schieben
Schreiben in DD-RAM verschiebt den Displayinhalt, DD-RAM lesen verschiebt nicht.
Der Cursor bleibt an derselben Stelle
Lesen oder schreiben in den CG-RAM hat keinen Einfluss auf den Displayinhalt.

Display an/aus
D:    1 = Display an, 0 = Display aus
C:    1 = Cursor an, 0 = Cursor aus
B:    1 = Zeichen unter Cursor blinkt, 0 = Blinken aus

Cursor/Display shift

S/C R/L Funktion
0 0 Verschiebt den Cursor um eine Stelle nach links, ohne den DD-RAM zu verändern
0 1 Verschiebt den Cursor um eine Stelle nach rechts, ohne den DD-RAM zu verändern
1 0 Verschiebt den Displayinhalt um eine Stelle nach links, ohne den DD-RAM zu verändern
1 1 Verschiebt den Displayinhalt um eine Stelle nach rechts, ohne den DD-RAM zu verändern

Function Set
Die Datenbusbreite, Anzahl Zeilen und der Zeichensatz können nur während der Initialisierungsphase des Controllers gesetzt werden!
DL:   1 = 8-bit Interface, 0 = 4-bit Interface
N:    1 = 2 Zeilen Display, 0 = 1 Zeilen Display
F:    1 = 5x10 Zeichensatz, 0 = 5x7 Zeichensatz

Busy Flag und Adresse lesen
BF:   1 = Controller arbeitet eine interne Operation ab, 0 = Controller akzeptiert neue Instruktionen
Das Busy Flag sollte vor jeder Schreiboperation ausgelesen werden, um sicherzustellen, dass der Controller bereit ist.

Daten aus CG-/DD-RAM schreiben
Es werden 8-Bit Daten zum CG- oder DD-RAM geschrieben. Das Ziel des Transfer hängt davon ab, ob der Befehl Set CG-RAM Adresse setzen oder DD-RAM Adresse setzen verwendet wurde. Die Adresse wird bei jedem Schreibvorgang automatisch inkrementiert (I/D = 1) bzw. dekrementiert (I/D = 0).

Beim Lesen der CG- bzw. DD-RAM-Daten verhält sich das Display genauso. Diese Funktion ist allerdings nicht so interessant wie manch andere ;).


Damit die Adresse des DD-RAMs bei jedem Display richtig gesetzt werden kann, hier eine kleine Tabelle:

Displaygröße 1. Zeile 2. Zeile 3. Zeile 4. Zeile Anmerkung
2x8 00-07 64-71      
1x16 00-07
64-71
      geteiltes Display
2x16 00-15 64-79      
4x16 00-15 64-79 16-31 80-95  
2x20 00-19 64-83      
2x24 00-19 64-83      
4x20 00-19 64-83 20-39 84-103  
2x40 00-39 64-103      
4x40 00-39
  
64-103
  

00-39

64-103
1. Controller
2. Controller

Um auf dem Display Text darzustellen, muss das Display zuerst initialisiert werden. Dies erfolgt in wenigen Schritten:

Function Set, 8-Bit-Interface, N und F können noch nicht gesetzt werden!
ungefähr 4,1 ms warten
Function Set, 8-Bit-Interface, N und F können noch nicht gesetzt werden!
nocheinmal warten - 100µs reichen
Function Set, 8-Bit-Interface, N und F können noch nicht gesetzt werden!
Function Set, 8-Bit-Interface, jetzt können auch N und F gesetzt werden - 2 Zeilen Display und 5x7 Zeichensatz
Display anschalten
Display löschen

Fertig!

Jetzt können auch schon Texte übertragen werden. Dazu muss RS auf high gesetzt werden und die Ascii-Codes der Buchstaben nacheinander ausgegeben werden.