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:

Display von vorneDisplay von hinten
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:
Anschluss des Displays am PC
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)