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