Es gibt einzeilige, zweizeilige und vierzeilige Displays mit 8 bis 40 Zeichen pro Zeile. Jedes Zeichen wird mit einer Matrix aus 5x8 Punkten dargestellt. Theoretisch gibt es auch die Möglichkeit einzeilige Displays mit Zeichen aus einer 5x11-Matrix zu bauen, solche Displays sind aber unüblich. (Die beiden Modes werden gelegentlich auch als 7x7 und 5x10 bezeichnet.)
Dieser Chip besitzt
Legt man die 5x8-Punktmatrix für jedes Symbol zu Grunde, so kann der Controller ein 2-zeiliges Display mit jeweils 8 Zeichen pro Zeile ansteuern. Der anzuzeigende Text wird dem internen Zeichenpuffer entnommen, der mit 80 Zeichen reichlich bemessen ist. Die beiden Zeilen stellen jeweils einen 8-Zeichen langen Ausschnitt aus dem Puffer da. Die Position dieser 'Fenster' kann eingestellt werden.
Falls nur eine Zeile des 8-Stellen langen Displays benutzt werden soll, kann man den Controller auf einzeilig schalten. Dann werden die Punktzeilen-Leitungen 9..16 abgeschaltet, und die Leitungen 1..8 mit einem Takt angesteuert, der einen verbesserten Kontrast ermöglicht. In der Praxis gibt es aber kaum 1x8-Displays.
Wird anstelle der 5x8-Matrix die Darstellung mit 5x11 Punkten gewählt, stehen nicht mehr genug Punkt-Zeilenleitungen für eine 2. Zeile zur Verfügung. Der Controller kann dann nur ein einzeiliges 8 Zeichen langes Display ansteuern.
Mit einem Trick lässt sich mit einem Controllerchip auch ein 1x16-Display (eine Zeile, 16 Stellen) aufbauen. Dabei werden einfach die beiden 8-stelligen Zeilen hintereinander angeordnet. Was Kosten spart verwirrt aber den Nutzer. Da der Controller von der exotischen Beschaltung nichts weiß, verwaltet er das Display wie ein 2x8-Display. Man muss ihn also als 2-zeilig initialisieren, und wenn man auf die Positionen 9 .. 16 schreiben will, so muss man in die 2. Zeile schreiben.
Der saubere Weg zu längeren Displays ist die Erweiterung des
Displays mit zusätzlichen Display-Treiber-Schaltkreisen wie dem
HD44100 oder dem SED1181. Ein Controllerchip kann mit mehrere
Treiberchips umgehen. Jeder zusätzliche Treiber vom Typ HD44100
ergänzt den Controller um 40-Punktspalten-Leitungen. Das sind
jeweils 8 Zeichen.
Dadurch lässt sich die Breite des 2-zeiligen Displays schrittweise
bis auf 40 Zeichen ausbauen. Die Treiber besitzen keinen Textpuffer,
sie helfen lediglich dem Controller, zusätzliche Zeichen
anzuzeigen. Da der Controller nur einen 80 Zeichen großen
Textpuffer besitzt, ist bei 2x40 der Ausbau beendet.
Für ein 4x40-Displays benötigt man 2 Controller, die einzeln angesteuert werden müssen. Jeder Controller hat ein eigenes ENABLE-Pin am Interface, weshalb man an einem solchen Display einen Anschlusspin mehr benötigt. Um Verwechslungen zu vermeiden verwendet man oft gleich ein ganz anderes Steckerlayout. Anstelle des einreihigen Steckerfeldes (14..16 Kontakte) wird dann ein zweireihiges Steckerfeld verwendet (2x8 Kontakte).
Unproblematisch sind alle 2-zeiligen Displays (8..40 Zeichen pro Zeile) und alle 4-zeiligen Displays mit einer Zeilenlänge über 20 Zeichen.
Kritisch sind aber alle 1-zeiligen Displays (8..40 Zeichen) sowie
4-zeilige Displays mit bis zu 20 Zeichen pro Zeile.
Für Displaylängen über 8 Zeichen pro Zeile
benötigt man normalerweise zusätzliche Displaytreiber
(HD44100). Um diese Kosten zu sparen, werden oft einfach die beiden
Zeilen eines 2x8 Displays mechanisch hintereinander angeordnet
(8+8-Modul). Der Controller weiß davon nichts, und behandelt die
vordere und die hintere Displayhälfte wie zwei getrennte Zeilen.
Deshalb muss der Controller auch 2-zeilig initialisiert werden.
Es gibt gelegentlich auch echte 1x16-Displays mit nur einer logischen Zeile. Diese sollten auch nur einzeilig initialisiert werden. Was für einen Typ man besitzt, stellt sich spätestens nach der Initialisierung heraus. Befindet sich auf der Displayrückseite aber nur ein Chip (der Controller HD44780) dann handelt es sich höchstwahrscheinlich um ein 8+8-Modul. Befindet sich dort aber noch ein zweiter Chip (ein Displaytreiber HD44100), dann arbeitet das Display einzeilig mit 16 Zeichen pro Zeile. |
Zusätzliche Stellen können unter Zuhilfenahme von
Displaytreibern angezeigt werden.
Im nebenstehenden Foto einer 2x16-Display-Rückseite erkennt man deutlich auf der rechten Seite den am Interface angeschlossenen Controller und links davon (unter dem Aufkleber versteckt) den zusätzlichen Displaytreiber für die zusätzlichen 8 Stellen (40 Punktspalten) beider Zeilen. Wieviel Displaytreiber bei welcher Zeilenlänge benötigt werden, hängt vom verwendeten Chip-Typ ab. Beim HD44100 werden für jeweils 8 zusätzliche Zeichen je ein Displaytreiber benötigt. 40-Zeichen benötigen also neben dem Controller noch 4 Displaytreiber HD44100. |
Andere Treiberschaltkreise können mehr Spalten ansteuern. Im untenstehenden Foto ist die Platine eines 2x40 Displays zu sehen, das mit nur 2 moderneren zusätzlichen Spaltentreibern ausgestattet ist. Jeder dieser Treiber entspricht in der Funktion zwei kaskadierten HD44100.
Bei den im nachfolgenden Bild eingezeichneten Displaytreibern
HD44100 handelt es sich um einmal 1,5 Schaltkreise und einmal 2,5
Schaltkreise - zusammen also 4 Schaltkreise. Der Übersichtlichkeit
halber wurden sie als 2 Kästchen gezeichnet.
Beide Controller sind an den selben Interfacestecker angeschlossen (, der aber meist zweireihig ausgeführt ist). Jeder Controller hat auf dem Stecker seinen eigenen ENABLE-Pin, alle anderen Anschlüsse sind an beide Controller parallel angeschlossen.
Ist der Controller als einzeilig initialisiert worden, dann
ist der DDRAM ein geschlossenen Speicherbereich mit den Adressen 00h
bis 4Fh.
Ist der Controller zweizeilig initialisiert worden, besteht der
DDRAM aus 2 getrennten je 40 Zeichen langen Bereichen. Der DDRAM
für die 1. Zeile hat die Adressen 00h bis 27h, der DDRAM für
die 2. Zeile geht von 40h bis 67h
Der Inhalt des internen 80 Zeichen langen Textpuffer wird vom
Display angezeigt. Da das Display oft kleiner als der Textpuffer ist,
wird oft nur ein Ausschnitt des Puffers angezeigt. Dieser Ausschnitt
ist im Textpuffer verschiebbar. Dazu dient der "Cursor/Display-Shift"-Befehl,
mit
dem
der
angezeigte
DDRAM-Ausschnitt
schrittweise
verschoben
werden
kann.
Nach
dem Einschalten des Displays ist das erste dargestellte Zeichen die
DDRAM-Zelle "0".
Im Folgenden geht es um die Zuordnung von Displaypositionen zu Adressen des Textpuffers ohne Berücksichtigung dieser möglichen Verschiebung.
Die nicht immer einleuchtenden Aufteilungen der internen Zeilen des
Controlers auf die sichtbaren Zeilen des Displays führen zu einer
Zuordnung der Speicheradressen des Textpuffers im Controller zu den
angezeigten Stellen, die für jedes Display anders ist.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40-47 |
|
|
|
rechte Hälfte |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
- |
00-27 |
40-67 |
2. Controller |
Code |
0x00 |
0x01 |
0x02 |
0x03 |
0x04 |
0x05 |
0x06 |
0x07 |
0x08 |
0x09 |
0x0A |
0x0B |
0x0C |
0x0D |
0x0E |
0x0F |
5x8-Pixel |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
5x11-Pixel |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
Zeichen |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Adressen bei 5x8 |
0x00-0x07 |
0x08-0x0F |
0x10-0x17 |
0x18-0x1F |
0x20-0x27 |
0x28-0x2F |
0x30-0x37 |
0x38-0x3F |
Adressen bei 5x11 |
0x00-0x0A |
0x10-0x1A | 0x20-0x2A | 0x30-0x3A | / |
/ |
/ |
/ |
CGRAM-Adresse |
16 |
8 |
4 |
2 |
1 |
Byte
dezimal |
Byte
hexadezimal |
0x00 |
16+1 = 17 |
0x11 |
|||||
0x01 |
16+1 = 17 | 0x11 |
|||||
0x02 |
16+2+1 = 19 |
0x13 |
|||||
0x03 |
16+4+1 = 21 |
0x15 |
|||||
0x04 |
16+8+1 = 25 |
0x19 |
|||||
0x05 |
16+1 = 17 | 0x11 |
|||||
0x06 |
16+1 = 17 | 0x11 |
|||||
0x07 |
0 |
0x00 |
Die 1- und 2-zeiligen Displays (sowie 4-zeilige Displays mit
bis zu 20 Zeichen pro Zeile) besitzen einen Reihe von 14 oder 16
Lötkontakten, bzw. eine einreihige Stiftleiste mit 14 oder 16
Kontakten. Die Kontakte 15 und 16 sind für den Anschluss der
Hintergrundbeleuchtung (soweit vorhanden). Hat ein
hintergrundbeleuchtetes Display nur 14 Kontakte am Verbinder, so sind
die Beleuchtungsanschlüsse an einer anderen Stelle des Displays zu
finden. Die Pins 1 bis 14 sind in aller Regel identisch belegt belegt.
(Eine Ausnahme scheinen Displays von Seiko zu sein, wie mir Peter J.
mitteilte - danke.) Der einreihige Steckverbinder kann sowohl an der Oberseite wie auch an der Unterseite des Displays liegen. Das Pin 1 ist beschriftet, oft auch das letzte Pin. |
Manchmal findet sich auch ein zweireihiger 14- oder 16-poliger Steckverbinder. Die Nummerierung der Pins ist in der Regel auf der Platine angegeben, und geht auch aus nebenstehender Abbildung hervor. Die Funktionsbelegung der Pins ist identisch mit der Standardbelegung des einreihigen Verbinders. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Vierzeilige Displays mit mehr als 20 Zeichen pro Zeile besitzen zwei unabhängige Display-Controller. Einen für die ersten beiden Zeilen und einen für die unteren beiden Zeilen.
Als Anschluss wird auch der einreihige Anschluss verwendet (wie bei
kleineren Displays) wobei der zusätzliche Enable-Pin zwischen D0
und den ersten Enable-Pin eingefügt wird. Ich habe auch schon
Displays gesehen, die genau andersherum nummeriert waren. Man sollte
immer analysieren, welches Pin mit den Masseflächen der
Displayplatine verbunden ist, um das Vss-Pin zu identifizieren.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Manche Steckverbinder für solche Displays besitzt 2 Reihen zu je 8 Pins. Eine Reihe sind die Pins mit gerader Pinnummer, die andere Reiche die ungeraden. Auch hier dienen die Pins 15&16 dem Anschluss der LED-Hintergrundbeleuchtung (soweit vorhanden). Bei einigen Displays mit zweireihigen Verbinder stimmt die Pinbelegung mit der des einreihigen Verbinders überein. Andere Belegungen weichen aber deutlich ab.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
R/W | H/L | H:Read / L:Write |
11 | RS | H/L | Register Select |
12 |
Vo | 0 .. 1,5V (-2..-5V) | Displayspannung (Kontrast) |
13 |
Vss |
Masse |
Betriebsspannung
GND |
14 | Vdd | +5V | Betriebsspannung +5V |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Die Dotmatrix-Displays werden mit einer Betriebsspannung
Vdd von +5V (± 5%) betrieben. Der Vss-Pin ist der
Masseanschluss. Die Stromaufnahme (ohne Beleuchtung) liegt meist unter
1 mA. Maximalwerte von 5 mA sind möglich.
Außerdem wird eine Spannung zur Einstellung des Displaykontrastes benötigt. Es gibt zwei unterschiedliche Displaysorten, die auch unterschiedliche Kontrast-Spannungen benötigen: Standard-Displays (Temperaturbereich: 0°C ...50°C) benötigen eine Konstrastspannung zwischen 0V und 1,5V. Großdisplays und Displays für hohe Umgebungstemperaturen (Temperaturbereich: -20°C ...70°C) benötigen aber oft eine Spannung von -2V ... -5V, was ihren Einsatz verkompliziert. Das nebenstehende Bild verdeutlicht den Anschluss des Displays und die Erzeugung der Kontrast-Spannung für Standard-Displays. Durch Änderung der Spannung lässt sich der Kontrast und der optimale Blickwinkel zum Display verändern. Der Kontrast des Displays ist temperaturabhängig. Wer das Display unter verschiedenen Temperaturen betreiben will (Sommer und Winter im Freien) sollte den Einstellwiderstand als von außen bedienbaren Regler gestalten. |
Zur Versorgung eines Displays mit erweitertem
Temperaturbereich oder eines Großdisplays benötigt man
eine negative Spannung von ein paar Volt, die aber so gut wie nicht
belastet wird (einige Mikroampere). Nebenstehende Schaltung ist für diesen Zweck ausreichend. Sie basiert auf dem populären ICL7660 Schaltkreis für Ladungspumpen. |
Das rechts stehende Foto zeigt diese Schaltung an einem
2x16-Display. Mit dem Einstellwiderstand lässt sich die negative
Kontrastspannung, und damit der Displaykontrast einstellen. Bei -5V ist
das Display gut ablesbar.
Wenn man ein LCD-Display zu einem sehr günstigen Preis bekommt (z.B. bei einem Restpostenhändler), dann bemerkt man manchmal erst nach dem Kauf, dass man ein 'Hochtemperaturdisplay' erworben hat. Meist wird man erst stutzig, wenn das Display mit einer normalen Beschaltung nichts (aber auch gar nichts) anzeigt. Da die Displayhersteller die gleichen Leiterplatten einsetzen, wie für normale Displays, können nur Aufkleber auf dem Display eine Hochtemperausführung kennzeichnen. Oft befindet sich auf dem Controller oder Spaltentreiber ein Aufkleber der Art '240°HT2' zur Kennzeichnung der Hochtemperaturvariante. |
Natürlich wird man naturgemäß versuchen, ein Display
für normalen Temperaturbereich einzusetzen, da man sich dabei die
Erzeugung einer zusätzlichen negativen Spannung erspart.
Allerdings haben die 'Hochtemperatur-Displays' auch einen wesentlichen
Vorteil. Bei einer Kontrastspannung von -5V sind sie aus nahezu jedem
Blickwinkel hervorragend abzulesen (trifft jedenfalls auf die von mir
getesteten Typen zu), während normale Displays je nach
Kontrastspannung nur von schräg-oben oder von vorn oder von
schräg-unten gut ablesbar sind, wären aus anderen Richtungen
die Anzeige unscharf wirkt oder ein pixelieger grauer Hintergrund
sichtbar wird. So benötigen Geräte mit Normaldisplay in aller
Regel einen von außen zugänglichen Kontrastregler. Wer in
seinem Gerät ohnehin eine negative Spannung erzeugen muss (z.B.
für OPVs) sollte also dem Hochtemperaturdisplay den Vorzug geben.
ACHTUNG - Betrieb mit abgesenkter
Betriebsspannung
Bei Normaltemperatur-Displays muss mit sinkender Betriebsspannung (Vdd)
auch die Kontrastspannung (Vo) vermindert werden, um ein deutlich
lesbares Display zu erreichen. Schnell ist man da bei Vo=0V. Will man
das Display bei verringerter Betriebsspannung betreiben, ist man
versucht einfach eine negative Vo anzulegen. bis zu ca. -500mV
funktioniert das auch, und man erhält einen verbesserten Kontrast
bei kleiner Betriebsspannung. Wird die Kontrastspannung aber noch
negativer, dann setzt ein starker Stromfluss durch das Vo-Pin ein, der
den Controller zerstören kann. Kontrastspannungen von unter -0,5V
sind ausschließlich an Hochtemperatur-Display zulässig!
Erfahrungsgemäß arbeiten die Controllerchips von 5V-Displays
auch noch bei nur 3V-Betriebsspannung stabil, das Limit für den Displayeinsatz bei
verminderter Vdd stellt in der Praxis die Kontrastspannung dar.
Typische Hochtemperaturdisplays lassen sich mit Vdd=3V und Vo=-5V
betreiben.
Es gibt auch Module (sowohl Normal- wie auch Hochtemperaturdisplays), die für 3V Betriebsspannung (Vdd) ausgelegt sind. Diese unterscheiden sich durch die Bestückung mit einem anderen Widerstand (75 kOhm anstelle von 91 kOhm) für die Takterzeugung. Wird ein 3V-Display mit 5V betrieben, steigt die Frequenz seines internen Oszillators, im Extremfall funktioniert es nicht mehr, da der Arbeitstakt zu hoch ist. Wird umgekehrt ein 5V-Display mit nur 3V betrieben, so verringert sich sein Takt, und es arbeitet langsamer als im Datenblatt angegeben. Das ist zu beachten, wenn man dem Display Befehle übermittelt, und ihm dann eine feste Zeit für die Befehlsabarbeitung zubilligt, anstatt das Busy-Flag abzufragen.
Man findet übrigens auch immer wieder preiswerte Displays, deren Oszillatoren mit einem 110 kOhm oder 120 kOhm-Widerstand bestückt sind. Die laufen bei 5V Betriebsspannung noch mit 2/3 der Normalgeschwindigkeit. Bei 3V erreichen sie höchstens noch halbe Normalgeschwindigkeit. Das ist für die meisten Anwendungen aber nicht tragisch.
Den Oszillatorwiderstand findet man, wenn man von hinten auf die Platine schaut normalerweise rechts unten neben dem Controller-Chip. Er ist normalerweise der einzige Widerstand auf der Platine mit mehr als 50 kOhm, und dadurch leicht zu identifizieren.
Die Hintergrundbeleuchtung eines LCD-Displays ist in der Regel mit LEDs aufgebaut (es gibt auch Modelle mit EL-Folie, die benötigen aber einen zusätzlichen Inverter zur 100V-Spannungserzeugung). Um diese LED-Hintergrundbeleuchtung zu betreiben, sind die LED-Pins über einen Vorwiderstand mit einer Spannungsquelle (in der Regel 5V) zu verbinden. Die Größe des Vorwiderstandes bestimmt sich aus dem zulässigen LED-Strom, sowie der Differenz zwischen Speisespannung und LED-Spannung.
Displays, deren LED-Anschlüsse als Pin15&16 am Hauptanschluss des Displays sitzen, haben manchmal (aber nicht immer !) schon einen internen Vorwiderstand, der es erlaubt, die LED-Anschlüsse direkt mit 5V zu verbinden. Befinden sich die LED-Anschlüsse aber nicht am Hauptanschlussfeld, sondern z.B. seitlich neben dem Display, dann besitzt das Display in der Regel keinen internen Vorwiderstand für die LED-Beleuchtung. Wenn man seinen Displaytyp nicht genau kennt, und das Platinenlayout nicht deuten kann, dann sollte man sicherheitshalber davon ausgehen, das kein interner Vorwiderstand existiert. Zum Betrieb der LED-Beleuchtung muss dann unbedingt ein externer Vorwiderstand verwendet werden.
Der Betrieb der LED-Beleuchtung ohne (oder mit zu kleinem) Vorwiderstand führt zur Zerstörung der LED-Beleuchtung!
LED-Strom und LED-Spannung kann man dem Datenblatt entnehmen. Die
meisten weiß beleuchteten Displays haben eine LED-Spannung
von 4,2V. Üblich sind aber auch 3,3V (blaue, weiße oder
grüne Displays) und 1,8V (amber-farbige Displays). Typische
LED-Ströme sind 20mA .. 200mA (Großdisplays schlucken auch
schon mal bis zu 2A).
Stromfresser sind vor allem die Lightbox-Displays, bei denen LEDs
direkt hinter dem LCD angeordnet sind. solche Displays sind dicker,
haben aber auch eine hohe, gleichmäßige Helligkeit.
Lightbox-Displays benötigen oft 4,2V/200mA.
Stromsparer sind Displays, die hinter dem LCD einen
Lichtleitkörper besitzen, der seitlich von LEDs angestrahlt wird.
Diese Displays sind flacher und begnügen sich oft schon mit
3,3V/20mA.
Wenn die genauen Parameter der LED-Beleuchtung unbekannt sind, dann speist man die LED eines normalen Displays (nicht amber !) über einen ca.80 Ohm Widerstand aus der 5V-Quelle, wodurch sich ein Strom von max. 20 mA einstellt. Dann kann man den Widerstand verkleinern, bis sich eine normale Displayhelligkeit einstellt. Nicht selten ergeben sich dann Werte um 10 Ohm.
Ergänzung von Horst:
Eine ... Ergänzung zur Beleuchtung. Ich
verwende eins dieser modernen blauen Displays mit weißer
Hintergrundbeleuchtung. Dabei muss man mit dem Vorwiderstand sehr
vorsichtig sein, die auf der Seite erwähnten 10 Ohm als
wahrscheinlicher Zielwert für 5V Versorgungsspannung führen
sicher zur Zerstörung. In meinem Fall hat die Beleuchtung bei 20mA
eine Durchflussspannung von 3.1V, bei 30mA (max. zulässiger Strom)
3.4V. Wenn man den Vorwiderstand gefühlsmäßig
verkleinert, landet man schnell im roten Bereich.
Wenn man mit 80 Ohm startet, ist man auch hier im sicheren Bereich.
Verkleinerungen des Widerstandes darf man natürlich nur nach einer
Strommessung machen und nicht nach Gefühl.
Die Enable Leitung schaltet das Interface ein (E=1). Nur wenn Enable auf High-Pegel liegt, lässt sich das Display ansprechen. Das erlaubt die Nutzung der anderen Leitungen für andere Zwecke (z.B. die Ansteuerung einer parallelgeschalteten Tastatur).
Die RS (Register-Select)-Leitung bestimmt, ob die übertragenen Daten als Zeichen in den Textpuffer (RS=1), oder als Befehl in ein Steuerregister (RS=0) geschrieben werden.
Mit der R/W (Read/Write) Leitung bestimmt man, ob Daten zum Display geschrieben (R/W=0) oder vom Display gelesen (R/W=1) werden sollen. Wer auf die Lesefunktion verzichten will, muss diese Leitung fest mit 0V (Vss) verbinden, da ein offener Anschluss vom Display auf high gezogen werden kann.
Im Moment der Low-High-Flanke von ENABLE liest das Dislplay die Werte von RS und R/W ein. Ist zu diesem Zeitpunkt R/W=0, dann liest das Display mit der folgenden High-Low-Flanke von ENABLE den Datenbus ein (Schreibzyklus). War aber R/W=1, dann legt das Display ein Datenword auf den Datenbus (Lese-Zyklus), solange bis die High-Low-Flanke von ENABLE das Interface wieder deaktiviert.
Schreiben zum Display
Die folgende Abbildung zeigt einen Schreibzugriff auf ein Display. Das
Display überwacht den Pegel von ENABLE. Ändert sich
dieser Pegel von Low nach High, dann fragt es die Leitungen RS
und R/W ab. Liegt zu diesem Zeitpunkt R/W auf Low,
dann weiß das Display, dass ein Schreibzugriff erfolgt, und
bereitet sich darauf vor, mit der High-Low Flanke von ENABLE
die Daten vom Datenbus ( DB0..DB7 ) einzulesen. Dazu muss das
Display aber noch wissen, wohin diese Daten geschrieben werden sollen.
Liegt RS auf low, so werden die Daten als Kommando verstanden,
und in ein Steuerregister geschrieben. Liegt aber RS auf High,
so handelt es sich um Daten, die angezeigt werden sollen, und in den
Textpuffer (DDRAM) zu schreiben sind. (oder um die Definition eines
neuen Zeichens)
Um eine sichere Verarbeitung einzuhalten, sind Mindestzeitabstände zwischen dem Einstellen von RS und R/W sowie der ENABLE -Low-High-Flanke einzuhalten. Genauso muss der Datenbus um die High-Low-Flanke von Enable herum stabil sein, und RS und R/W dürfen erst nach ENABLE abgeschaltet werden. Diese Zeiten sind aber so kurz, dass man sie bei der Ansteuerung durch einen PIC ignorieren kann. Der Abstand zwischen zwei Befehlen, die zwei Signale Ändern ist groß genug.
Wenn mit EQU-Befehlen beschrieben wurde, an welchen Port-Pins des PIC die LCD-Steuerleitungen angeschlossen sind, und der LCD-Datenbus an PORTB liegt, dann kann eine Ausgabe wie folgt aussehen:
; alle verwendeten Pins
und das
; ganze PORTB auf output
gestellt
; Enable ist low
BSF
RS ; Zeichen zur Anzeige
BCF
R_W ; schreiben
MOVFW
Daten ; Daten auf Datenbus
MOVWF
PORTB ;
BSF
Enable ; Interface ein
NOP
; warten, das Display Daten hat
BCF
Enable ; Interface aus
Lesen vom Display
(Busy-Abfrage)
Wurde dem Display ein Datenwort übergeben, so muss das Display das
Wort intern abspeichern, oder wenn es ein Kommando enthielt (z.B.
Löschen des Displays) dann muss es dieses Kommando ausführen.
Dazu benötigt das Display Zeit, und während dieser Zeit kann
es keine neuen Kommandos entgegennehmen. Bevor man also einen neuen
Schreibzugriff macht, sollte man testen, ob das Display mit dem letzten
Befehl schon fertig oder immer noch beschäftigt (busy) ist.
Dazu kann man mit einem Lesezugriff auf das Display ein busy-Bit
abfragen.
Die folgende Abbildung zeigt einen Lesezugriff auf ein Display. Das
Display überwacht den Pegel von ENABLE. Ändert sich
dieser Pegel von Low nach High, dann fragt es die Leitungen RS
und R/W ab. Liegt zu diesem Zeitpunkt R/W auf High,
dann weiß das Display, dass ein Lesezugriff erfolgt. Das Display
muss nun das angeforderte Datenbyte unverzüglich auf den Datenbus (
DB0..DB7 ) legen. Dazu muss das Display aber noch wissen, welche
Daten angefordert wurden. Liegt RS auf low, so werden das
Statusregister ausgegeben. Liegt aber RS auf High, so handelt
wird ein Zeichen aus dem Textpuffer (DDRAM) ausgegeben. Mit der
High-Low Flanke von ENABLE wird das Interface (und insbesondere
der Datenbus) wieder deaktiviert.
Wenn mit EQU-Befehlen
beschrieben wurde, an welchen Port-Pins des PIC die LCD-Steuerleitungen
angeschlossen sind, und der LCD-Datenbus an PORTB liegt, dann kann eine
Ausgabe wie folgt aussehen:
; alle verwendeten Pins und
das
; ganze PORTB auf output
gestellt
; Enable ist low
;PortB auf input
BSF STATUS, RP0 ;
auf Bank 1 umschalten
MOVLW B'11111111' ; PortB
alle input
MOVWF TRISB
BCF STATUS, RP0 ;
auf Bank 0 zurückschalten
;Display abfragen
BCF
RS ;
Statusregister lesen
BSF
R_W ; lesen
BSF
Enable ; Interface ein
NOP
; warten auf Daten
MOVFW
PORTB ; Daten lesen
MOVWF
Daten ; Daten speichern
BCF
Enable ; Interface aus
;PortB wieder auf output
BSF STATUS, RP0 ;
auf Bank 1 umschalten
CLRF
TRISB ; PortB alle output
BCF STATUS, RP0 ;
auf Bank 0 zurückschalten
Hat man das Steuerregister gelesen, so findet man das busy-Flag
im MSB (D7) des gelesenen Datenwortes.Ist dieses Bit 1, dann ist der
Controller noch beschäftigt, und kann keine weiteren Operationen
annehmen. Man fragt das busy-Flag solange ab, bis es 0 ist.
Dann kann wieder zum Display geschrieben werden.
Nebenstehendes Bild zeigt drei aufeinanderfolgende Zugriffe
auf das Display im 4-Bit Mode.
Ich arbeite prinzipiell mit dem 4-Bit-Interface. Beispiele für Schreib-und Lese-Routinen finden sich z.B.: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
löscht das Display, Kursor auf Adresse 0, |
1,64 ms |
|
|
|
|
|
|
|
|
|
|
|
Kursor auf Adresse 0, Display-Shift entfernen, |
1,64 ms |
|
|
|
|
|
|
|
|
|
|
|
I/D: Kursor Laufrichtung, S: Shift ein/aus |
40 µs |
|
|
|
|
|
|
|
|
|
|
|
D: Display ein/aus C: Kursor ein/aus B: Blinkende Kursorposition ein/aus |
40 µs |
|
|
|
|
|
|
|
|
|
|
|
S/C: Display oder Kursor R/L: nach rechts oder links schieben |
40 µs |
|
|
|
|
|
|
|
|
|
|
|
DL: Interface 8-Bit/4-Bit lang N: ein-/zwei-zeilig F: 5x8/5x11 Darstellung |
40 µs |
|
|
|
|
|
CG RAM-Adresse einstellen | 40 µs | ||||||
|
|
|
|
DD RAM-Adresse einstellen | 40 µs | |||||||
|
|
|
|
busy-Flag und Adress-counter auslesen | 40 µs | |||||||
|
|
|
Daten zum Textpuffer oder CG RAM schreiben | 40 µs | ||||||||
|
|
|
Daten vom Textpuffer oder CG RAM lesen | 40 µs |
Display löschen
Eine Initialisierungsroutine sollte nicht nur das Display sicher aus diesem Zustand in den gewünschten Betriebsmode bringen, vielmehr sollte es das Display aus jedem beliebigen Zustand (auch einem 4-bit Interface-Mode) in den gewünschten Betriebsmode bringen. Schließlich wird diese Routine auch nach einem Reset des steuernden Prozessors (ohne Power-on-Reset) durchlaufen, und dabei wird ja das Display nicht automatisch 'resetet'.
Die nachfolgenden Tabellen beschreiben den Ablauf der
Initialisierung für 8-Bit und 4-Bit-Interface. Das die Routinen
umständlich aussehen, ist der Tatsache geschuldet, dass sie das
Display aus jedem Mode heraus ansprechen können.
Beispiel für eine Initialisierung mit 8-Bit Interface:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
auf das Ende des internen Reset warten | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 8-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 8-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 8-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2-zeilig, 5x8-Punkt-Matrix Display aus Display löschen Kursor nach rechts wandernd, kein Display shift Display ein |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Beispiel für eine Initialisierung mit 4-Bit Interface:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
auf das Ende des internen Reset warten | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 8-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 8-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 8-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interface auf 4-Bit setzen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2-zeilig, 5x8-Punkt-Matrix Display aus
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Da das Display nicht mit einem steuernden Prozessor verbunden ist, befindet es sich im Grundzustand - im 1-zeiligen Mode. Werden nun alle Stellen des Displays als dunkle Vierecke dargestellt, dann ist das der richtige Mode für dieses Display. Werden aber nur die Hälfte der Stellen dunkel dargestellt, dann ist es nötig, das Display für den regulären Betrieb 2-zeilig zu initialisieren.
Nun besitzt man alle nötigen Informationen, um das Display zu nutzen:
Quellen:
- Informationen und Taktdiagramme aus dem HD44780-Datenblatt von
Hitachi
- Datenblatt der Electronic Assembly GmbH, Gräfelfing
-Datenblatt von Sitronix
Autor: sprut
erstellt: 24.04.2002
letzte Änderung: 15.07.2011