Ansteuerung des Grafik-LC-Display NLC-122B032
(mit PIC-Mikrocontroller, Elektronik)


zurück zu Elektronik, Homepage


5. Software (in C mit CC5X)

5.1. Portdefinitionen und externe Register

Portdefinition:
Im Allgemeinen wird bei jeder Anwendung das Grafik-LC-Display an einem beliebigen Port angeschlossen. Damit dies in der Software nur an einer Stelle berücksichtigt werden muss befindet sich in der Software eine Portdefinition. Diese besteht aus den folgenden Parametern:

Eine mögliche Portdefinition ist:

/* Port B */
#pragma char GLCD_CTRL          @ PORTB
#pragma char GLCD_CTRL_TRIS     @ TRISB

#pragma bit GLCD_WR             @ PORTB.1
#pragma bit GLCD_RD             @ PORTB.2
#pragma bit GLCD_CS1            @ PORTB.3
#pragma bit GLCD_CS2            @ PORTB.4
#pragma bit GLCD_A0             @ PORTB.5

/* Port D */ 
#pragma char GLCD_DATA          @ PORTD
#pragma char GLCD_DATA_TRIS     @ TRISD

Anmerkung: Für den Pin RES ist hier keine Portdefinition notwendig, da dieser Anschluss (Pin) direkt mit GND verbunden ist.

Externe Register:
Die Cursorposition wird mit den beiden externen Registern hlp_zeilen_zaehler und hlp_spalten_zaehler gesichert und ist somit immer für jedes Unterprogramm verfügbar.

nach oben

5.2. Initialisierung (Unterprogramm INIT)

Dieses Unterprogramm dient zur Initialisierung des Mikrocontrollers. Bei diesem Beispiel ist hier, für die Ansteuerung des Grafik-LC-Displays, nur die Definition der verwendeten Portpins als Ausgang notwendig.

Der folgende Programmausschnitt zeigt eine mögliche Initialisierungsroutine für den PIC16F877. Das Grafik-LC-Display ist hier am Port B (Steuerleitungen) und Port D (Daten) angeschlossen.

void INIT(void)
{
    TRISB = 0;                          // Port B als Ausgang definieren
    TRISD = 0;                          // Port D als Ausgang definieren
}
nach oben

5.3. Unterprogramme für die Grafik-LCD-Ansteuerung

Das folgende Bild zeigt wie die einzelnen Unterprogramme zur Ansteuerung des Grafik-LC-Displays miteinander verschachtelt sind.

Softwarestruktur

Zur Ansteuerung des Grafik-LC-Displays sind zumindest die Basis-Unterprogramme notwendig:

Für die Text- und Werteausgabe sind weitere Unterprogramme abhängig von der Schriftgröße notwendig:

Diese Unterprogramme geben nur ein Zeichen (Charakter) aus.

Die Unterprogramme zur Grafikausgabe sind noch nicht ausgeführt!

Nun aber zu den einzelnen Unterprogrammen im Detail:

nach oben

5.3.1. Unterprogramm GLCD_INIT

Aufgabe:
Dieses Unterprogramm initialisiert das Grafik-LC-Display (siehe auch Abschnitt 3.1. Befehle zur Ansteuerung des Grafik-LC-Display).

Vorgehensweise:
Übergibt nacheinander die Befehle zur Initialisierung an das Grafik-LC-Display.

Hier das Unterprogramm:

void GLCD_INIT(void)
{
    GLCD_COMMAND(175);                  // Display on
    GLCD_COMMAND(164);                  // static drive off
    GLCD_COMMAND(169);                  // duty cyle: 1/32
    GLCD_COMMAND(160);                  // ADC: CW output (forward)
    GLCD_COMMAND(238);                  // read modify write off
    GLCD_COMMAND(192);                  // line 0
    GLCD_COMMAND(184);                  // 1. Zeile 
    GLCD_COMMAND(0);                    // 1. Spalte
}
nach oben

