DOGM163-LCD an STM32 mit SPI und 3.3V betreiben

Neulich hat der Schnäppchenjäger in mir neue Beute erlegt, und zwar LCD mit der Bezeichnung EA DOGM163 S-A zusammen mit Hintergrundbeleuchtungen der Bezeichnung EA LED55X31-A. Das Ganze zu einem Preis, bei dem ich gleich 5 Stück bestellt habe. Hätte ich gewusst, dass die Teile funktionieren und ich sie zum Laufen bekomme, dann hätte ich sicher noch mehr bestellt. Nun sind sie natürlich schon ausverkauft. Aber hätte ich mehr bestellt, etwa 20 Stück, dann hätte sicher Murphys Law zugeschlagen und ich hätte mit allen 20 nichts anfangen können und das Geld zum Fenster heraus geworfen.

Das DOGM163 ist eigentlich ganz pfiffig. Hintergrundbeleuchtung und Leuchtkristall-Panel sind getrennt, so dass man Hintergrundfarbe und LCD-Modell selbst wählen bzw. kombinieren kann. Beim Schnäppchen gab es natürlich keine Auswahl, sondern fest gelb/grün und 3 Zeilen Text à 16 Zeichen. Und als Backlight-Modul Amber. Aber das finde ich eigentlich ganz schön und 3 Zeilen sind praktisch. Hoffentlich sind die Zeichen am Schlus nicht zu klein. Aber das wird sich bald zeigen...

Zusammenlöten

Die Pins des LCD werden in das Hintergrundbeleuchtung-Modul eingeschoben, was ein ziemliches Gefummel ist, denn die Beinchen sind dünn und die Löcher winzig im Durchmesser. Und ein paar Beinchen waren natürlich schon verbogen. Da hat sich jemand eine halbe Sekunde Zeit gespart und die Teile superschnell und blind in den Antistatikschaum gesteckt und ich darf dann 5 Minuten damit verbringen, die Beinchen wieder 100%ig auszurichten, damit sie durch die Löchlein passen. Vielen Dank - such dir einen anderen Job!

Dann werden die Pins auf der Rückseite verlöten und LCD und Backlight eine Einheit. Außer den 20 Pins für das LCD oben gibt es noch 4 Pins für die zwei LEDs im Backlight.

Leider schauen die Beinchen nach dem Einstecken nicht mehr so weit raus, so dass es noch gerade so geht, das LCD in ein Breadboard zu stecken, wobei es auch zu breit ist und man keine Jumper-Kabel mehr nebendran einstecken kann. Man muss schon zwei Breadboards benutzen.

Auf der anderen Seite ist das Modul mit nun 5.5 mm Höhe (ohne die herausschauenden Pins) sehr flach. Was allerdings auch geht, die Beinchen (die man hoffentlich sparsam und sauber verlötet hat) in Präzisionsbuchsenleisten (einreihig, die mit den runden Löchern und Beinchen) zu stecken, da passen die nämlich wunderbar rein und man hat wieder lange (und vor allem feste) Anschlussbeinchen für das Breadboard. Das macht die Sache natürlich ein bisschen höher, ist klar, wenn man das LCD auf Absätze stellt.

Anschließen

Das Datenblatt ist nicht so sonderlich übersichtlich, aber folgende Infos konnte ich finden:




Zu beachten beim Betrieb bei 3.3V und Nutzung von SPI: Folgenden Schaltplan habe ich für die Konfiguration SPI/3.3V gefunden. Pin 40 geht allerdings abweichend nicht an +3.3V, sondern an einen freien Pin (bei mir PA1).



Die LEDs sind im Schaltplan nicht beschaltet, es gilt das oben Gesagte. Auch sollte man die Warnung im Datenblatt beachten:
Betreiben Sie die Beleuchtung nie direkt an 5V/3,3V; das kann zur sofortigen Zerstörung der LEDs führen

Library besorgen

