Ansteuerung eines Monochrom-Grafikdisplays (128x64 Bildpunkte)

Beschreibung

Die Ansteuerung von Grafik-LCDs mit 128x64 Bildpunkten und KS0108-kompatiblen Controllern ist in der folgenden Funktionsbibliothek für 8-Bit-ATmega-Controller wie dem ATmega16 implementiert. Sie beinhaltet Funktionen wie die Initialisierung, das Löschen des Displays und einzelner Zeilen, die Ausgabe von Texten inklusive automatischem Scrollen und die Anzeige von XBM-Grafiken an beliebiger Stelle des Displays. Implementiert ist auch ein Zeichensatz mit 6x8 Punkten, der von der Funktion zur Textausgabe genutzt wird.
Bei der Verwendung des "Latched I/O-Modus" (einzustellen in glcd.h) kann - unter Verwendung der unten aufgeführten Schaltung - mit Hilfe von Latches die Anzahl der benötigten Pins auf 8 reduziert werden.

glcd_schematics.png

Die Schaltung enthält zwei Latches (74HCT573) und ein NAND (74LS37, ein 74LS00 passt auch). Die Adressleitungen sind über die Latches geführt, die Steuerleitungen sind direkt mit dem Display verbunden. Der Port "uc Control" führt eine Leitung (Reset), mit deren Hilfe bei einem Reset (Active Low) das Enable-Signal inaktiv gehalten wird. Das verhindert, dass das Display bei einem Reset des Microcontrollers unkontrolliert zufällige Daten empfängt oder bei einer Programmierung des Controllers per SPI-Schnittstelle diese Programmierung stört (falls es an den entsprechenden Port angeschlossen ist). Falls dieser Port nicht verbunden ist, sollte mittels Jumper "JP1" die Reset-Leitung auf "High" gezogen werden. Mit Hilfe des Tasters kann der Nutzer manuell ein Reset-Signal erzeugen (z. B. bei der Programmierung der Microcontrollers per SPI, wenn das Display an diesem Port angeschlossen ist).
Die im Schaltplan eingezeichneten Widerstände sind für das Display WG12864A-TTI-V#N von Winstar Display Co., LTD angepasst. Hier ist das jeweilige Datenblatt für die korrekte Beschaltung eines anderen Displays zu konsultieren!

Quellen

Beispiele

Die Darstellung eines Bitmap-Bildes (im XBM-Format) erfolgt mittels Aufruf der Funktion glcd_show_xbm():

return_value = glcd_show_xbm(smiley2_bits, 30, 5, smiley2_width, smiley2_height, TRUE);

Die Funktion zeigt die in glcd_bitmaps.h definierte XBM-Grafik "smiley2_bits" ab Position (30,5) mit den angegebenen Abmessungen an. Das letzte Argument der Funktion gibt an, dass sich das Bild zur Laufzeit im Programmspeicher des Controllers befindet (PROGMEM), ansonsten ist hier FALSE zu übergeben. Das Display wird von der Funktion nicht gelöscht, sondern nur an den entsprechenden Stellen neu gezeichnet.
XBM-Grafiken lassen sich mit Programmen wie zum Beispiel gimp erzeugen oder aus anderen Formaten umwandeln.

Mittels der beiden Aufrufe

glcd_set_cursor(2,7);
glcd_send_string("Text 1234567890", FALSE);

setzt man den Cursor an die Position 2 in Zeile 7 und gibt den Text "Text 1234567890" aus.

glcd.jpg

Falls der Text im Programmspeicher steht und nicht im RAM:

const char pgm_mem_text[] PROGMEM = "Text 1234567890";

ist bei dem Aufruf von glcd_send_string() als zweites Argument "TRUE" anzugeben:

glcd_set_cursor(2,7);
glcd_send_string(pgm_mem_text, TRUE);


Mit Hilfe der Funktion glcd_show_diagram() kann der Nutzer fortlaufend Ausgaben in Diagrammform auf das Display bringen. Die Funktion speichert die letzten 127 Werte in einem Ringpuffer und muss daher immer nur mit dem aktuellen Wert aufgerufen werden. Die Initialisierung erfolgt mit Hilfe des Flags "reset" (TRUE).
Für die normale Anzeigefunktion sind die Bezeichnung der x-Achse, die Länge dieses Strings, die Bezeichnung der y-Achse, der aktuelle Wert, der Wertebereich und das Reset-Flag (FALSE) zu übergeben. So führt beispielsweise ein zyklischer Aufruf von

glcd_show_diagram("8 ms", 4, "5 V", ad_result, 5000, FALSE);
glcd_set_cursor(7, 0);
glcd_send_string(" ", FALSE);
glcd_set_cursor(7, 0);
itoa(ad_min_value, tmp_char, 10);
glcd_send_string(tmp_char, FALSE);
glcd_send_string("...", FALSE);
itoa(ad_max_value, tmp_char, 10);
glcd_send_string(tmp_char, FALSE);
glcd_send_string(" mV", FALSE);
glcd_set_cursor(7, 1);
glcd_send_string(" ", FALSE);
glcd_set_cursor(7, 1);
glcd_send_string("P2P: ", FALSE);
itoa((ad_max_value - ad_min_value), tmp_char, 10);
glcd_send_string(tmp_char, FALSE);
glcd_send_string(" mV", FALSE);

zu folgender Ausgabe (Video):

glcd3.jpg glcd4.jpg


Falls die Diagrammdaten bereits in einem Feld komplett verfügbar sind und mit einem einzigen Aufruf komplett angezeigt werden sollen, ist der Befehl glcd_show_complete_diagram() zu benutzen. Im Unterschied zu glcd_show_diagram() ist an Stelle des aktuellen Wertes ein Zeiger auf das Feld mit den Daten zu übergeben (Länge: GLCD_X_RESOLUTION) und das Reset-Flag entfällt.

Geeignete Displays

Grundsätzlich sollten die Routinen für alle Grafik-Displays mit 128x64 Bildpunkten und zwei Controllern (KS0108 oder kompatible) geeignet sein. Getestet wurden die Funktionen bis jetzt an folgendem Display:

Fehlerquellen

Falls die Ansteuerung des Displays nicht funktioniert, sollten folgende mögliche Fehlerquellen ausgeschlossen werden: Wenn diese Fehlerquellen ausgeschlossen sind, kann es natürlich sein, dass die Funktionen für das spezielle Display nicht funktionieren, weil der Zugriff auf das Display anders erfolgen muss oder die Organisation der Zeilen und Spalten anders gelöst ist. In diesem Fall ist das Datenblatt zu konsultieren, um evtl. die Quellen anzupassen.

Lizenz

Alle hier veröffentlichten Quellen stehen unter der LGPLv3.

Versionsinfo

Anregungen oder weitere Informationen

Für Anregungen oder die Beantwortung von Fragen zum Projekt steht ein Forum zur Verfügung.