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


zurück zu Elektronik, Homepage


4. Software (in Assembler)

4.1. Benötigte Register und Portdefinition

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.

nach oben

4.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.

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.

nach oben

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

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

Nun aber zu den einzelnen Unterprogrammen im Detail:

nach oben

4.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:

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
nach oben

4.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).

Ü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
nach oben

4.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).

Ü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
nach oben

4.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).

Ü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
nach oben

4.3.5. Unterprogramm GLCD_CLEAR

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.

nach oben

4.3.6. Unterprogramm GLCD_SETCURSOR_ZEILE

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
nach oben

4.3.7. Unterprogramm GLCD_SETCURSOR_SPALTE

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
nach oben


zurück zu Elektronik, Homepage

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