This is an old revision of the document!
Necessary knowledge: [HW] lcd, [LIB] Alphanumeric LCD, [LIB] Delay, [PRT] Periodic interrupt
Das alphanumerische LCD ist ein Flüssigkristall-Display, mit dem Zweck Buchstaben und Nummern darzustellen. In einfachen LCD's sind flüssige Kristalle zwischen transparenten Elektroden, welche die Polarisation des durchstrahlenden Lichts im elektrischen Feld veränderen. Die Elektroden sind mit Polarisationsfiltern bedeckt, welche sicher stellen, das nur in eine Richtung polarisiertes Licht durch die Screen kann. Wenn der Flüssigkristall seine Polarisation, durch das elektrische Feld ändert, kann das Licht nicht durch die Screen bzw. das Segment und es wirkt Schwarz.
Die Haupteigenschaften eines alphanumerischen LCD sind die Segmente und ihre Platzierung. Der Bildschirm ist in verschiedene Indikatoren unterteilt. Jeder Indikator hat genug Segmente um um Buchstaben oder Nummern anzuzeigen oder eine Matrix aus kleinen Kästchen-Segmenten (Pixel) wird geformt. Zum Beispiel ist eine Matrix aus 5×7 Pixel genug um alle Nummern und Buchstaben des Lateinischen Alphabets darzustellen. Es gibt normalerweise 1-4 Reihen an Indikatoren mit 8-32 Spalten. Jeder Indikator hat einen kleinen Abstand ähnlich der Buchstaben im Text
Außer des Bildschirms hat das alphanumerische LCD auch einen Controller welche die Segmente der Screen je nach Befehl vom Kommunikations-Interface kontrolliert. Ein Controller hat eine vorprogrammierte Karte an Buchstaben, wo jeder Buchstabe, Nummer und Symbol ihren eigenen Index haben. Das darstellen von Text auf dem Bildschirm wird, einfach gesagt, dadurch bewerkstelligt, dass die Indizes zum Controller gesendet werden. In wirklichkeit müssen es mehr Kontrollbefehle gesendet werden, bevor irgendetwas dargestellt werden kann. Es wichtig sich mit jedem LCD Datenblatt vertraut zu machen, weil es viele verschiedene Typen von LCDs gibt und diese alle unterschiedlich kontrolliert werden.
Alphanumerische LCDs haben normalerweise eine passive Matrix, wo die Erneuerung des elektrischen Feldes der Segmente rundenweise stattfindet. Darum sind die Bildschirme mit passiver Matrix langsamer und haben weniger Kontrast als welche mit aktiver Matrix, wo die Ladung jedes Segments durch einen eigenen Transistor erfolgt. Einige LCDs haben eine reflektierende Rückfläche, andere haben eine Backlight, manchmal sogar viele verschiedene Backlights. Aber die Segmentfarbe für alphanumerische LCDs ist nur eine, schwarz, aber es gibt auch Bildschirme mit weißer oder bunter Schrift.
Am HomeLab Digitalen I/O-Modul ist ein 2×16 Symbol alphanumerisches LCD WC 1602A angeschlossen. Um den Bildschrim zu kontrollieren gibt es einen 4-Bit Datenbus und 3 Kontroll-Pins, aber das Kommunikationsprotokoll ist viel zu umfangreich um es hier zu besprechen. Um es einfach zu halten, die HomeLab Library hat die Funktionen um das Display zu nutzen.
Bevor man das Display nutzt, ist es wichtig die Einstellungen anzupassen. Dafür gibt es die lcd_alpha_init Funktion, welche einen blinkenden Cursor auf dem Bildschrim erscheinen lässt. Auf dem Bildschirm gibt es nur eine aktive Position für den Cursor wo Text eingegeben werden kann. Also bevor man Text eingibt, muss der Cursor zur gewünschten Position bewegt werden. Um die Position des Cursors zu verändern gibt es die Funktion lcd_alpha_goto_xy und für die Darstellung die Funktion lcd_alpha_write_string. All diese Funktionen des alphanumerischen LCDs werden in der Library erklärt.
Der folgende Programm-Code zeigt wie man das alphanumerische LCD als Uhr nutzt. Die Zeit beginnt um 00:00:00 und steigt annährend jede Sekunde. Da das zählen von Zeit mit einer Verzögerungsfunktion geschieht, ist das nicht sehr genau. Die Ungenauigkeit wird in der Aufgabe zu periodischen Unterbrechungen erklärt. Das Programm zählt die Zeit in Sekunden und konvertiert diese in Minuten und Sekunden. Um Uhrzeit darzustellen wird die Standard-Funktion in C-Sprache genutzt: sprintf.
// // The example of using the alphanumerical LCD of the HomeLab. // The clock time starting at the beginning of the program is displayed on the LCD. // #include <stdio.h> #include <homelab/module/lcd_alpha.h> #include <homelab/delay.h> // // Main program. // int main(void) { int seconds = 0; char text[16]; // Set-up of the LCD. lcd_alpha_init(LCD_ALPHA_DISP_ON); // Cleaning of the LCD. lcd_alpha_clear(); // Name of the program. lcd_alpha_write_string("The Time Counter"); // Endless loop while (true) { // Converting the seconds to the clock form: // hh:mm:ss sprintf(text, "%02d:%02d:%02d", (seconds / 3600) % 24, (seconds / 60) % 60, seconds % 60); // Displaying the clock text in the beginning of the second row of the LCD. lcd_alpha_goto_xy(0, 1); lcd_alpha_write_string(text); // Growing seconds by 1. seconds++; // Hardware delay 1000 ms. hw_delay_ms(1000); } }