5.3.2. Unterprogramm GLCD_COMMAND

Aufgabe:
Umsetzung des Zeitdiagramms (gemäß Abschnitt 3.2.) zum Senden eines Befehls an das Grafik-LC-Display.
Anmerkung: A0 ist bei einem Befehl immer 0 (Low).

Hier das Unterprogramm:

void GLCD_COMMAND(unsigned char command)
{
    GLCD_A0 = 0;
    GLCD_CS1 = 0;
    GLCD_CS2 = 0;

    GLCD_RD = 1;
    GLCD_WR = 0;

    GLCD_DATA = command;

    GLCD_WR = 1;

    GLCD_CS1 = 1;
    GLCD_CS2 = 1;
}
nach oben

5.3.3. Unterprogramm GLCD_DATA1

Aufgabe:
Umsetzung des Zeitdiagramms (gemäß Abschnitt 3.2.) zum Senden von Daten an die erste Hälfte des Grafik-LC-Display.
Anmerkung: A0 ist bei den Daten immer 1 (High).

Hier das Unterprogramm:

void GLCD_DATA1(unsigned char data)
{
    GLCD_A0 = 1;
    GLCD_CS1 = 1;
    GLCD_CS2 = 0;

    GLCD_RD = 1;
    GLCD_WR = 0;

    GLCD_DATA = data;

    GLCD_WR = 1;

    GLCD_CS1 = 1;
    GLCD_CS2 = 1;
}
nach oben

5.3.4. Unterprogramm GLCD_DATA2

Aufgabe:
Umsetzung des Zeitdiagramms (gemäß Abschnitt 3.2.) zum Senden von Daten an die zweite Hälfte des Grafik-LC-Display.
Anmerkung: A0 ist bei den Daten immer 1 (High).

Hier das Unterprogramm:

void GLCD_DATA2(unsigned char data)
{
    GLCD_A0 = 1;
    GLCD_CS1 = 0;
    GLCD_CS2 = 1;

    GLCD_RD = 1;
    GLCD_WR = 0;

    GLCD_DATA = data;

    GLCD_WR = 1;

    GLCD_CS1 = 1;
    GLCD_CS2 = 1;
}
nach oben

5.3.5. Unterprogramm GLCD_DATA_ZEICHEN

Aufgabe:
Je nach aktueller Position des Cursors den übergebenen Wert (data) an die erste oder zweite Displayhälfte übergeben.

Vorgehensweise:

Hier das Unterprogramm:

{
    if (hlp_spalten_zaehler == 61)      // Wenn Cursorspalte = 61  
    {
        GLCD_COMMAND(0);                //   ... "Column Address" auf 0 setzen
    }
    if (hlp_spalten_zaehler > 60)       // Cursorspalte > 60
    {
        GLCD_DATA2(data);               // ja: Uebergabewert (data) mit dem an
    }                                   //   die zweite Displayhaelfte uebergeben
    else
    {
        GLCD_DATA1(data);               // nein: Uebergabewert (data) mit dem an
    }                                   //   die erste Displayhaelfte uebergeben

    hlp_spalten_zaehler++;
}

Anmerkung:
Das (externe) Hilfsregister hlp_spalten_zaehler gibt an, an welcher Spalte sich der Cursor befindet.

nach oben

5.3.6. Unterprogramm GLCD_CLEAR

Aufgabe:
Löschen des Grafik-LC-Displays.

Vorgehensweise:
Beginnend bei der ersten Zeile und ersten Spalte mit Hilfe zweier geschachtelten Schleifen Nullen zum Grafik-LC-Display (in beide Display-Hälften) schreiben. Dies bewirkt, dass am Display nichts angezeigt wird bzw. das Display wird somit gelöscht.

Hier das Unterprogramm:

