Ansteuern des HD44780 mit den C18-Libraries
| Möchtest du das Display ohne den C18-Libraries ansteuern? Dann schau mal hier rein. |
Inhaltsverzeichnis |
Allgemein
Ich habe ja bereits an anderer Stelle beschrieben wie man ein LCD Display mit einem HD44780 (bzw. kompatiblen) Controller in Assembler oder C ansteuert. Hier möchte ich nun darauf eingehen, wie ihr ein LCD Display mit dem HD44780 Controller ganz einfach und schnell mit Hilfe der C18 Libraries ansteuern können. Somit erspart ihr euch das schreiben der Routinen, da diese bereits alle mit der Installation des MCC18 Compilers mitgeliefert werden.
C18 Libraries
Im für Studenten freien C18 Compiler von Microchip sind einige nützliche Bibliotheken mit denen uns einiges erleichtert wird. Unter anderen findet man dort auch eine Bibliothek zum Ansteuern eines LCD Displays mit einem HD44780 Controller, welcher sich bei Textdisplays als Standard durchgesetzt hat.
Dokumentation der C18 Libraries
Beschreibung der Bibliothek
In dem PDF (Download oben) wird unter dem Punkt 3.2 die Bibliothek EXTERNAL LCD FUNCTIONS aufgeführt. Sie ist es die uns das Ansteuern des HD44780 erleichtert. Hier sind ein mal die wichtigsten Funktionen aufgelistet, welche die Bibliothek beinhaltet:
| Funktion | Beschreibung |
|---|---|
| BusyXLCD | Mit dieser Funktion wird das Busy-Flag des Controllers (LCD) abgefragt. Somit können wir feststellen ob der Controller bereit ist neue Daten/Befehle zu empfangen. |
| OpenXLCD | Hier wird die Initialisierung des Controllers durchgeführt. Wir teilen dem HD44780 wichtige Informationen (Anzahl der Zeilen, ...) mit. |
| SetCGRamAddr | Die Adresse des CG-RAM kann hier eingestellt werden. (CGRAM ist interessant, wenn eigene Zeichen erstellt werden sollen) |
| SetDDRamAddr | Hier können wir die DD-RAM Adresse des Displays anzeigen um zum Beispiel einen Text direkt an eine bestimmte Stelle zu schreiben. |
| WriteCmdXLCD | Diese Funktion wird verwendet um einen Befehl an den Controller zu senden. |
| WriteDataXLCD | Diese Funktion wird verwendet um Daten an den Controller zu senden. |
| Es gibt noch drei weitere Funktionen, welche notwendig sind. Diese müssen selber erstellt werden. Wie dies genau zu machen ist erkläre ich weiter unten. |
Folgende Dateien müsst Ihr in euer Projekt als Source Dateien einbinden :
\Microchip\mplabc18\v3.40\src\pmc_common\XLCD\*
Folgende Datei kopiert Ihr in euren Projektordner (da sie ggfs. verändert werden muss) und bindet sie anschließend in euer Projekt als Header Datei ein (Natürlich wird dann die Datei aus eurem Projekt Ordner eingebunden und nicht mehr die aus dem unten angegebenen Pfad !!):
\Microchip\mplabc18\v3.40\h\xlcd.h
Vorhandene Macros (anpassen)
Um das Handling weiter zu vereinfachen gibt es verschiedene MACROS, siehe:
| LCD Signal | Macro | Default | Benutzung |
|---|---|---|---|
| E Pin | E_PIN TRIS_E |
PORTBbits.RB4 DDRBbits.RB4 |
Enable Signal vom LCD Controller Zugehöriges TRIS Bit |
| RS Pin | RS_PIN TRIS_RS |
PORTBbits.RB5 DDRBbits.RB5 |
RS Signal vom LCD Controller Zugehöriges TRIS Bit |
| RW Pin | RW_PIN TRIS_RW |
PORTBbits.RB6 DDRBbits.RB6 |
RW Signal vom LCD Controller Zugehöriges TRIS Bit |
| Data Lines | DATA_PORT TRIS_DATA_PORT |
PORTB DDRB |
Data Signal(e) vom LCD Controller Zugehörige TRIS Bits |
| Pinbelegung anpassen Falls Ihr das Display zufällig genau so angeschlossen habt oder aber euch danach richtet, dann braucht Ihr keine Änderungen an der xlcd.h Datei vornehmen. Sollten bei euch die Signalleitungen allerdings an anderen Port-Pins liegen, dann müsst Ihr unbedingt diese in der xlcd.h Datei anpassen. Die Datei ist bereits in euren Projekt Ordner kopiert. Wem das alles zu kompliziert ist mit der händischen Anpassung der Datei kann dies auch durch ein Tool erledigen lassen, siehe unten. |
Dies ist der entsprechende Abschnitt in dem Ihr eure Anpassungen vornehmen müsst:
Die einzelnen Funktionen genauer beschrieben
BusyXLCD
| Funktion | Diese Funktion überprüft ob das Display im Augenblick beschäftigt ist bzw. ob es bereit ist neue Befehle oder Daten in Empfang zu nehmen. |
| Include | xlcd.h |
| Prototyp | unsigned char BusyXLCD( void ); |
| Bemerkungen | Diese Funktion hat einen Rückgabewert. Dieser sagt aus ob das Display beschäftigt ist oder nicht. |
| Rückgabewert | 1 = Der Controller ist beschäftigt und es können keine Befehle/Daten an das LCD gesendet werden. 0 = Der Controller ist bereit Daten/Befehle zu empfangen. |
| Datei Name | busyxlcd.c |
| Beispiel-Code |
|
OpenXLCD
| Funktion | Diese Funktion ist dafür da das LCD Display bzw. den HD44780 Controller zu initialisieren. | |
| Include | xlcd.h | |
| Prototyp | void OpenXLCD( unsigned char lcdtype ); | |
| Übergabewerte | lcdtype - Hier können mehrere definierte Argumente übergeben werden, welche in der xlcd.h Datei definiert sind. Die Werte werden mit einer UND-Verknüpfung (&) verbunden.
Data Interface FOUR_BIT --> 4-Bit Modus (4 Datenleitungen zum LCD) EIGHT_BIT --> 8-Bit Modus (8 Datenleitungen zum LCD)
LCD Configuration LINE_5X7 --> 5x7 Zeichen, einzeiliges Display LINE_5X10 --> 5x10 Zeichen Display LINES_5X7 --> 5x7 Zeichen, mehrzeiliges Display | |
| Bemerkung | Diese Funktion initialisiert sowohl die IO Pins vom PIC als auch den LCD Controller (HD44780). | |
| Datei Name | openxlcd.c | |
| Beispiel-Code |
|
SetCGRamAddr
| Funktion | Diese Funktion addressiert den Zeichen-Generator. |
| Include | xlcd.h |
| Prototyp | void SetCGRamAddr( unsigned char addr ); |
| Übergabewerte | Es wird die gewünschte CG-Adresse übergeben (addr). |
| Bemerkung | Der Controller darf be dieser Operation nicht beschäftigt sein, dass kann mit der Funktion BusyXLCD überprüft werden. |
| Datei Name | setcgram.c |
| Beispiel-Code |
|
SetDDRamAddr
| Funktion | Diese Funktion stellt die DD-RAM Adresse ein (An der Stelle wird dann quasi weiter geschrieben). |
| Include | xlcd.h |
| Prototyp | void SetDDRamAddr( unsigned char addr ); |
| Übergabewerte | Hier wird die Adresse (addr) übergeben. |
| Bemerkung | Diese Funktion darf nicht durchgfeführt werden, wenn der Controller beschäfttigt ist. Das kann durch die Funktion BusyXLCD sicher gestellt werden. |
| Datei Name | setddram.c |
| Beispiel-Code |
|
WriteCmdXLCD
| Funktion | Schreibt ein Befehl an den HD44780 |
| Include | xlcd.h |
| Prototyp | void WriteCmdXLCD( unsigned char cmd ); |
| Übergabewerte | Hier wird der Befehl (cmd) übergeben:
DOFF --> Display ausschalten CURSOR_OFF --> Cursor abschalten BLINK_ON --> Cursor blinkend einschalten BLINK_OFF --> Cursor blinkend ausschalten SHIFT_CUR_LEFT --> Cursor verschiebt sich nach links SHIFT_CUR_RIGHT --> Cursor verschiebt sich nach rechts SHIFT_DISP_LEFT --> Display Verschiebung nach links(1) SHIFT_DISP_RIGHT --> Display Verschiebung nach rechts(1) (1)Display Shift: Da der Text Puffer grüßer ist als das Display selbst kann der Text geschoben werden. Somit lassen sich z.B. Laufschriften erstellen. Alternativ können auch noch die nachfolgenden Befehle per UND Verknüpfung (&) mit angebunden werden. Data Transfer Mode FOUR_BIT --> 4-Bit Modus (4 Datenleitungen zum LCD) EIGHT_BIT --> 8-Bit Modus (8 Datenleitungen zum LCD) Display Type LINE_5X7 --> 5x7 Zeichen, einzeiliges Display LINE_5X10 --> 5x10 Zeichen Display LINES_5X7 --> 5x7 Zeichen, mehrzeiliges Display |
| Bemerkung | Diese Funktion darf ebenfalls nicht durchgeführt werden, wenn der Controller beschäftigt ist. Dies muss mit der Funktion BusyXLCD überprüft werden. |
| Datei Name | wcmdxlcd.c |
| Beispiel-Code |
|
WriteDataXLCD
| Funktion | Schreibt Daten zum HD44780 Display Controller. |
| Include | xlcd.h |
| Prototyp | void WriteDataXLCD( char data ); |
| Übergabewerte | Hier wird ein 8-Bit Wert (data) übergeben. Also die Zeichen, welche angezeigt werden sollen. |
| Bemerkung | Wie bei allen anderen Funktionen darf der Controller nicht beschäftigt sein, wenn diese Funktion ausgeführt wird. Benutzt dafür die BusyXLCD Funktion. |
| Datei Name | writdata.c |
| Beispiel-Code |
|
Die Zeitverzögerungen (selbst zu erstellende Funktionen)
Wie ich weiter oben schon beschrieben habe ist es nötig noch drei Funktionen selber zu erstellen. Für das Ansteuern des HD44780 ist es notwendig gewisse Wartezeiten einzuhalten und da nun jeder immer seinen eigenen Takt aussucht, muss hier der Benutzer selbst Routinen entwerfen. Diese Funktionen müssen geschrieben werden:
DelayFor18TCY --> Warteschleife für 18 Taktzyklen DelayPORXLCD --> Warteschleife für 15ms DelayXLCD --> Warteschleife für 5ms
Es muss jetzt also geguckt werden welche Quarzgeschwindigkeit vorliegt um auf der Grundlage die Funktionen anzupassen (Wartezeiten berechnen). Nachfolgend einmal ein Beispiel für die Verwendung eines 4MHz Quarzes (nicht vergessen die delays.h einzubinden):
#include <delays.h> void DelayFor18TCY(void) { Nop();Nop();Nop();Nop(); Nop();Nop();Nop();Nop(); Nop();Nop();Nop();Nop(); Nop();Nop(); } void DelayPORXLCD(void) { Delay1KTCYx(15); //Delay of 15ms return; } void DelayXLCD(void) { Delay1KTCYx(5); return; }
Hinweis: Diese Funktionen direkt in die main.c schreiben. Anschließend nicht das Schreiben des Prototypen der Funktionen in der main.c vergessen, so dass der PIC die Funktionen auch aufrufen kann.
Microchip Application Maestro
Wer das mit dem Editieren der xlcd.h nicht hinbekommt, der kann sich mit Hilfe des Microchip Application Maestro (kurz MAM Tools) behelfen. Hier gebt Ihr einfach eure Werte ein, also welcher Pin vom LCD wo am PIC angeschlossen ist und welche Frequenz ihr als Quarz habt. Und das Tool spuckt euch alle Dateien aus mit den richtigen Einstellungen.- Zuerst Application Maestro installieren:
Download
- Anschließend zusätzliche Module installieren:
Download
So geht es:
- MAM installieren
- Zusatzmodule installieren
- MAM starten
- Frequenz (Clock) eingeben
- XLCD for C wählen und in das obere rechte Fenster ziehen
- Im Fenster darunter alle Einstellungen tätigen
- Button "Generate Code" drücken. Jetzt werden die Dateien generiert.
Die Datei XLCD.P18.ex.txt zeigt die Anwendung.
Siehe bei Bedarf auch: Getting Started with Application Maestro Tutorial und XLCD Library Guide.
Beispiel Programm
Irgendwann wenn ich mal Zeit habe...
Kompatible Controller
Beim Kauf lieber immer nochmal überprüfen ob die Controller wirklich kompatibel sind, denn manchmal gibt es doch noch kleine Abweichungen siehe KS0066
Autoren
Nico 16:50, 19. Aug. 2011 (CEST)