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.
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
}
Das folgende Bild zeigt wie die einzelnen Unterprogramme zur Ansteuerung des Grafik-LC-Displays miteinander verschachtelt sind.
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:
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
}
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;
}
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;
}
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;
}
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.
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);
}
}
}
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);
}
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);
}
}
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);
}
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);
}
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);
}