void GLCD_CLEAR(void)
{
    unsigned char Zeile, Spalte;


    for(Zeile = 0; Zeile < 4; Zeile++)
    {
        GLCD_COMMAND(184 + Zeile);      // Befehl: naechste Zeile

        GLCD_COMMAND(0);                // Befehl: 1.Spalte der Zeile

        for(Spalte = 0; Spalte < 61; Spalte++)
        {
            GLCD_DATA1(0);
            GLCD_DATA2(0);
        }
    }
}
nach oben

5.3.7. Unterprogramm GLCD_SETCURSOR_ZEILE

Aufgabe:
Den Cursor an die übergebene Zeile (0 bis 3) setzen.

Vorgehensweise:
Übergabeparameter für die Zeile im globalen Register hlp_zeilen_zaehler sichern und an das Grafik-LC-Display übergeben.

Übergabeparameter:
zeile: 0 - 3

Hier das Unterprogramm:

void GLCD_SETCURSOR_ZEILE(unsigned char zeile)
{
    hlp_zeilen_zaehler = zeile;
    GLCD_COMMAND(184 + zeile);
}
nach oben

5.3.8. Unterprogramm GLCD_SETCURSOR_SPALTE

Aufgabe:
Den Cursor an die übergebene Spalte (0 bis 121) setzen.

Vorgehensweise:
Übergabeparameter für die Spalte im globalen Register hlp_spalten_zaehler sichern und an das Grafik-LC-Display übergeben. Dabei ist zu beachten, dass das Grafik-LC-Display in zwei Bereiche aufgeteilt ist, wobei beide Bereiche mit 0 beginnen. Spalten größer als 61 befinden sich im zweiten Bereich. Da dieser wieder ab 0 beginnt, muss bei Spalten die größer als 61 sind, 61 abgezogen werden.

Übergabeparameter:
spalte: 0 - 121

Hier das Unterprogramm:

void GLCD_SETCURSOR_SPALTE(unsigned char spalte)
{
    hlp_spalten_zaehler = spalte;
    if (spalte < 61)
    {
        GLCD_COMMAND(spalte);
    }
    else
    {
        GLCD_COMMAND(spalte - 61);
    }
}
nach oben

5.3.9. Unterprogramm GLCD_ZEICHEN_5x7

Aufgabe:
Ein Zeichen (Charakter im Format 5x7) am Grafik-LC-Display ausgeben.

Vorgehensweise:
Nacheinander die Spalten eines Zeichens an das Grafik-LC-Display mit dem Unterprogramm GLCD_DATA_ZEICHEN übergeben. Die Daten für die Spalten sind in Tabellen abgelegt, wobei für jede Spalte des Zeichens eine eigene Tabelle vorhanden ist. Diese Tabellen müssen an anderer Stelle hinzugefügt werden! Die letzte Spalte muss eine 0 enthalten, also eine "Leerspalte".

Übergabeparameter:
zeichen (im ASCII-Code)

Hier das Unterprogramm:

void GLCD_ZEICHEN_5x7(unsigned char zeichen)
{
    // 1. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz5x7_sp1[zeichen]);

    // 2. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz5x7_sp2[zeichen]);

    // 3. Spalte des Zeichens 
    GLCD_DATA_ZEICHEN(TabZeichensatz5x7_sp3[zeichen]);

    // 4. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz5x7_sp4[zeichen]);

    // 5. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz5x7_sp5[zeichen]);

    // 6. Spalte des Zeichens 
    GLCD_DATA_ZEICHEN(0);
}
nach oben

5.3.10. Unterprogramm GLCD_ZEICHEN_8x14

Aufgabe:
Ein Zeichen (Charakter im Format 8x14) am Grafik-LC-Display ausgeben.

Vorgehensweise:

Übergabeparameter:
zeichen

Hier das Unterprogramm:

