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:
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.