Register:
Für die softwaremäßige Grafik-LC-Display-Ansteuerung werden neben einigen PIC internen
Registern (SFR, Spezielle Funktions-Register) noch folgende Register benötigt:
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:
LCD_DATA equ PORTD LCD_DATA_TRIS equ TRISD LCD_CTRL equ PORTB LCD_CTRL_TRIS equ TRISB GLCD_A0 equ 5 GLCD_CS2 equ 4 GLCD_CS1 equ 3 GLCD_RD equ 2 GLCD_WR equ 1
Anmerkung: Für den Pin RES ist hier keine Portdefinition notwendig, da dieser Anschluss (Pin) direkt mit GND verbunden ist.
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.
INIT bank1 ;Registerseite 1 movlw b'00000000' ;Port B und Port D als Ausgang definieren movwf TRISB movwf TRISD bank0 ;Registerseite 0 return
Anmerkung: Bei den Anweisungen bank1 bzw. bank0 handelt es sich um so genannte Makros.
Zur Ansteuerung des Grafik-LC-Displays sind zumindest die folgenden Basis-Unterprogramme notwendig:
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:
GLCD_INIT movlw .175 ;Display on call GLCD_COMMAND movlw .164 ;static drive off call GLCD_COMMAND movlw .169 ;duty cyle: 1/32 call GLCD_COMMAND movlw .160 ;ADC: CW output (forward) call GLCD_COMMAND movlw .238 ;read modify write off call GLCD_COMMAND movlw .192 ;line 0 call GLCD_COMMAND movlw .184 ;1. Zeile call GLCD_COMMAND movlw .0 ;1. Spalte call GLCD_COMMAND return
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).
Übergabeparameter:
Das Arbeitsregister (w-Register) beinhaltet den Befehl.
Hier das Unterprogramm:
GLCD_COMMAND bcf GLCD_CTRL,GLCD_A0 bcf GLCD_CTRL,GLCD_CS1 bcf GLCD_CTRL,GLCD_CS2 bsf GLCD_CTRL,GLCD_RD bcf GLCD_CTRL,GLCD_WR movwf GLCD_DATA ;Befehl am Datenport ausgeben bsf GLCD_CTRL,GLCD_WR bsf GLCD_CTRL,GLCD_CS1 bsf GLCD_CTRL,GLCD_CS2 return
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).
Übergabeparameter:
Das Arbeitsregister (w-Register) beinhaltet die Daten.
Hier das Unterprogramm:
GLCD_DATA1 bsf GLCD_CTRL,GLCD_A0 bsf GLCD_CTRL,GLCD_CS1 bcf GLCD_CTRL,GLCD_CS2 bsf GLCD_CTRL,GLCD_RD bcf GLCD_CTRL,GLCD_WR movwf GLCD_DATA ;Daten am Datenport ausgeben bsf GLCD_CTRL,GLCD_WR bsf GLCD_CTRL,GLCD_CS1 bsf GLCD_CTRL,GLCD_CS2 return
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).
Übergabeparameter:
Das Arbeitsregister (w-Register) beinhaltet die Daten.
Hier das Unterprogramm:
GLCD_DATA2 bsf GLCD_CTRL,GLCD_A0 bcf GLCD_CTRL,GLCD_CS1 bsf GLCD_CTRL,GLCD_CS2 bsf GLCD_CTRL,GLCD_RD bcf GLCD_CTRL,GLCD_WR movwf GLCD_DATA ;Daten am Datenport ausgeben bsf GLCD_CTRL,GLCD_WR bsf GLCD_CTRL,GLCD_CS1 bsf GLCD_CTRL,GLCD_CS2 return
Aufgabe:
Löschen des Grafik-LC-Displays.
Vorgehensweise:
Beginnend bei der letzten Zeile und letzten 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:
GLCD_CLEAR movlw .4 movwf TEMP1 GLCD_CLR_SCHL1: decf TEMP1,w addlw .184 ;Befehl (184 + TEMP1 = Zeile ) call GLCD_COMMAND ; an das Grafik-LC-Display movlw .61 movwf TEMP2 movlw .0 ;Befehl: 1. Spalte an das Grafik-LC-Display call GLCD_COMMAND GLCD_CLR_SCHL2: movlw .0 call GLCD_DATA1 call GLCD_DATA2 decfsz TEMP2,f goto GLCD_CLR_SCHL2 decfsz TEMP1,f goto GLCD_CLR_SCHL1 return
Anmerkung:
Die beiden temporären Register (TEMP1 und TEMP2) dienen hier nur als Schleifenzähler.
Sie können daher auch in anderen Unterprogrammen verwendet werden.
Aufgabe:
Den Cursor an die übergebene Zeile (0 bis 3) setzen.
Vorgehensweise:
Übergabeparameter für die Zeile (im Arbeitsregister) im globalen Register GLCD_ZEILEN_ZAEHLER
sichern und an das Grafik-LC-Display übergeben.
Übergabeparameter:
Das Arbeitsregister (w-Register) beinhaltet die Zeile.
Hier das Unterprogramm:
GLCD_SETCURSOR_ZEILE movwf GLCD_ZEILEN_ZAEHLER ;GLCD_ZEILEN_ZAEHLER = w-Register addlw .184 call GLCD_COMMAND ;GLCD_BEFEHL(184 + GLCD_ZEILEN_ZAEHLER) return
Aufgabe:
Den Cursor an die übergebene Spalte (0 bis 121) setzen.
Vorgehensweise:
Übergabeparameter für die Spalte (im Arbeitsregister) im globalen Register GLCD_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:
Das Arbeitsregister (w-Register) beinhaltet die Spalte.
Hier das Unterprogramm:
GLCD_SETCURSOR_SPALTE movwf GLCD_SPALTEN_ZAEHLER ;GLCD_SPALTEN_ZAEHLER = w-Register movlw .61 ;GLCD_SPALTEN_ZAEHLER < 61 subwf GLCD_SPALTEN_ZAEHLER,w btfsc STAT,C goto GLCD_SETCUR_W1 ;ja: GLCD_BEFEHL(GLCD_SPALTEN_ZAEHLER) movf GLCD_SPALTEN_ZAEHLER,w call GLCD_COMMAND goto GLCD_SETCUR_W2 GLCD_SETCUR_W1 movlw .61 ;nein: GLCD_BEFEHL(GLCD_SPALTEN_ZAEHLER ; -61) subwf GLCD_SPALTEN_ZAEHLER,w call GLCD_COMMAND GLCD_SETCUR_W2 return