void GLCD_ZEICHEN_8x14(unsigned char zeichen)
{
    char tmp_zeile = hlp_zeilen_zaehler;
    char tmp_spalte = hlp_spalten_zaehler;


    // 1.Zeile
    // 1. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp1[zeichen]);
    // 2. Spalte des Zeichens 
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp2[zeichen]);
    // 3. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp3[zeichen]);
    // 4. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp4[zeichen]);
    // 5. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp5[zeichen]);
    // 6. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp6[zeichen]);
    // 7. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp7[zeichen]);
    // 8. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z1sp8[zeichen]);
    // 9. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);


    // 2. Zeile und 1.Spalte des Zeichen
    GLCD_SETCURSOR_ZEILE(tmp_zeile + 1);
    GLCD_SETCURSOR_SPALTE(tmp_spalte);

    // 1. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp1[zeichen]);
    // 2. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp2[zeichen]);
    // 3. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp3[zeichen]);
    // 4. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp4[zeichen]);
    // 5. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp5[zeichen]);
    // 6. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp6[zeichen]);
    // 7. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp7[zeichen]);
    // 8. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz8x14_z2sp8[zeichen]);
    // 9. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);


    // 1. Zeile und Spalte vom Ende des Zeichen
    GLCD_SETCURSOR_ZEILE(tmp_zeile);
}
nach oben

5.3.11. Unterprogramm GLCD_ZEICHEN_10x22

Aufgabe:
Ein Zeichen (Charakter im Format 10x22) am Grafik-LC-Display ausgeben.

Vorgehensweise:

Übergabeparameter:
zeichen

Hier das Unterprogramm:

void GLCD_ZEICHEN_10x22(unsigned char zeichen)
{
    char tmp_zeile = hlp_zeilen_zaehler;
    char tmp_spalte = hlp_spalten_zaehler;


    // 1.Zeile
    // 1. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp1[zeichen]);
    // 2. Spalte des Zeichens 
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp2[zeichen]);
    // 3. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp3[zeichen]);
    // 4. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp4[zeichen]);
    // 5. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp5[zeichen]);
    // 6. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp6[zeichen]);
    // 7. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp7[zeichen]);
    // 8. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp8[zeichen]);
    // 9. Spalte des Zeichens 
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp9[zeichen]);
    // 10. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z1sp10[zeichen]);
    // 11. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);
    // 12. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);


    // 2. Zeile und 1.Spalte des Zeichen
    GLCD_SETCURSOR_ZEILE(tmp_zeile + 1);
    GLCD_SETCURSOR_SPALTE(tmp_spalte);

    // 1. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp1[zeichen]);
    // 2. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp2[zeichen]);
    // 3. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp3[zeichen]);
    // 4. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp4[zeichen]);
    // 5. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp5[zeichen]);
    // 6. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp6[zeichen]);
    // 7. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp7[zeichen]);
    // 8. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp8[zeichen]);
    // 9. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp9[zeichen]);
    // 10. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z2sp10[zeichen]);
    // 11. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);
    // 12. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);


    // 3. Zeile und 1.Spalte des Zeichen
    GLCD_SETCURSOR_ZEILE(tmp_zeile + 2);
    GLCD_SETCURSOR_SPALTE(tmp_spalte);

    // 1. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp1[zeichen]);
    // 2. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp2[zeichen]);
    // 3. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp3[zeichen]);
    // 4. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp4[zeichen]);
    // 5. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp5[zeichen]);
    // 6. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp6[zeichen]);
    // 7. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp7[zeichen]);
    // 8. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp8[zeichen]);
    // 9. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp9[zeichen]);
    // 10. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(TabZeichensatz10x22_z3sp10[zeichen]);
    // 11. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);
    // 12. Spalte des Zeichens
    GLCD_DATA_ZEICHEN(0);


    // 1. Zeile und Spalte vom Ende des Zeichen
    GLCD_SETCURSOR_ZEILE(tmp_zeile);
}
nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 14. Juli 2006
Letzte Änderung: 16. September 2006