Handy Display als µC-Anzeige
Bei vielen Mikroprozessor-Projekten wird ein Display zur Anzeige von Daten benötigt. Displays aus (alten) Handys
sind eine gute Alternative weil sie leicht verfügbar und preiswert sind. Leider sind die zugehörigen Datenblätter
und Programmiersequenzen oft sehr schwer zu finden. Ich habe deshalb im folgenden meine gesammelten Informationen
zu einigen Display-Typen zusammengefasst.
Rückmeldungen sind willkommen! Wer Infos oder Code zum weitergeben hat kann ihn mir gerne zuschicken, ich werde
es dann zu der jeweiligen Beschreibung hinzufügen.
Ansteuerung
Diese Art von Displays haben bereits einen sog. Display-Controller eingebaut. Der übernimmt die komplette low-level Ansteuerung des eigentlichen LCD.
Ein "nacktes" LCD-Glas anzusteuern ist sehr aufwändig und auch nicht das Thema dieser Seite. Hier geht es um graphische LCD Displays ohne
Zeichengenerator.
Die meisten Display-Controller werden über ein serielles 3-Wire oder 4-Wire oder I2C Interface angesteuert. Für erste
Versuche würde ich empfehlen die Sequenzen ganz rudimentär durch Port-"Klappern" (Bit-Bang) zu erzeugen.
Häufig wird bei der Ansteuerung/Adressierung zwischen Kommandos und Bildschirmspeicher unterschieden. Entweder durch eine dedizierte Leitung
(C/D = command/data), oder durch ein spezielles Bit im Datenwort.
Alle LCDs benötigen nach dem Aufstarten zuerst eine spezielle Sequenz zur Initialisierung. Wenn die nicht genau passt, oder fehlt, wird
garnichts angezeigt.
Bildschirmspeicher
Die Bits im Bildschirmspeicher des Display-Controllers korrespondieren direkt mit den LCD-Pixeln. Der Bit-Wert enspricht
dem Zustand des Pixels. Zumindest bei reinen S/W-Display ist es so einfach. Sobald Graustufen oder Farben ins Spiel
kommen wird es komplexer, dann können es pro Pixel auch schonmal 2 oder 3 Bytes werden.
Häufig ist der interne Bildschirmspeicher etwas grösser als die Anzahl an Pixeln. Der Grund liegt darin dass
der Bildschirmspeicher im Byte-Raster gewählt werden muss. Die Pixelanzahl orientiert sich aber an den mechanischen
Abmessungen des Glases. Oder der Controller ist bewusst flexibel gehalten um unterschiedliche Gläser zu unterstützen.
Für eine flackerfreie Darstellung wird der Bildschirminhalt zuerst im RAM des Prozessors zusammengesetzt und dann
"in einem Rutsch" in den Bidschirmspeicher kopiert. Diese Methode funktioniert natürlich nur wenn ausreichend freies
RAM vorhanden ist. Für ein 102x64 Pixel Beispiel werden (102*8) Byte = 516 Byte benötigt.
Farb-Displays
Die Verwendung eines Farb-Displays scheint auf den ersten Blick sehr verlockend im Vergleich mit einem S/W-Displays.
Es gibt jedoch einige gravierende Einschränkungen die bedacht werden sollten:
Die Darstellung von "echten" Farben ist sehr schwierig und erfordert die gesamte Farb-Kette des Fotos einzubeziehen. Der
Farbraum des Displays ist zudem relativ gering und diverse Umrechnungen sind unvermeidbar. Eine (sehr) gute, natürliche
Farbdarstellung ist daher mit einfachen Displays prinzipiell nicht möglich.
Viele Farbdisplays arbeiten transmissiv, d.h. die LED-Hintergrundbeleuchtung wird durch vorgesetzte Farbfilter pixelweise
moduliert. Für eine erkennbare Darstellung muss die Hintergrundbeleuchtung immer stärker sein als das Umgebungslicht.
Bei Aussenanwendungen, besonders wenn die Sonne scheint, versagt dieses Prinzip sehr schnell. Die Reflektivität
des Displays liegt bei nur wenigen Prozent und die Farben gehen verloren. Das Ergebnis ist ein "grauer, kontrastarmer Matsch".
Manche Leute sind mit zu vielen Darstellungs- und Formatierungsmöglichkeiten "überfordert". Weniger ist
manchmal Mehr. Der sparsame und überlegte Einsatz von Farbe kommt Ästhetik und Ergonomie zu Gute..
Nicht zuletzt ist es eine Frage des verfügbaren Prozessor-RAM-Speichers. Im Vergleich zu einem S/W-Display ist
der Speicherbdarf ca. um den Faktor 10 .. 20 grösser.
OLED
Diese Typen von Displays sind aktuell sehr populär. Und zumindest eine Erwähnung wert, obwohl es keine LCDs sind. Die Oberfläche ist selbstleuchtend und besteht aus vielen mikroskopisch kleinen LEDs. Die Ansteuerung ist praktisch identisch mit LCDs. Erwähnenswerte Nachteile sind die begrenzte Lebensdauer (bei hoher Leuchtstärke) und der relativ hohe Strombedarf.
SW-Bibliothek
Eine populäre und umfangreiche SW-Bibliothek für monochrome Displays ist die U8g2 von Oli Kraus. Sie enthält Routinen für praktisch alle gängigen LCD und OLED Displays.
Siemens Mobile
Die Firma Siemens hat bis Herbst 2005 Handys unter eigenem Namen entwickelt, gebaut und vertrieben. Danach wurden sie noch kurze Zeit weiter unter dem Namen "BenQ" verkauft. Ersatzteile sind weiterhin z.B. über Ebay zu bekommen.
Siemens A70
Besonders praktisch und vielseitig finde ich das Display aus dem Siemens-Handy A70. Es zeigt 102x64 Pixel in 1 Bit S/W
Darstellung. Die Verbindung zum Mikroprozessor ist z.B. mit einem SPI-Interface oder direkt über Ports einfach zu realisieren.
Das Modul umfasst folgende Teile:
- Das eigentliche LCD-Display-Glas mit integriertem Controller (COG)
- Einen lightguide und 2 LEDs für die Hintergrundbeleuchtung (amber)
- Eine Flex-Folie mit allen Bauteilen und Kontaktpads
- Ein Plastikgehäuse dass alle Teile mechanisch trägt
Aktive Anzeigefläche (ca.): 29.3 x 20 mm
Der Controller ist ein Dialog D0986ED.
Die Betriebsspannung beträgt 3V. Ab 3.5V wird das Display geschädigt!
Alle Logik-Spannungen müssen ebenfalls 3V betragen.
Die Versorgung der LEDs ist elektrisch völlig getrennt vom Controller. Die Farbe der LEDs ist amber (~orange/gelb).
Das "Display Data RAM" hat eine Grösse von 102 x 65 Bits von denen aber nur 102 x 64 Bits verwendet werden.
Siemens A55/C55/A52/A57
Siemens hat das gleiche Display-Glas ebenfalls in den Modellen C55, A55 und A52 verwendet. Dort ist es in den Keypad-Block eingebaut,
hat aber keine eigene Beleuchtung. Es existieren unterschiedliche Versionen von mindestens 4 Herstellern mit
unterschiedlichen Controllern (Dialog D0986, Rohm BU97865, Philips 8813, ..) die nicht direkt SW-kompatibel sind.
Beim A70 scheint es nur einen Hersteller zu geben.
Die Beschaltung ist ähnlich wie beim A70, man muss aber noch einen Kondensator für die LCD-Spannung hinzufügen. Die LEDs zur Beleuchtung
werden in den Ausschnitten des Light-guide positioniert.
Ein Vorteil dieses Moduls sind die 4 Befestigungsbohrungen in den Ecken. Den Tastatur-Block kann man abtrennen.
Programmierung
Das A70-Display besitzt keinen eingebauten Character-Generator, es ist ein reines Grafik-Display. Um Texte dazustellen benötigt man daher
entsprechende Schriftsatz-Daten. Die im Web verfügbaren Programme und Sourcen für die Nokia-LCDs sind eine gute Basis.
Im folgenden die wichtigsten Funktionen zur Ansteuerung. Es wird zwischen COMMANDS (Signal "C/D"=0) und DATA (Signal "C/D"=1)
unterschieden. Im DATA-Modus wird der Bildschirminhalt geschrieben.
(ChipSelect = CE active low; Clock=CLK; Reset = active low)
Ein Reset sollte nach jedem Einschalten zuerst gemacht werden.
Die Signalleitungen müssen entsprechend der folgenden Sequenz gesetzt werden.
Reset_LCD
{
Data=0;
Clock=0;
Control=0;
Data=0;
Reset=1;
ChipSelect=0;
Reset=0;
Reset=1;
ChipSelect=1;
{
Das Übertragen von Daten und Kommandos erfolgt üblicherweise im seriellen 8-Bit-Format.
SendCommand(Command)
{
Data=0;
Clock=0;
Control=0;
ChipSelect=0;
i = 0;
do {
Data = (((1 << (7-i))& Command) > 0);
Clock=1;
Clock=0;
i++;
} while (i = 7);
ChipSelect=1;
}
Nach einem Reset ist das Display nicht in der Lage etwas anzuzeigen. Es muss zuerst die folgende INI-Sequenz gesendet werden.
Init_LCD
{
SendCommand(0b00100001);
SendCommand(0b11011010);
SendCommand(0b00010100);
SendCommand(0b00001011);
SendCommand(0b00000101);
SendCommand(0b00100000);
SendCommand(0b00010001);
SendCommand(0b00001100); // Display normal
// SendCommand(0b00001101); // Display inverse
}
Der Kontrast muss eingestellt werden. Ein guter Startwert ist 70dez.
SetContrast(Value)
{
SendCommand(0b00100001);
SendCommand((Value+128));
SendCommand(0b00100000);
}
Das normalerweise aktive auto-increment sorgt dafür das beim Schreiben der Bildschirmdaten die Adresse automatisch hochgezählt wird. Den
Startpunkt legt man mit der folgenden Funktion fest. Die 64 vertikalen Punkte sind in 8er-Gruppen (=1 Byte) zusammengefasst, die Zählung der Linien geht daher nur von 0 bis 7.
GotoLineRow(Line, Row)
{ // Line: 0..7, Row 0..101;
SendCommand((0b01000000 + Line));
SendCommand((0b10000000 + Row ));
}
Das Schreiben der eigentlichen Display-Daten erfolgt analog zu den Commands, mit dem Unterschied dass "Control/Data" auf "1" gesetzt wird.
WriteDisplay(Value)
{
Data=0;
Clock=0;
Control=1;
ChipSelect=0;
j = 0;
do {
Data = (((1 << (7-j))& Value) > 0);
Clock=1;
Clock=0;
j++;
} while (j <= 7);
ChipSelect=1;
}
Für eine komplette Grafik-Lib empfehle ich die verfügbaren Sourcen für die Nokia-Displays zu benutzen und entsprechend anzupassen. Ein Forum mit weiterführenden Informationen ist z.B.:
http://lcdhype.condense.de/
Siemens S55
In den Baureihen S55, M55, C60 und MC60, SL55(?) kam ein Farbdisplay mit 101x80 Pixel und 4096 Farben zum Einsatz. Es gibt mindestens 3
Herstellern:
Vermutliche Kombinationen:
1.) Philips: LPH8731; Controller EPSON S1D15G14; Controller NJU6821 (256 Farben only)
2.) Sharp LM15SGFNZ04; Controller LH15AB?
3.) Sharp LM15SGFNZ07; Controller Hynix HM17CM4101
Dieses Display wurde in den Elektor-Heften vom April 2007
und Dezember 2008 vorgestellt. Elektor bietet die Software dazu als (kostenlosen) Download an.
Einige Links:
http://www.module.ro/siemens_lcd.html
http://www.mikrocontroller.net/topic/70449#new
http://www.mikrocontroller.net/attachment/88953/s55Display.zip
Siemens CF62
Dieses Display stammt aus dem Klapp-Handy CF62. Es ist ein Doppel-Display: aussen S/W, 95x64 Pixel, innen Farbe, 130x130
Pixel, 65k Farben. Es existieren 2 unterschiedliche Versionen.
Der aussen liegende S/W-Teil des Displays ist sehr ähnlich zum A55-Display. Die Controller sind identisch, nur das Glas wurde geschrumpft.
In einer der beiden Versionen ist das Displays über einen ZIF-Konnektor verbunden und leicht vom Rest zu trennen. Es kann dann wie
ein A55/A70-Display benutzt werden.
Siemens S65
Ein weit verbreitetes Display ist das Farb-LCD aus dem S65, CX65, CX70, CX75, SK65, A65, C62, ... Es besitzt 132x176 Pixel und
kann 65535 Farben darstellen. Es existieren mindestens 3 Versionen von unterschiedlichen Herstellern.
Die notwendigen Ansteuersequenzen und Bibliotheken kursieren seit vielen Jahren in praktisch allen Elektronik-Foren.
Siemens S75
Im S75 wurde ein ähnliches Display wie im S65 verbaut. Die Auflösung beträgt 132x176 Pixel mit 262k Farbtiefe. Der grosse Unterschied
besteht im parallelen 8bit-Inferface im Vergleich zum seriellen Interface beim S65. Es besitzt deshalb deutlich mehr Kontaktpads. Es
existieren mindestens 4 Versionen von unterschiedlichen Herstellern.
Die eingesetzten Controller, und damit die Ansteuersequenzen, sind weitgehend identisch zum S65-Typ. Leider sind
viele Anschlüsse zu verdrahten und so mancher µC hat nicht genug freie Ports dafür.
Nokia 1200
Nokia 1200 S/W Display, 96 x 68 Pixel. Controller PCF 8814
Vermutlich baugleich mit den Typen : 1110, 1112
Nokia 1202
Nokia 1202 S/W Display, 96 x 68 Pixel. Controller STE2007
Dieses Display wurde in den Telefonen der Baureihen 1202/1203/1280 verwendet. Es ist ähnlich zum 1200er, nur etwas kleiner. Die Anschlüsse
sind etwas leichter zu kontaktieren, aber auch recht fummelig. Es enhält eine weisse LED für die Hintergrundbeleuchtung. Die Ausleuchtung
ist nicht toll (nur 1 LED), aber akzeptabel.
Das Display wird auch als Modul unter der Bezeichung HX1230 für Arduino und Co angeboten angeboten. Sehr zu empfehlen weil damit das Problem
der Kontaktierung elegant gelöst wird. SW-Bibliotheken und Demos sind z.B. hier zu finden:
bitbank2/hx1230
cbm80amiga/HX1230_SPI
cbm80amiga/HX1230_FB
Es scheint (mindestens) 2 Varianten zu geben die sich in der Belegung und Ausführung der Kontakte unterscheiden. Oder sie stammen aus
unterschiedlichen Geräten und der Verkäufer hat es mit den Bezeichnungen nicht so genau genommen..
- Pin #1: nicht belegt oder Reset
- Pin #3: nicht belegt oder GND
Weitere kleine Abweichungen gibt es bei der Programmierung. Bei einigen Exemplaren ist eine gespiegelte Ausgabe nicht möglich und der Kontrast ist nicht veränderbar. Entweder bin ich zu blöd oder Nokia hat sich spezielle Kontroller einbauen lassen die nur das nötigste können..
Die Ansteuerung erfolgt über 9-Bit Worte. Das erste Bit gibt an ob der Bildschirmspeicher beschrieben oder ein Kommando gesendet wird. Nokia hat damit die Command/Data-Leitung eingespart.
Der Bildschirmspeicher hat eine Grösse von 864 Byte, organisiert in 9 Zeilen und 96 Spalten. Er ist somit grösser als die Anzahl der darstellbaren Pixel. Von der letzen Zeile werden nur 4 Bit auf dem LCD angezeigt (96 x 68 Pixel).
Init_LCD
{
SendCommand_LCD(0xE2); // Soft RESET
SendCommand_LCD(0x24); // V0R (Default 0x24)
SendCommand_LCD(0xE1); // V0P (Default 0xE1)
SendCommand_LCD(0x90); // EV, Electronic Volume = Contrast Setting (Default 0x90)
SendCommand_LCD(0xA4); // Powersave ALLPOINTS-ON mode turned ON
SendCommand_LCD(0x2F); // Power control set to max
SendCommand_LCD(0xAF); // Display ON
SendCommand_LCD(0xC0); // Column Direction normal
SendCommand_LCD(0xA6); // display control, normal
//SendCommand_LCD(0xA7); // display control, inverse
}
Nokia 5110
Dieses Display wird oft in "Arduino-Shops" als Modul angeboten. Es wurde im Nokia 5110 Handy verwendet.
Ich kann von dieses Modul nur abraten! Bei allen bisherigen Exemplaren hatte ich Probleme und Ausfälle.
Die Ursache ist die Kontaktierung des LCDs mittels Leitgummi (Zebra-Gummi). Abhängig von den Toleranzen und
der Positionierung des Montagerahmens kann es zu Kontaktproblemen kommen.
Auflösung 84 x 48 Pixel, 3.3V, weisse Hintergrundbeleuchtung.
Kontroller Philips PCD8544.
Init_LCD
{
SendCommand_LCD(0x21); //Tell LCD that extended commands follow
SendCommand_LCD(0xBF); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
SendCommand_LCD(0x04); //Set Temp coefficent
SendCommand_LCD(0x13); //LCD bias mode 1:48: Try 0x13 or 0x14. Mine works best with 1:65/1:65
SendCommand_LCD(0x20); //We must send 0x20 before modifying the display control mode
SendCommand_LCD(0x0C); //Set display control, normal mode. 0x0D for inverse
}
Sonstige (nicht-Handy) Displays
DOGS102x-6 Electronic Assembly
Die Firma Electronic Assembly bietet eine ganze Serie von sehr schönen Grafik-LCD-Displays an. Als Beispiel das DOGS102W-6 mit 102x64 Pixel,
S/W, transflektiv, Kontroller UC1701, weisse Beleuchtung:
Die Serie ist sehr umfangreich und bietet diverse Pixel-Auflösungen und Farb-Optionen an. Es gibt rein reflektiv arbeitende Typen
(ohne Hintergrundbeleuchtung) und transmissive mit Hintergrundbeleuchtung.
Die weisse Beleuchtung (LED39X41-W) sitzt in einem extra Träger, beides wird Huckepack montiert.
Zwei wichtige Dinge sollte man bei der Montage beachten!:
- Die 3 Schutzfolien vorher entfernen! Eine sitzt auf dem Beleuchtungsträger, zwei weitere auf Ober- und Unterseite des LCD
- Die 4 Beinchen für die LEDs enden blind auf dem LCD und dienen nur zur mechanischen Fixierung. Sie müssen aber unbedingt auf der Beleuchtungsplatte verlötet werden. Nur Durchstecken macht keinen Kontakt.
Electronic Assembly liefert umfangreiche SW-Unterstützung und die Serie wird auch von vielen (Arduino-)Bibliotheken unterstützt. Wie bei dieser Art von Display üblich muss man auch hier mit separaten Zeichensätzen arbeiten.
Bei den Programmier-Kommandos wird zwischen "Basic" und "Extended" unterschieden, je nach Pegel des Control-Bits.
- "Basic" sendet Befehle an den Kontroller
- "Extended" schreibt die Display-Daten
void SendByteBasic_LCD(unsigned int Daten)
{ // ControlBit low: Basic Instruction, send Commands
uint16_t i;
P_Data = 0;
P_Clock = 0;
P_Control = 0;
P_ChipSelect = 0;
i = 0;
do {
if (((1 << (7-i))& Daten) > 0) P_Data = 1; else P_Data = 0;
P_Clock = 1;
P_Clock = 0;
i++;
} while (i <= 7);
P_ChipSelect = 1;
}
void SendByteExtended_LCD(unsigned int Daten)
{ // ControlBit high: Extended Instruction, write Display Data
uint16_t i;
P_Data = 0;
P_Clock = 0;
P_Control = 1;
P_ChipSelect = 0;
i = 0;
do {
if (((1 << (7-i))& Daten) > 0) P_Data = 1; else P_Data = 0;
P_Clock = 1;
P_Clock = 0;
i++;
} while (i <= 7);
P_ChipSelect = 1;
}
Eine funktionierende Init-Sequenz ist die folgende:
Init_LCD
{
SendByteBasic_LCD(0x40); //Startline 0
SendByteBasic_LCD(0xA0); //SEG reverse
SendByteBasic_LCD(0xC0); //Set COM direction (COM0-COM63)
SendByteBasic_LCD(0xA4); //Set all Pixel to on
SendByteBasic_LCD(0xA6); //Display normal
SendByteBasic_LCD(0xA2); //Set bias 1/9
SendByteBasic_LCD(0x2F); //Booster, regulator, follower on
SendByteBasic_LCD(0x27); //Set contrast
SendByteBasic_LCD(0x81); //Set contrast
SendByteBasic_LCD(0x10); //Set contrast
SendByteBasic_LCD(0xFA); //Temperature compensation
SendByteBasic_LCD(0x93); //Temperature compensation
SendByteBasic_LCD(0xAF); //Display on
}
Das Display benötigt insgesamt 816 Byte an Display-Daten. Die vertikalen Pixel sind in 8er Gruppen organisiert. Mit jedem Byte werden 8 vertikale Pixel
gleichzeitig gesetzt. Eine Zeile besteht somit aus 8 Bits * 102 Spalten ( = 816 Bits = 102 Byte). Das ganze mal 8 Zeilen.
Dies gilt für die "normale" Einbaulage (Kontroller oben, der schwarz vergossene Bereich). Bei umgedrehter Einbaulage müssen zuerst 30 Dummy-Bytes gesendet werden weil der Bildspeicher im Kontroller intern mit einigen nicht sichtbaren Pixeln arbeitet.
DEM 128064P
Dieses Display ist von der Firma
Display Elektronik. Es hat ein 128 x 64 Pixel LCD und einen ST7567 Controller
von Sitronix. Es ist Teil einer Familie von ähnlichen Modulen mit unterschiedlichen Grössen, Farben und Beleuchtungsarten.
Die Stromversorgung der Hintergrundbeleuchtung ist etwas unüblich, 2 Kontaktzungen auf der Rückseite.
Im Modul-Datenblatt
fehlen leider die Angaben für die Beschaltung der Kondensatoren, man findet sie aber im Datenblatt des Controllers oder bei den "Geschwister"-
Modulen.
Eine funktionierende Init-Sequenz ist die folgende:
Init_LCD
{
LCD_SendCommand(0xE2); // (14) Software Reset 0b1110 0010
// LCD_SendCommand(0xA2); // (11) Bias Select 0b1010 0010 1/9 (Duty = 1/65), contrast -> 34
LCD_SendCommand(0xA3); // (11) Bias Select 0b1010 0011 1/7 (Duty = 1/65), contrast -> 20
// Upside Down Orientation
// LCD_SendCommand(0xA1); // (8) SEG Direction 0b1010 0001 Reverse Direction
// LCD_SendCommand(0xC0); // (15) COM Direction 0b1100 0000 Normal Direction
// Normal Orientation
LCD_SendCommand(0xA0); // (8) SEG Direction 0b1010 0000 Normal Direction
LCD_SendCommand(0xC8); // (15) COM Direction 0b1100 1000 Reverse Direction
LCD_SendCommand(0x40); // (2) Set Start Line
LCD_SendCommand(0xA4); // (10) All Pixel ON, normal display
LCD_SendCommand(0xA6); // (9) Display Color Normal 0b1010 0110
// LCD_SendCommand(0xA7); // (9) Display Color Inverse 0b1010 0111
LCD_SendCommand(0x24); // (17) Regulation Ratio 0b0010 0100 -> 5.0
LCD_SendCommand(0x81); // (18) Set EV 0b1000 0001 (double byte instruction)
LCD_SendCommand(0x14); // (18) Set EV 0b0000 1000 (value 20)
LCD_SendCommand(0x2F); // (16) Power Control 0b0010 1111 -> all circuits ON
LCD_SendCommand(0xAF); // (1) Display ON/OFF 0b1010 0111
}
Der Controller hat einen internen Pixel-Speicher (Display-Data-RAM) von 132 x 65 Bits. Verwendet werden eber nur 128 x 64 (= Anzahl Pixel des LCD).
Beim Schreiben des DDRAM wird der Pointer automatisch inkrementiert, aber nur bis zum Ende einer Zeile (genannt Page). Danach muss per Command die nächste Page angewählt werden. Diese Verhalten ist etwas ungewöhnlich. Üblicherweise kann man das DDRAM "in einem Rutsch" linear beschreiben.
Densitron PC-6749-AA
Dieses Modul fand ich bei Pollin in der "Restekiste". Es hat ein HTN, transflektives/positive Glas mit 3 Hex-Ziffern, Hintergrundbeleuchtung
und ein HT1621 als Treiber-IC. Abmessungen 27.40 x 21.90 x 5.50mm.
Der HT1621 ist ein universeller LCD-Controller ohne Character-Generator. Er wird über einen 3-Draht-Bus programmiert. Die passenden Treiber-Sourcen
fand ich dankenswerterweise in einem Forum:
https://www.mikrocontroller.net/topic/380929
Die Darstellungsmöglichkeiten sind leider sehr begrenzt und der Kontrast ist auch nicht so super. Aber völlig ausreichend um ein
paar Ziffern oder Hex-Symbole darzustellen.
DE 112-RS
Dies ist ein sog. "Digital"-Display aus der DE 112 Serie von "Display Elektronik GmbH". Es besteht nur aus einem Glas, ohne
Treiber-Elektronik. In dieser Serie gibt es noch andere Varianten in transflektiver Ausführung für den Betrieb mit Hintergrundbeleuchtung.
Ich suchte eins mit maximalem Kontrast und habe deshalb die reflektive Ausführung gewählt.
Diese Art von Displays benutzt kein Multiplexing und liefert dadurch einen besseren Kontrast als die oben gezeigten Grafik-Displays.
Das fehlende Multiplexing macht die Ansteuerung relativ einfach. Allerdings muss man sich jetzt "um die Wechselspannung
kümmern". Um ein Segment sichtbar zu schalten muss es gegenphasig zur Backpanel-Elektrode angesteuert werden. Das ganze
im Wechseltakt mit ~60Hz. Takt und Pegel müssen genau eingehalten werden um im Mittel gleichspannungsfrei zu bleiben.
Der erlaubte Gleichanteil liegt bei nur max 50uV.
Für die Ansteuerung gibt es auch eine Application Note von Atmel:
AVR241: Direct driving of LCD display using general IO
Im Atmel habe ich Timer 0 als normalen, durchlaufenden Zähler für den Takt benutzt, mit aktiviertem Überlauf-Interrupt.
{
TCCR0B = 0b00000011;
TIMSK0 = (TIMSK0 | (1 << TOIE0)); // Overflow-Interrupt enabled
}
Bei jedem Überlauf-Interrupt wird die Polarität des Backpanel-Signals
umgeschaltet, gleichzeitig die Segmente. Ein Segment im Gleichtakt bleibt unsichtbar, im Gegentakt wird es sichtbar. Mit einer
Tabelle und ein bischen XOR Rechnung werden die Zeichen zusammengebaut.
Wichtig ist dabei dass der Interrupt möglichst ungestört ablaufen kann. Ein zu grosse Unsymmetrie verursacht gemittelt eine Gleichspannungskomponente, die unbedingt vermieden werden muss.
Links
Einige generell Links zum Thema:
http://www.mikrocontroller.net/articles/Kategorie:LCD
http://www.mikrocontroller.net/articles/LCD#Weblinks
http://lcdhype.condense.de/
Der folgende Bastler verwendet gerne Bauteile und Module aus der "Reste-Ecke" von Pollin und Co. Dazu gibt er viele praktische Hinweise
und Tipps. Eine sehr schön gemachte und übersichtliche Seite.
Homepage Steppi
Er hat mit Erfolg diverse Displays zum Laufen gebracht: