Ansteuern des HD44780 mit den C18-Libraries

Aus PIC-Projekte
Wechseln zu: Navigation, Suche
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. Download.gif 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:

Makros.PNG

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
while( BusyXLCD() ); // Der PIC verweilt solange in der while Schleife bis der HD44780 wieder bereit ist D/B zu empfangen


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)
Achtung

Wenn Ihr den 4 Bit Modus verwenden möchtet, dann müsst Ihr euch entscheiden ob Ihr den Datenbus auf das obere oder untere Nibble eines Ports legt:

Unteres Nibble	--> PORTx0 bis PORTx3
Oberes Nibble	--> PORTx4 bis PORTx7

Dieser "Wunsch" muss in der xlcd.h eingestellt werden (die entsprechende Zeile muss unkommentiert werden): Siehe Zeile 28-31

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
OpenXLCD( EIGHT_BIT & LINES_5X7 ); // 8-Bit Modus, 5x7 Zeichen, mehrzeilig
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
 char cgaddr = 0x1F;
 while( BusyXLCD() );
 SetCGRamAddr( cgaddr );


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
 char ddaddr = 0x10;
 while( BusyXLCD() );
 SetDDRamAddr( ddaddr );


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
 while( BusyXLCD() );
 WriteCmdXLCD( EIGHT_BIT & LINES_5X7 );
 WriteCmdXLCD( BLINK_ON );
 WriteCmdXLCD( SHIFT_DISP_LEFT );


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
 while( BusyXLCD() );
 WriteDataXLCD('H');


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

Screenshot
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.
  1. Zuerst Application Maestro installieren: Download.gif Download
  2. Anschließend zusätzliche Module installieren: Download.gif Download


So geht es:

  1. MAM installieren
  2. Zusatzmodule installieren
  3. MAM starten
  4. Frequenz (Clock) eingeben
  5. XLCD for C wählen und in das obere rechte Fenster ziehen
  6. Im Fenster darunter alle Einstellungen tätigen
  7. 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

  • KS0066
  • KS0073
  • KS007B
  • KS0076B
  • SED1278F
  • S6A0069
  • ST7066
  • SPLC780A1


Autoren

Nico 16:50, 19. Aug. 2011 (CEST)

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Navigation
Mikrocontroller
Elektrotechnik
Projekte
Displays
Bauteile
Werkzeuge