OLED Display - Pictiva von Osram
Hier habe ich mich mal mit einem aktuellen 2,7 Zoll OLED 128 x 64 Zeichen Display von Osram beschäftigt. Der erste Versuch mit einem 1 Zoll Display des gleichen Herstellers fanden ein sehr schnelles Ende. Die kleinen und winzigen Anschlüsse verdampften als ich sie verlöten wollte. Die brilliante Darstellung von variablen Zeichen und Symbolen ist für eigene Entwicklungen sehr ansprechend. Für die 2,7 Zoll Varianten des Pictiva Displays gibt es passende Steckverbinder vom Hersteller Molex. Die Bestellnummer für diesen 30 poligen ZIF-Socket lautet 9786180. Aber Achtung ! Bei www.farnell.de können nur Gewerbetreibende oder Studenten bestellen. Das Display liefert www.reichelt.de – Bezeichnung – OSRAM Pictiva OLED 128×64, 2,7″, .
Das Display benötigt zwei verschiedene Versorgungsspannungen. Die 3,3 Volt sind für die Logikversorgung und die 9-15 Volt werden für die OLED Punkte benötigt. Ich verwende 12 Volt, die ich aus den 3,3 Volt mit einem kleinen Schaltwandler MC34063 erzeuge. In den hier gezeigten Softwareansteuerungen verwende ich einen ATMEGA32, den ich mit 3,3 Volt und 4 MHz betreibe. Das Display selbst steuere ich im SPI Modus an. Um die C-Software (AVR-GCC) universell zu nutzen, gehe ich über 5 normale Controller-Output-Pins des Ports A. Nach einer normalen Initialisierung des Displays findet man 3 Programme um Zeichen auf dem kleinen Display darzustellen. Da das Display auch wirkunsvolle Helligkeitsstufen wiedergeben kann, gibt es in meiner Pictiva Zeichensoftware auch eine Möglichkeit, die Hintergrundfärbung (0-15) oder die Zeichenfarbe (0-15) zu verändern.
normale Zeichengrösse (maximal 20 Zeichen auf 8 Zeilen)
- – zeichen(ascii zeichen, spalte, zeile, hintergrund, zeichenfarbe)
doppelte Zeichengrösse (maximal 10 Zeichen auf 4 Zeilen)
- – zeichen_big(ascii zeichen, spalte, zeile, hintergrund, zeichenfarbe)
vierfache Zeichengrösse (maximal 5 Zeichen auf 2 Zeilen)
- – zeichen_big2(ascii zeichen, spalte, zeile, hintergrund, zeichenfarbe)
- download C Library (Displaytreiber) fü SSD0323 2,7 Zoll Stand: 15.03.2021
- download C Library (Displaytreiber) für SSD1303 1,1 Zoll Stand: 15.03.2021
- download PDF Schaltungen / Notizen / Unterlagen / Handzeichnungen
- download PDF Layout der beiden Adapterleiterplatten
- Die Display Herstellerbezeichnung lautet beim 2,7 Zoll Display OS128064PK27MG0B00 .
per Software als 8 Zeilen a 20 Zeichen Display – 2,7 Zoll
30 Anschlüsse mit 0,5mm können nur mit einer Buchse angeschlossen werden
irre Kontraste, gestochen scharf aus jeder Blickrichtung
das kleinere 1,1″ OLED Display mit SSD1303 Controller
Besonderheiten / Beschreibung der im OLED verwendeten SSD0323 und SSD1303 Displaycontroller
Pictiva 2,7 Zoll Display (128 x 64 Pixel) mit Controller SSD0323
Dieses einfarbige Display (gelb/grünlich) kann auch jeden angezeigten Bildpunkt mit einer 4 Bit (16 Stufen) Helligkeitsabstufung darstellen. Das gesamte Display ist nach der Initialisierung Punkt für Punkt beschreibbar. Vor dem Beschreiben der Bildpunkte muss ein Scheibfenster festgelegt werden. In dieses Schreibfenster überträgt man dann Punkt für Punkt.
Das Schreibfenster besteht aus zwei „Column“ Spalten Adressen und zwei „Row“ Zeilen Adressen. Zwei? Weil es immer ein von bis Schreibbereich gibt! Die beiden Spaltenadressen (Fensterbreite) werden immer über Befehl send_data(0x15) und den beiden Spaltenadressen z.B. send_data(0x00) send_data(0x3f) programmiert. In diesem Beispiel können alle wagerechten Bildpunkte von 0 bis 0x3f (64 Byte = 128 Pixel) beschrieben werden. Die nur 64 Byte kommen daher, dass in einem Byte 2 Bildpunkte adressiert werden. Mit dem linken Nibble wird der linke Bildpunkt und mit dem rechten Nibble des Bytes wird der rechte Bildpunkt angesteuert. Jedes Nibble enthält die Helligkeitsinformation. Mit 0xf0 wird der linke Bildpunkt mit voller Helligkeit angesteuert und der rechte Bildpunkt bleibt dunkel. Werden als Beispiel 64 Byte über den Befehl send_char(0x00) gesendet, ist die komplette Zeile mit 128 Pixel dunkel und gelöscht.
Die beiden Zeilenadressen werden nach dem Befehlsbyte send_data(0x75) eingegeben. Mit der Befehlsfolge 0x75 0x00 0x3f können am Display alle 64 Zeilen in diesem Schreibfester angesteuert werden.
Es muss nicht am Ende der gerade beschriebenen Zeile ein neuer Befehl für nächste Zeile gesendet werden. Es erhöht sich automatisch nach jedem send_char(x) Befehl die Spaltenadresse und am Ende des Schreibfensters wird auf der nächst mögliche Zeilenadresse weitergeschrieben. Ist der unterst rechte Bildpunkt erreicht und es folgen weitere send_char(x) Befehle, dann wird eben wieder oben links weitergemacht.
Beispiel – wagerechter 1 Pixel breiter Strich mit 10 Pixel länge
send_data(0x15); // 5 Spaltenbyte = 10 Pixel
send_data(0x00);
send_data(0x04);
send_data(0x75); // 1 Zeile mit Pixel in 2 Zeile
send_data(0x02);
send_data(0x02);
send_char(0xff); // 5 Byte a 2 Pixel volle Helligkeit ausgeben
send_char(0xff);
send_char(0xff);
send_char(0xff);
send_char(0xff);
Beispiel – senkrechter Strich 1 Pixel breit 8 Pixel hoch
send_data(0x15); // 1 Spaltenbyte
send_data(0x00);
send_data(0x00);
send_data(0x75); // 8 Zeilen
send_data(0x00);
send_data(0x07);
send_char(0xf0); // 8 Byte , nur linkes Pixel voll an
send_char(0xf0);
send_char(0xf0);
send_char(0xf0);
send_char(0xf0);
send_char(0xf0);
send_char(0xf0);
send_char(0xf0);
Pictiva 1,1 Zoll Display (96 x 64 Pixel) mit Controller SSD1303
Dieses recht kleine 1,1 Zoll Display wurde ursprünglich für MP3 Player entwickelt und unterstützt keinerlei Graustufendarstellung. Auch bei diesem Display kann jeder Bildpunkt einzeln angesteuert werden und die Anzeigedarstellung von Zeichen ist sehr gut und klar. Der Anzeigespeicher ist bei diesem Display in 8 Pages (Zeilen) eingeteilt. Jede diese Zeilen ist exakt 8 Pixel hoch. Die Hardwareansteuerung des Displays unterscheidet sich kaum vom o.g. Pictiva Display mit einem SSD0323 Controller. Nur bei den 3 letzten Pins des Displays gibt es Unterschiede. Es gibt keine Steckverbindungen. Das Display muss mit der Leiterplatte verlötet werden. Die Softwareansteuerung des OLED Display mit SSD1303 Controller ist aber durch die 8 Pages völlig anders. Es werden mit einem Bildpunktbyte immer 8 Bildpunkte untereinander angesteuert. Die Spaltanadresse wird mit zwei 8 Bytebefehlen voreingestellt. Bei den Befehlen gibt es sehr viele Befehle, die nur ein Byte gross sind. Beim linken Nibble ist oft der Befehl und beim rechten Nibble der Wert versteckt. So auch bei den beiden Befehlen für die Spaltenadresse. Um die ganz linke Spalte für einen Schreibbefehl anzuwählen, müssen zwei Adressbefehle an den Steuercontroller des SSD1303 gesendet werden. Mit einem send_data(0x00) Befehl, wird der low Nibble der Adresse auf den Wert 0 (ist das rechte Nibble des Befehls) gesetzt. Mit einem send_data(0x10) Befehl wird das obere Nibble des Adresse auf den Wert 0 gesetzt. Bei einer zu beschreibenden Spalte von hex 21 sind die Befehle 0x01 und 0x12 notwendig. Wird ein Bildpunktbyte von 0xff mit send_char(0xff) gesendet werden die 8 Bildpunkte der zum Leuchen gebracht. Mit dem Bildpunktbyte von send_char(0x03) sind es nur die oberen 2 Bildpunkte. Nach jedem übertragenen Bildpunktbyte wird die Spaltenadresse automatisch erhöht. Es erfolgt aber am Ende der Zeile kein Sprung auf den Anfang der nächsten Page (Zeile). Damit auch des letzte Bildpunktbyte sofort dargestellt wird, ist ein NOP Befehl nach dem letzten Bildpunktbyte notwendig. Man sendet dazu einfach nach dem letzten Bildpunktbyte einen send_data(0xe3) Befehl.
Sehr einfach kann man bei diesem OLED Display einzelne oder mehrere Zeilen von links nach rechts scrollen lassen. Dieses Scrollen macht der SSD1303 Controller nach einige Befehlen selbst.
Beispiel – Scrollen der Zeilen 5,6 und 7 ( die drei letzten Zeilen ! )
send_data(0x26); // scroll setup starten
send_data(0x21); // schrittweite 1 pixel
send_data(0x25); // zeile 5 im rechten nibble
send_data(0x20); // 1 Zeile mit Pixel in 2 Zeile
send_data(0x27); // zeile 7 im rechten nibble
… wenn das Bild/Text übertragen ist …
send_data(0x2f); // scrollen einschalten
Beispiel – wagerechter 1 Pixel breiter Strich mit 10 Pixel länge (von oben auf die 3.Pixelzeile)
send_data(0x00); // Spalte 0 – unteres Adressnibble
send_data(0x10); // Spalte 0 – oberes Adressnibble hier 0
send_data(0xb0); // Page 0 (oberste Zeile) Spalte 0 versteckt sich im rechten Nibble
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_char(0x04); // ein Pixel an 3 Pixelzeile
send_data(0xe3); // NOP Befehl – wichtig !
Beispiel – senkrechter Strich 1 Pixel breit 10 Pixel hoch auf 3 Pixelspalte
send_data(0x02); // Spalte 3 – unteres Adressnibble
send_data(0x10); // Spalte 3 – oberes Adressnibble hier 0
send_data(0xb0); // Page 0 (oberste Zeile) Spalte 0 versteckt sich im rechten Nibble
send_char(0xff); // senkrechter Strich die ersten 8 Bildpunkte
send_data(0xe3); // NOP Befehl – wichtig !
send_data(0x02); // Spalte 3 – unteres Adressnibble
send_data(0x10); // Spalte 3 – oberes Adressnibble hier 0
send_data(0xb1); // Page 1 (zweite Zeile) Spalte 1 versteckt sich im rechten Nibble
send_char(0x03); // senkrechter Strich die letzten 2 Bildpunkte
send_data(0xe3); // NOP Befehl – wichtig !
normale Zeichengrösse (maximal 16 Zeichen auf 8 Zeilen)
– zeichen(ascii zeichen, spalte, zeile)
doppelte Zeichengrösse (maximal 8 Zeichen auf 4 Zeilen)
– zeichen_big(ascii zeichen, spalte, zeile)
vierfache Zeichengrösse (maximal 4 Zeichen auf 2 Zeilen)
– zeichen_big2(ascii zeichen, spalte, zeile)