Table of Contents

Graphisches LCD

Notwendiges Wissen: [HW] lcd, [LIB] Graphic LCD, [LIB] Delay, [PRT] Alphanumeric LCD

Theorie

Das graphische LCD liquid crystal display ist ein Display zur Darstellung von Bildern und Text. Es ist ähnlich aufgebaut wie das alphanumerische LCD, mit dem Unterschied, dass sich auf dem graphischen LCD alle Pixel in einer großen Matrix befinden. Bei monochromen LCDs entspricht ein Pixel einem quadratischen Segment, bei Farbdisplays besteht ein Pixel aus drei Unterpixeln. Jedes der Unterpixel lässt nur eine Lichtfarbe durch (rot, grün oder blau). Da die Unterpixel sehr nah beieinander liegen, werden sie als ein Pixel wahrgenommen.

Der durch Pixel eines graphischen LCDs dargestellte Text.

Monochrome graphische Displays haben normalerweise eine passive Matrix, große Farbdisplays (auch Computer-Bildschirme) eine aktive. Im Hinblick auf die Farbe des Hintergrunds und der Pixel entspricht das graphische LCD dem alphanumerischen. Auch das graphische Display verfügt über einen separaten Controller, welcher die Information über die Kommunikationsschnittstelle empfängt und das elektrische Feld für die Segmente generiert. Im Gegensatz zum alphanumerischen LCD, welches Text anzeigt, indem die Indizes der darzustellenden Zeichen gesendet werden, kann das graphische LCD keine Buchstaben eigenständig generieren - sämtliche Bilder und Texte müssen Pixel für Pixel vom Nutzer generiert werden.

Übung

Das HomeLab Kit enthält ein 84×48 Pixel großes, monochromes, graphisches LCD. Es ist das gleiche, welches auch im Mobiltelefon Nokia 3310 verwendet wird. Ein Philips PCD8544 Controller ist am Display angebracht, mit welchem über eine SPI-ähnliche serielle Schnittstelle kommuniziert werden kann. Die Hintergrundbeleuchtung des Displays wird separat gesteuert.Die Kommunikation mit dem Display ist nicht sehr schwer, aufgrund der vielen Funktionen wird sie hier jedoch nicht erläutert. Die HomeLab Library enthält die dafür notwendigen Funktionen.

Die Funktionen für das graphische LCD sind ähnlich zu denen des alphanumerischen LCD. Zuerst muss der Bildschirm mit der Funktion lcd_gfx_initgestartet werden. Nach dem Start sollte man den Bildschrim, bzw. den Speicher des Controllers mit der lcd_gfx_clear Funktion leeren. Die Library enthält eine Abbildung des vollständigen lateinischen Alphabets, der Zahlen sowie der am häufigsten verwendeten Zeichen. Die Buchstaben ist 7 Pixel hoch und 5 Pixel breit. Der Abstand zwischen den Buchstaben beträgt horizontal 6 und vertikal 8 Pixel. Es können also Buchstaben in 6 Reihen mit 14 Spalten auf dem Display dargestellt werden. Zur Darstellung von Buchstaben oder Text, muss zunächst mit der Funktion lcd_gfx_goto_char_xy die Position festgelegt werden. Mit der Funktion cd_gfx_write_char wird ein Buchstabe angezeigt, die Funktion lcd_gfx_write_string ermöglicht die Darstellung eines Textes.

Nachfolgend ist ein Beispiel des Zeitzählers dargestellt. Das Programm zählt Sekunden (annähernd), Minuten und Stunden. Zum Konvertieren von Zeit in Text wird die Funktion sprintf genutzt.

//
// Beispiel für die Nutzung des graphischen LCD des HomeLab.
// Die Tageszeit wird ab Beginn des Programms auf dem LCD angezeigt.
//
#include <stdio.h>
#include <homelab/module/lcd_gfx.h>
#include <homelab/delay.h>
 
//
// Hauptprogramm.
//
int main(void)
{
    int seconds = 0;
    char text[16];
 
    // Einrichten des LCD.
    lcd_gfx_init();
 
    // Löschen des Displays.
    lcd_gfx_clear();
 
    // Einschalten der Hintergrundbeleuchtung.
    lcd_gfx_backlight(true);   
 
    // Anzeige des Programmnamens.
    lcd_gfx_goto_char_xy(1, 1);
    lcd_gfx_write_string("Aja loendur");
 
    // Endlosschleife.   
    while (true)
    {
        // Sekunden in die Form der Uhrzeit konvertieren.
        // hh:mm:ss
        sprintf(text, "%02d:%02d:%02d",
            (seconds / 3600) % 24,
            (seconds / 60) % 60,
             seconds % 60);
 
        // Anzeige des Zeittextes.
        lcd_gfx_goto_char_xy(3, 3);
        lcd_gfx_write_string(text);
 
        // Eine Sekunde hinzufügen.
        seconds++;
 
        // Hardwareverzögerung von 1000 ms.
        hw_delay_ms(1000);
    }
}