Nokia 3310-Display
(mit PCD8544)
Irgendwann letztes Jahr (etwa zur Zeit der Entstehung von PPTD)
habe ich mir einmal bei eBay ein Ersatz-Display für ein Nokia 3310 gekauft, das
ich ansteuern wollte. Wurde damals nix, deshalb gelang das Display etwas mehr
als ein Jahr in Vergessenheit.
Bis jetzt: Irgendwann am Freitag (29.10.04) zwischen Mitternacht und Müdigkeit ist
mir wieder eingefallen, dass irgendwo das Display herumliegen muss.
Also erst mal Licht anschalten und die "Elektronikbox" durchwühlen... ...und da
ist es - zwar ein wenig mitgenommen aber optisch noch ganz ok:
Die Ansicht von vorne und hinten - bereits aus der "Verpackung"
(Plastikhalterung mit Tastatur) entfernt.
Die geriffelte Fläche nach Möglichkeit nicht zerkratzen, da sie das Licht der
Hintergrundbeleuchtung optimal streut.
Das Display selbst hat eine Auflösung von 84x48 Pixel und ist wegen der
vergleichsweise geringen Anzeigefläche recht hochauflösend.
Was man beachten muss: Die Pixel sind etwas höher als breit - Bilder werden
etwas verzerrt angezeigt!
Der Controller ist ein
PCD8544 von Philips und hat ein serielles Interface. Seine Betriebsspannung
sollte 2.7-3.3V betragen, mit 5V funktioniert er aber auch noch einwandfrei. Das
schöne an dem IC: Er produziert gleichzeitig auch die Kontrastspannung für das
Display, so bleibt die externe Beschaltung in einem kleinen Maß.
Wer genau hinsieht, entdeckt ihn am zweiten Foto. Er befindet sich unter der
Anschlussleiste (kleine gräuliche Fläche) und ist auf der Vorderseite mit
schwarzer Folie bedeckt, da er sonst bei Lichteinfall gestört werden kann.
Anschlussbelegung des Displays:
Pin: | Belegung: |
1 | VDD |
2 | SCL |
3 | SDA |
4 | D/C |
5 | SCE |
6 | GND |
7 | Vout |
8 | RES |
Am Computer wird das Display folgendermaßen angeschlossen:
D1 und D2 sind nach dem Motto "Igor, mehr Energie!", da sonst das Display nicht
genug an Strom bekommt und höhere Kontrastspannungen nötig sind.
Hardwareseitig wär's das - 5 Bauteile für um die 10 Euro. Eine Hintergrundbeleuchtung könnte man auch am Parallelport betreiben, ob er die dazu die nötige Power bringt, wage ich zu bezweifeln.
Genug zur Hardware - wichtiger ist die Software.
Bei jeder Ausgabe muss RES (=Reset) auf High gesetzt werden. In dem Fall hier
zusätzlich PowerOn, damit das Display überhaupt Strom bekommt.
Danach kann schon die Ausgabe der einzelnen Bits erfolgen. Jedes Bit (SDA = Data)
muss mit einer einem SCL (Clock) "bestätigt" werden.
Bei einem Byte wird immer zuerst das MSB (Most Significant Bit, hier: DB7)
ausgegeben.
Beim letzten Bit muss über D/C
ausgegeben werden, ob es sich bei der Ausgabe um Daten oder um einen Befehl
handelt. Dies kann aber auch schon vorher definiert werden, was ich auch nutze:
Vor der Ausgabe der einzelnen Bits wird D/C
gesetzt.
Dies war eigentlich schon alles von der Ausgabe - die Befehle kann man dem Datenblatt entnehmen - hier eine kleine Zusammenfassung:
H |
Befehl: | D/C | Byte (DB7-DB0) | Beschreibung: | |||||||
0, 1 | NOP | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | no operation - nichts machen |
Function set | 0 | 0 | 0 | 1 | 0 | 0 | PD | V | H | Grundeinstellungen festlegen (Tabelle beachten) | |
Write data | 1 | Daten | Daten in den Display-RAM schreiben | ||||||||
0 | Display control | 0 | 0 | 0 | 0 | 0 | 1 | D | 0 | E | Displayeinstellungen festlegen (Tabelle beachten) |
Y-Adresse des RAMs | 0 | 0 | 1 | 0 | 0 | 0 | Adresse | Setzt den Cursor in die angegebene Zeile (0-6) | |||
X-Adresse des RAMs | 0 | 1 | Adresse | Setzt den Cursor in die angegebene Spalte (0-83) | |||||||
1 |
Temperature control | 0 | 0 | 0 | 0 | 0 | 0 | 1 | Temp | Temperaturkompensation festlegen (Tabelle beachten) | |
Bias System | 0 | 0 | 0 | 0 | 1 | 0 | Bias | LCD-Bias festlegen (Tabelle beachten) | |||
Set VOP | 0 | 1 | Kontrast | Display-Kontrast festlegen (0-127) |
Function set:
Kürzel | high | low |
PD | IC ist aktiv | IC ist inaktiv (standby) |
V | horizontale Adressierung | vertikale Adressierung |
H | erweiterter Befehlssatz (H=1) | "normaler" Befehlssatz (H=1) |
Display control:
D | E | Bedeutung |
0 | 0 | Display deaktiviert |
0 | 1 | Alle Segmente aktiviert |
1 | 0 | Normaler Modus |
1 | 1 | Invertierter Modus |
Temperature control:
Temp | Temperatur-Koeffizient | |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 2 |
1 | 1 | 3 |
Bias System:
Bias | Multiplex-Verhältnis (empfohlen) | ||
0 | 0 | 0 | 1:100 |
0 | 0 | 1 | 1:80 |
0 | 1 | 0 | 1:65 |
0 | 1 | 1 | 1:48 |
1 | 0 | 0 | 1:40 oder 1:34 |
1 | 0 | 1 | 1:24 |
1 | 1 | 0 | 1:18 oder 1:16 |
1 | 1 | 1 | 1:10 oder 1:9 oder 1:8 |
(grün hinterlegt: selektiert)
Wie immer, hier eine kleine Doku zum Modul:
Variablen:
Port
Legt den Port fest, an dem das Display angeschlossen wurde.
Beispiel: Port = 888 'für LPT1
Contrast
Setzen/Lesen des Wertes für die Kontrastspannung von 0-31.
Beispiel: Contrast = 10 'Standardwert bei UB=5V,
J=25°C
Funktionen:
BintoDez(Bin as String)
Wandelt einen binären String in einen dezimalen Long um.
Bsp: 129 = ConvertBintoDez("01000001")
DeztoBin(Dez as Long)
Wandelt einen dezimalen Long in einen binären String um.
Bsp: "01000001" = ConvertDeztoBin(129)
OutLcd(LcdData as Long, LcdControl as Boolean)
Gibt die in LcdData angegebenen Daten an das Display aus.
LcdData: Daten in dezimaler Form, die an das Display ausgegeben werden.
LcdControl: Legt fest, ob der ausgegebene Wert ein Steuerbefehl ist (True)
oder nicht.
Init()
Initialisiert das Display mit allen nötigen Befehlen.
Der Kontrast muss danach festgelegt werden.
InitFont(FontFile As String) As Boolean
Initialisert die angegebene Schriftart
FontFile: Gibt den vollständigen Pfad der .fnt-Datei an, die geladen
werden soll. Mehr Informationen zum Aufbau des Dateiformats findest du in dem
Modul.
Der Rückgabewert gibt an, ob das Laden erfolgreich war oder nicht
WriteText(DstPicture As PictureBox, LcdText As String,
StartX As Long, StartY As Long, FontTransparent As Boolean
= False, FontNegative As Boolean = False)
As Boolean
Schreibt den angegebenen Text mit der angegeb. Position in die Picturebox.
DstPicture: Die Picturebox, in die der Text geschrieben wird. Die Picture
muss eine DC haben.
LcdText: Gibt den Text an, der in die Picturebox gezeichnet werden soll.
StartX: Die X-Position, bei der der Text beginnen soll (linke Kante des
Textes).
StartY: Die Y-Position, bei der der Text beginnen soll (obere Kante des
Textes).
FontTransparent: Wenn die Variable True ist, wird der Hintergrund des
Textes nicht gezeichnet und somit der Hintergrund des Textes beibehalten.
Andernfalls ist der Hintergrund weiß bzw. schwarz (Standardwert: False).
FontNegative: Legt fest, ob die Schriftart negativ gezeichnet werden soll
(True). Bei False wird der Text positiv, also wie in der Fontfile angegeben
gezeichnet (Standardwert: False).
Der Rückgabewert gibt an, ob der Befehl erfolgreich ausgeführt wurde.
TextLength(LcdText As String) As Long
Berechnet die Länge (in Pixel) des angegebenen Textes.
LcdText: Gibt den Text an, dessen Länge berechnet werden soll.
Der Rückgabewert entspricht der Länge des Textes in Pixel.
WritePic(LcdPicture As PictureBox)
Überträgt den Inhalt der angegebenen PictureBox an das Display.
LcdPicture: Die PictureBox, die das zu übertragende Bild enthält. Die Box
muss eine DC besitzen.
WritePicLine(LcdPicture As PictureBox, Ystart As Long,
Reverse As Boolean = False)
Überträgt eine Zeile der angegebenen PictureBox an das Display (nur für die
interne Verarbeitung)
LcdPicture: Die PictureBox, die das zu übertragende Bild enthält. Die Box
muss eine DC besitzen.
Ystart: "Zeile", die an das Display übertragen werden soll
Reverse: Gibt an, ob die Daten horizontal gespiegelt ausgegeben werden
sollen (für untere Displayhälfte notwendig - Standardwert: False)
ClearDisplay
Da der Displaycontroller keine Funktion zum löschen des Displays besitzt,
muss dies manuell erfolgen.
ShowNoise
Überträgt durch Rnd() erzeugtes Rauschen auf das Display
TestLcdSpeed() As Currency
Misst die Zeit, die der Computer benötigt, um einen gesamten Displayinhalt
(Rauschen) zu übertragen.
Der Rückgabewert entspricht der Zeit in ms (Bei meinem PC [P4, 3.0GHz, Windows
XP, ParPort auf SPP] dauert die Übertragung ungefähr 65ms).
Download:
Modul: gLCD (Code-Highlighting, gLCD.bas befindet sich im
Beispiel)
Programmbeispiel: gLCD-Beispiel
(VB6 -
inkl. 3 Schriftarten)