Christians Webseite        << zurueck        vor >>

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.

LCD Display LCD Display

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.

LCD Display LCD Display
LCD Display LCD Display

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
Abmessungen (ca.): 37.3 x 35 x 4.5 mm
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.

LCD Display LCD Display
LCD Display

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:

LCD Display LCD Display LCD Display

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.

LCD Display LCD Display

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.

LCD Display LCD Display

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.

LCD Display LCD Display
LCD Display LCD Display
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
LCD Display LCD Display LCD Display

LCD Display LCD Display LCD Display

Nokia 1202

Nokia 1202 S/W Display, 96 x 68 Pixel. Controller STE2007
LCD Display LCD Display

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
LCD Display

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.

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

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.
LCD Display

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.

LCD Display LCD Display
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.
LCD Display LCD Display LCD Display

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