Auf lcd-module.de findet man das Datenblatt zum Display und das Datenblatt zum Controller ST7063.

Außerdem findet man dort einen Link zu Arduino meets EA DOG und dort einen Link zu der Zip-Datei Arduino meets EA DOGM081 DOGM162 DOGM163.zip.

Und in diesem Archiv findet man dann einen Ordner Arduino Library/DOGM_7036, der die beiden Files dogm_7036.cpp und dogm_7036.h enthält. Und auf diese beiden baut der nachfolgende Source auf, mit dem ich nach einigem Hin und Her dann doch noch das Display zum Laufen gebracht habe:

Source-Code

defines.h // DOGM163 LCD #define PinSS PA4 #define PinRS PB0 #define PinReset PB1 #define PinSpiClk PA5 #define PinSpiMOSI PA7 #define PinDogBackLED PB2 main.cpp bzw. dogm163.ino ///////////////////////////////////////////////////////// // (C) 2020 by Oliver Kuhlemann // // Bei Verwendung freue ich mich ueber Namensnennung, // // Quellenangabe und Verlinkung // // Quelle: http://cool-web.de/arduino/ // ///////////////////////////////////////////////////////// #include <Arduino.h> #include <SPI.h> // für DOGM163 LCD #include "dogm_7036.h" #include "defines.h" dogm_7036 DOG; byte arrow_down[] = {0x04, 0x04, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x00}; //pattern for own defined character void setup() { pinMode(LED_BUILTIN, OUTPUT); pinMode(PinSS, OUTPUT); pinMode(PinRS, OUTPUT); pinMode(PinReset, OUTPUT); pinMode(PinDogBackLED, OUTPUT); pinMode(PinSpiClk, OUTPUT); pinMode(PinSpiMOSI, OUTPUT); Serial.begin(115200); for (int i=0; i < 4; i++) { // Reset-Indikation und auf serielle Schnittstelle warten digitalWrite(LED_BUILTIN,LOW); delay(250); digitalWrite(LED_BUILTIN,HIGH); // und erstmal aus delay(250); } //DOG.initialize(10,0,0,9,4,0,DOGM163); //SS = 10, 0,0= use Hardware SPI, 9 = RS, 4= RESET, 0 = 3.3V, EA DOGM163-A (=3 lines) //DOG.initialize(PinSS, 0, 0, PinRS, PinReset, 0, DOGM163); // Hardware-SPI funktioniert nicht DOG.initialize(PinSS, PinSpiMOSI, PinSpiClk, PinRS, PinReset, 0, DOGM163); DOG.contrast(16); //bester Kontrast für 3.3V und den eingesetzen 22 Ohm Widerstand DOG.displ_onoff(true); //turn Display on DOG.cursor_onoff(false); //turn Curosor blinking on/off DOG.define_char(0, arrow_down); //define own char on memory adress 0 DOG.position(8,2); DOG.ascii(0); //show own defined char (adress 0, see DOG.define_char()) DOG.position(8,3); DOG.cursor_onoff(true); //turn Curosor blinking on/off delay(5000); DOG.cursor_onoff(false); //turn Curosor blinking on/off } void loop() { DOG.clear_display(); //Clear the whole content DOG.position(1,1); //set Position: first line, first character DOG.string("DOGM163 / ST7036"); //show String DOG.position(1,2); //set Position: second line, first character DOG.string("Soft SPI at 3.3V"); DOG.position(1,3); DOG.string("www.cool-web.de"); delay(5000); }

Test des Displays

Und mit diesem Source lief dann das Display endlich:



Auf dem Foto erscheint die Schrift auf dem DOGM163 eher gelb-grün, in Wahrheit ist sie aber mehr bernsteinfarben und eigentlich recht angenehm.

Wenn man die Hintergrundbeleuchtung ein- und ausschaltbar machen möchte, dann schließt man die LEDs nicht an 3.3V an, sondern an einen Pin des STM32, den man dann mit digitalWrite() auf High oder Low setzen kann.