Ansteuern eines KS0107/8
Inhaltsverzeichnis |
Allgemein
Dieses Display habe ich bei meinem UV LED Belichter als Anzeigeinstrument gewählt. Das Display hat 128x64 Bildpunkte und ist ein Grafik LCD (GLCD), sprich es ist möglich hier jeden einzelnen Bildpunkt einzeln anzusteuern. Das interessanteste jedoch ist der Controller des LCDs, es handelt sich hier um einen KS0107/108. Das ist wichtig damit wir wissen wie wir das Display ansteuern können/müssen. Das sollte generell immer beim Kauf eines LCDs beachtet werden. Es ist zwar nicht so wichtig wie bei Alphanumerischen Displays mit dem Klassiker HD44780 Controller aber man sollte dennoch drauf achten, denn man kann sich einiges an Arbeit ersparen, wenn man einen Controller vorzieht, den man schon "beherrscht". Das Display mit dem entsprechenden Controller von electronic Assembly ohne Touch Panel kostet hier 40 Euro. Es gibt aber auch Displays der Größenordnung mit dem selben Controller für weniger Geld hier muss man einfach mal die Augen offen halten oft werden in Foren günstige Shops gesucht. Als kleiner Tipp, schaut doch mal in meiner Link Sammlung nach. Hier gibt es das Datenblatt des Displays. Ich habe unter 'GLCD Tool' bereits einen Beitrag geschrieben wie man sich für so ein Display Zeichen erzeugen kann. Es gibt natürlich auch so genannte Font ICs welche den Standard ASCII Code bereits integriert haben. Aber das ist ein anderes Thema! Ich möchte hier beschreiben wie man das Display betreiben kann, da es mir ein bisschen den Kopf zerbrochen hat. Zunächst einmal es gibt verschiedene Möglichkeiten das Display zu betreiben ich werde hier nur eine Möglichkeit beschreiben!
Software
Zunächst einmal muss man das Display initialisieren, das sollte man generell immer tun! Die Initialisierung beginnt mit einer Warteschleife (Call Warten) dies ist wichtig, da das Display nicht sofort bereit ist. Dann wird ein Reset durchgeführt das wird mit den Befehlen 'bcf RES_LCD' und 'bsf_RES_LCD'. Im Anschluss überprüft der PIC ob das Display bereit ist Daten zu empfangen dies geschieht mit der Abfrage des Busy Flags (Call Busy). Danach werden die entsprechenden Einstellungen für das Display durchgeführt die da wären: Display einschalten, Page Adresse einstellen, Byte Adresse einstellen und die Start Line festlegen.
Programm Beschreibung
Zunächst einmal muss man das Display initialisieren, das sollte man generell immer tun! Die Initialisierung beginnt mit einer Warteschleife (Call Warten) dies ist wichtig, da das Display nicht sofort bereit ist. Dann wird ein Reset durchgeführt das wird mit den Befehlen 'bcf RES_LCD' und 'bsf_RES_LCD'. Im Anschluss überprüft der PIC ob das Display bereit ist Daten zu empfangen dies geschieht mit der Abfrage des Busy Flags (Call Busy). Danach werden die entsprechenden Einstellungen für das Display durchgeführt die da wären: Display einschalten, Page Adresse einstellen, Byte Adresse einstellen und die Start Line festlegen. Was das genau ist lässt sich im Datenblatt nachlesen.
So nun haben wir das Display initialisiert und es steht zum Einsatz bereit doch wie "schreibt" man jetzt eigentlich was auf das Display? Grundsätzlich unterscheidet man bei einem (G)LCD zwischen zwei Arten von Daten und zwar einmal gibt es die 'Befehle' diese wurden bei der Initialisierung auch schon verwendet (Call BefehlL/R) die UP werden noch besprochen und dann gibt es noch die wirklichen Daten, welche zur Anzeige auf dem Display verwendet werden, hierfür ist das Unterprogramm (UP) DatenX. Also schauen wir uns die beiden Unterprogramme einmal an:
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• BefehlR ;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• bcf LR_LCD Call Busy Bcf RW_LCD bcf DI_LCD Movf Puffer,0 Movwf PORTB Call Enable Return
Mit dem ersten Befehl - BCF LR_LCD - wird zwischen der linken und rechten Bildschirmhälfte ausgewählt. Es lässt sich nämlich immer nur eine Displayhälfte ansteuern daher werden auch bei der Beschaltung des Displays die Pins CSxx beschaltet sie entscheiden je nach Beschaltung darüber wie wir die einzelnen Hälften ansteuern können. In der Beschaltung die ich gewählt habe bedeutet eine gelöschte LR_LCD (Links/Rechs_LCD), also 0V, dass die rechte Display Hälfte angesteuert wird. Anders herum heißt 1 oder eben 5V die linke Hälfte ist am Zug. Mit dem Aufruf des Unterprogramms - Busy - wird überprüft ob das Display im Augenblick bereit ist Befehle/Daten zu empfangen oder ob der Controller/LCD gerade am arbeiten ist bzw. busy (zu deutsch = beschäftigt) ist. Das Unterprogramm werde ich weiter unten noch genauer beschreiben. Nachdem festgestellt wurde, dass das LCD bereit ist Befehle oder eben Daten zu empfangen/verarbeiten können wir weiter machen mit dem Befehl - BCF RW_LCD - hier wird jetzt entschieden ob wir vom Display lesen wollen ( read ) oder ob wir etwas zum Display schreiben wollen ( write ). Eine gelöschte RW Leitung des Controllers sagt aus das auf das Display geschrieben wird. Weiter geht es mit dem Befehl - BCF DI_LCD - noch eine Steuerleitung des LCDs. Mit dieser Leitung wird dem Controller mit geteilt ob wir ihm Daten zur Anzeige senden oder ob es sich um Befehle handelt.
Nachdem wir die ganzen Steuerleitungen des Displays geklärt haben können wir weiter im Unterprogramm gehen und kommen zu dem Befehl - MOVF Puffer,0 - Hier muss ich eins vorweg sagen, wenn das UP aufgerufen wird, dann wird das, was zu dem Display soll ( Daten oder Befehle ) vorher im Register Puffer gespeichert und dieses wird jetzt wieder aufgerufen und ins Arbeitsregister geschrieben. Der Befhel lässt sich auch anders schreiben entweder - MOVF Puffer,0 - oder - MOVFW Puffer - beide schreiben den Inhalt vom Register Puffer in das Arbeitsregister. Mit dem nachfolgenden Befehl - Movwf PORTB - wird nun der Inhalt vom Arbeitsregister (=Inhalt vom Puffer) auf den PORTB gelegt, wo die 8 Datenleitungen des Displays angeschlossen sind. Da das Display/Controller keine Hellseher sind müssen wir natürlich dem Controller noch mitteilen, dass jetzt Daten auf der Leitung sind und er sie abrufen kann. Das macht man bzw. mache ich über das UP - Enable.
Wie man sehen kann ist dies, wie auch schon das Befehlx Programm, ein recht kurzes Unterprogramm ( UP ). Zu Beginn wird die Enable Leitung des Controllers auf High (=5V) gezogen, dann eine kurze Wartezeit eingelegt ( wie lange diese Zeit mindestens sein muss kann im Datenblatt nach gelesen werden ) und anschließend die Enable Leitung wieder auf Low (=0V) gezogen. Jetzt weiß das Display, dass Daten auf dem Datenbus bereit liegen und abgerufen werden sollen/können. Hier einmal der Auszug aus dem Datenblatt des KS0107/108 mit den wichtigen Angaben der Timings ( z.B. Enable ): siehe Bild rechts.;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Enable ;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Bsf E_LCD movlw D'1' movwf Wartezeit call Warten BcF E_LCD Return
Nachdem der LCD Controller jetzt zur Kenntnis genommen hat, dass Daten auf dem Bus liegen wird er sie lesen und verarbeiten indem er z.B. Pixel setzt/löscht, eine bestimmte Zeile/Spalte ansteuert oder aber auch Daten wieder auf die Leitung ausgibt, nämlich dann wenn zu Beginn read ( lesen ) gewählt wurde. Hier nochmal der Programmausschnitt für das Senden von Daten an die linke Displayhälfte:
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• DatenL ;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Movwf Puffer bsf LR_LCD Call Busy Bcf RW_LCD bsf DI_LCD Movf Puffer,0 Movwf PORTB Call Enable Return
Ich habe ja etwas weiter oben schon davon erzählt, dass der Controller auch mal beschäftigt sein kann und nicht im Stande ist Befehle entgegen zu nehmen und wir daher das sogenannte - Busy Flag - kontrollieren müssen und das geschieht mit dem zugehörigen Unterprogramm - Busy:
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Busy ;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Clrf PORTB bsf STATUS,RP0 ;Gehe zu Speicherbank 1 movlw B'11111111' movwf TRISB bcf STATUS,RP0 ;Gehe zurück zur Speicherbank 0 Bsf RW_LCD Bcf DI_LCD Clrf PORTB Call Enable RR Btfsc PORTB,7 Goto RR bsf STATUS,RP0 ;Gehe zu Speicherbank 1 movlw B'00000000' movwf TRISB bcf STATUS,RP0 ;Gehe zurück zur Speicherbank 0 Clrf PORTB Bcf RW_LCD Bcf DI_LCD Return
Zu Beginn lösche ich erst einmal den Datenbus mit dem Befehl - CLRF PORTB - denn ich möchte sicher gehen, dass auf dem Datenbus keine Signale mehr liegen, die ich evtl. selber drauf gelegt habe, denn Ihr müsst wissen die Busy abfrage läuft ebenfalls über eine Leitung des Datenbusses. Da wir jetzt Daten von dem LCD empfangen möchten und dann die Signalzustände der einzelnen Datenleitungen einlesen möchten schalte ich den PORTB erst einmal von O auf I, nämlich von Outputs auf Inputs.Als nächstes werden dann die Steuerleitung entsprechend gesetzt DI und RW, jetzt weiß der Controller, dass wir Informationen von ihm haben möchten.
Durch einen Aufruf des UP - Enable - wird dem Controller wieder gesagt, dass er nun die Daten auf den Bus legen kann. Ab jetzt beginnt eine kontinuierlich durchlaufende Schleife, die nur durch ein Ereignis beendet werden kann und zwar durch das Mitteilen des Controllers, dass er nicht mehr busy ist. Sobald auf der Datenleitung - DB7 - eine logische 1 liegt ist der Controller fertig. Dies geschieht so: Der Befehl - BTFSC PORTB,7 - sagt aus, dass der nachfolgende Befehl übersprungen wird, sobald das Abfragende - eine 1 ist. Und solange es eine 0 ist wird der nachfolgende Befehl nicht übersprungen also springt er immer wieder zu der Marke "RR" zurück und läuft quasi im Kreis solange bis PORTB,7 (DB7) 1 ist. Wenn er den Befehl übersprungen hat ist der Controller wieder bereit Daten/Befehle zu empfangen und die Datenpins des PICs werden wieder auf Output umgestellt durch löschen der Bits im TRIS Register.
Download
Ich möchte hier das Assembler Programm zur Verfügung stellen es ist vom Grundaufbau wie das Programm wie ich es bei meinem LED Belichter verwendet habe aber ich habe die gesamte Anzeige und sämtliche Programmierung wie sie im Belichter gebraucht war entfernt und nur ein Text "LED" zur Anzeige gebracht. Der Rest steht euch frei. Wenn Probleme auftauchen schreibt einfach einen Beitrag im Forum.
Hier gibt es die Routinen zum herunter laden:
Download
Autoren
Nico 21:50, 12. Sep. 2011 (CEST)