HD44780

Ich möchte Euch in diesem Artikel zeigen, wie Ihr ein LCD Display mit einem HD44780 oder kompatiblen Controller ganz einfach mit Hilfe von fertigen Bibliotheken ansteuern könnt. Genauer gesagt stammen die Bibliotheken vom alten C18-Compiler von Microchip. Dieser wird bzw. wurde vom neuen  XC8 Compiler abgelöst. Die Compiler sind jedoch weitesgehend kompatibel und so lassen sich die LCD-Bibliotheken des C18 auch mit dem neuen XC8 verwenden.

XLCD Bibliothek

Die Dokumentation zu den Compiler Bibliotheken des C18 Compilers findet Ihr unter folgendem Link . Mit meiner Anleitung werdet Ihr die Doku jedoch nicht benötigen.

Damit Ihr mit der Bibliothek arbeiten könnt müsst Ihr natürlich erst einmal wissen wo Ihr diese bekommen könnt. Nun durch die Installation des XC8 habt Ihr die Bibliothek automatisch schon auf Eurem PC. Ihr findet diese unter folgendem Pfad:

...\Microchip\xc8\v1.30\sources\pic18\plib\XLCD

Bevor Ihr nun diesen Artikel durcharbeitet: Es gibt ein Tool von Microchip mit dem sich die XLCD Bibliothek ganz einfach per Mausklick an Eure (Hardware-)Situation anpassen lässt. Somit erspart Ihr euch sämtliches händisches Anpassen der Dateien. Wer das Tool nutzen möchte kann >> hier weiterlesen.

Enthaltene Funktionen

Schauen wir uns doch mal an welche Funktionen die XLCD-Bibliothek für uns bereit hält und wofür sie verwendet werden. Ich nenne hier lediglich die für uns wichtigsten.

BusyXLCD


Mit dieser Funktion wird das Busyflag des LCD-Controllers, also des HD44780 abgefragt. Somit können wir feststellen ob der Controller bereit ist neue Daten/Befehle zu empfangen oder eben nicht.

Prototyp

unsigned char BusyXLCD( void );

Der Rückgabewert der Funktion gibt Aufschluss darüber ob das Display bzw. der HD4478ß Controller gerade beschäftigt ist. Wenn der Controller frei ist liefert die Funktion eine 0, wenn er nicht frei ist liefert die Funktion eine 1 zurück.

Beispiel

while( BusyXLCD() ); // Wait for LCD ready

OpenXLCD


Hier wird die Initialisierung des Controllers durchgeführt. Wir teilen dem HD44780 wichtige Informationen (Anzahl der Zeilen, …) mit.

Prototyp

void OpenXLCD( unsigned char lcdtype );

Beispiel

OpenXLCD( FOUR_BIT & LINES_5x7 );

Mit dem Übergabewert wird der Controller nach Euren Wünschen konfiguriert. Dabei könnt Ihr Makros verwenden wie im Beispiel gezeigt. Die Makros sind in der xlcd.h Datei definiert.

Das Display kann entweder im 4 oder 8 Bit Modus betrieben werden. Der Modus gibt an wie viele Datenleitungen zum Display verbunden werden müssen. Dafür stehen folgende Makros zur Verfügung:

FOUR_BIT  --> 4 Bit Modus
EIGHT_BIT --> 8 Bit Modus

Wichtig: Wenn Ihr das Display im 4 Bit Modus betreiben möchtet, dann müsst Ihr die vier Datenleitungen D4 . . . D7 entweder am oberen oder unteren Nibble eures gewählten Ports anschließen! Also entweder D7 an Rx7, D6 an Rx6 usw. oder D7 an Rx3, D6 an Rx2 usw.

Die Angabe müsst Ihr in der xlcd.h Datei bekanntmachen! Die anzupassenden Zeilen sind 26 und 31.

/* #define BIT8 */     <-- Zeile 26
/* #define UPPER */    <-- Zeile 31

Zeile 26 wird auskommentiert (standardmäßig) wenn Ihr den 4 Bit Modus verwenden möchtet. Wenn der 4 Bit Modus verwendet wird und die Datenleitungen am unteren Nibble (Rx0 . . . Rx3) angeschlossen sind, dann wird die Zeile 31 ebenfalls auskommentiert.

Des Weiteren könnt Ihr angeben welche Größe die Zeichen haben sollen. Hierfür stehen folgende Makros zur Verfügung:

LINE_5X7  --> 5x7, einzeilig Display
LINE_5X10 --> 5x10
LINES_5X7 --> 5x7, mehrzeiliges Display

Die Makros werden beim Aufruf von OpenXLCD jeweils mit einem & Operator verknüpft (siehe Beispiel).

SetCGRamAddr


Die Adresse des CG-RAM kann hier eingestellt werden. Die CGRAM Adresse ist interessant, wenn eigene Zeichen erstellt werden sollen.

Prototyp

void SetCGRamAddr( unsigned char addr );

Vor dem Aufruf dieser Funktion muss geprüft werden ob das Display bereit ist neue Daten oder Befehle zu empfangen.

Beispiel

char cgAdress = 0x1F;
while( BusyXLCD() );
SetCGRamAddr( cgAdress );

SetDDRamAddr


Hier können wir die DD-RAM Adresse des Displays setzen um zum Beispiel einen Text direkt an eine bestimmte Stelle zu schreiben.

Prototyp

SetDDRamAddr( unsigned char addr );

Genau wie SetCGRamAddr darf auch diese Funktion nur aufgerufen werden, wenn der Controller frei ist.

Beispiel

char ddAddr = 0x10;
while( BusyXLCD() );
SetDDRamAddr( ddAddr );

WriteCmdXLCD


Diese Funktion wird verwendet um einen Befehl an den Controller zu senden. Sie wird vornehmlich bei der Initialisierung verwendet.

Prototyp

void WriteCmdXLCD( unsigned char cmd );

Beispiel

while( BusyXLCD() );
WriteCmdXLCD( FOUR_BIT & LINES_5x7 );
WriteCmdXLCD( BLINK_ON );
WriteCmd( SHIFT_DISP_LEFT );

Nachfolgend mal eine Auflistung von verfügbaren Makros, welcher zur Übergabe von Befehlen genutzt werden können.

DOFF              --> Display aus
CURSOR_OFF        --> Cursor aus
BLINK_OFF         --> Cursor blinken aus
SHIFT_CUR_LEFT    --> Cursor nach links
SHIFT_CUR_RIGHT   --> Cursor nach rechts
SHIFT_DISP_LEFT   --> Display nach links*
SHIFT_DISP_RIGHT  --> Display nach rechts*

* Da der Textpuffer des Controllers größer ist, als der Anzeigebereich des Displays, lassen sich so Laufschriften erzeugen.

WriteDataXLCD


Diese Funktion wird verwendet um Daten an den Controller zu senden. Wir verwenden diese Funktion um die Zeichen/Daten an den HD44780 zu senden, die wir auf dem Display darstellen möchten.

Prototyp

void WriteDataXLCD( char data );

Beispiel

while( BusyXLCD() );
WriteDataXLCD('H');

Anwendung der XLCD

In diesem Kapitel schauen wir uns an, wie die einzelnen Funktionen der XLCD Bibliothek verwendet werden und was an Vorbereitung getroffen werden muss, um die Bibliothek an Eure Situation anzupassen. Dabei geht es vor allem darum an welchen IOs des PIC Ihr das Display angeschlossen habt.

Als erstes bindet Ihr alle C-Dateien in Euer Projekt ein, die sich in diesem Ordner befinden. Dafür fürt Ihr in MPLABX im Fenster Projects einen Rechtsklick auf  Source aus.

...\Microchip\xc8\v1.30\sources\pic18\plib\XLCD\*

Anschließend kopiert Ihr die folgende Datei aus dem Ordner heraus in den Ordner in dem sich Euer Projekt befindet. Also nicht einfach die Datei über MPLABX einbinden, sondern tatsächlich die Datei in den Ordner auf der Festplatte, indem sich der Rest von Eurem Projekt befindet, kopieren. Das ist nötig, da an dieser Datei gegebenenfalls Anpassungen vorgenommen werden müssen.

...\Microchip\xc8\v1.30\include\plib\xlcd.h

Diese Datei wird nun ebenfalls in Euer Projekt eingebunden. Hierfür unter MPLABX einen Rechtsklick auf Headerfiles ausführen und die bereits vorhandene Datei (in Eurem Projektordner) hinzufügen.

Jetzt sind alle Dateien vorhanden und wir können anfangen evtl. Anpassungen an der xlcd.h vorzunehmen.

Anpassung der Pinbelegung

Da Ihr das Display vermutlich nicht genauso angeschlossen habt wie es standardmäßig in der xlcd.h vorgesehen ist müssen wir nun Anpassungen vornehmen. Wir öffnen dafür nun die <strong>xlcd.h</strong> Datei, die wir in den Projektordner kopiert haben. Das könnt Ihr entweder in Windows mit dem Explorer machen oder Ihr führt einen Doppelklck in MPLABX auf die Datei aus (diese sollte sich ja im Ordner Headerfiles befinden).

Die Datenleitungen dürfen nicht auf mehrere Ports verteilt werden! Sie müssen entweder am PORTx an den Pins <0-3> oder an den Pins <4-7> anliegen! Andernfalls könnt Ihr die xlcd Bibliothek nicht verwenden!

Zunächst einmal geben wir an, an welchen Port die Datenleitungen zum LCD angeschlossen sind.

Anzupassen sind die Zeilen 34 und 35 der xlcd.h Datei:

#define DATA_PORT PORTB
#define TRIS_DATA_PORT TRISB

Dort tragt Ihr nun ein an welchen Port Ihr die Datenleitungen des LCDs angeschlossen habt oder anschließen möchtet. Hier im Beispiel ist es der Port B.

Als nächstes geht es um die Steuerleitungen zum LCD bzw. zum HD44780 Controller. Auch hier muss angegeben werden wo diese Leitungen am PIC angeschlossen sind/werden.

Anzupassen sind die Zeilen 40 bis 47 der xlcd.h Datei:

#define RW_PIN LATBbits.LATB6 /* PORT for RW */
#define TRIS_RW TRISBbits.TRISB6 /* TRIS for RW */

#define RS_PIN LATBbits.LATB5 /* PORT for RS */
#define TRIS_RS TRISBbits.TRISB5 /* TRIS for RS */

#define E_PIN LATBbits.LATB4 /* PORT for D */
#define TRIS_E TRISBbits.TRISB4 /* TRIS for E */

Es muss jeweils das LAT-Bit und das zugehörige Tris-Bit angepasst werden (jeweils zwei Zeilen sind zusammengehörig).

Weitere Funktionen

Die Bibliotheken brauchen weitere drei Funktionen, die von Euch selbst geschrieben werden müssen! Die Bibliothek benötigt feste Wartezeiten. Folgende Funktionen sind von Euch zu erstellen:

DelayFor18TCY      --> Schleife für 18 Taktzyklen
DelayPORXLCD    --> Warteschleife für 15ms
DelayXLCD       --> Warteschleife für 5ms

Keine Angst, die Funktionen sind einfach und schnell erstellt. Fangen wir mit der Funktion an, die 18 Takte ausharren soll. Bitte beachten: Für die gezeigten Code-Beispiele müsst Ihr die Bibliothek stdint.h einbinden. Ansonsten kommt es bei der Verwendung von uint8_t zu einem Fehler (Danke für den hilfreichen Kommentar!).

 void DelayFor18TCY (void)
{
   uint8_t k = 0;

   for( k=0; k&lt;18; k++)
   {
      Nop();
   }
}

Genau genommen wartet diese Funktion sogar länger als 18 Tcy, denn der Aufruf sowie der Rücksprung benötigen ebenfalls Zeit.

Als nächstes die beiden Funktionen für die Wartezeiten von 15 und 5 milli Sekunden. Hierfür würde ich die Warteschleifen vom XC Compiler verwenden.

#define _XTAL_FREQ 4000000 /*Clock frequency in Hz*/

void DelayPORXLCD (void)
{
   __delay_ms(15);
}

void DelayXLCD (void)
{
   __delay_ms(5);
}

Vielen Dank an Gabriel für folgenden Hinweis:

Die Kombination: MPLAB IDE 2.15 — XC8 1.32 –Zielprozessor 16F887 verlangen als Schreibweise für Nop: “NOP();” oder “__nop();”

Application Maestro

Wem das ganze manuelle anpassen zu blöd ist, der kann sich eines kleinen aber feinen Tools bedienen. Mit dem Microchip Application Maestro Tool lassen sich fertige Dateien erzeugen, die automatisch auf Eure Situation zugeschnitten sind.

APL_MAESTRO

Und so müsst Ihr vorgehen:

  1. Herunterladen von Application Maestro 
  2. Installieren zusätzlicher Module 
  3. Application Maestro starten
  4. Frequenz in das Feld eintragen
  5. XLCD for C per Drag&Drop in Selected Modules ziehen
  6. Im Fenster drunter konfigurieren
  7. Generate Code Button drücken

Nun werden die Dateien automatisch erzeugt. Die Datei XLCD.P18.ex.txt enthält ein Beispiel, wie Ihr die erzeugten Codes verwenden könnt. Einfacher und schneller geht es kaum.

Siehe hier ergänzend auch XLCD for C 

11 responses

  1. Danke für deinen Post, hat mir bei meinen ersten Schritten geholfen. Ein Typo ist mir aufgefallen:

    “Also entweder D7 an Rx7, D6 an Rx6 usw. oder D7 an Rx4, D6 an Rx3 usw.”

    Hier müsste im zweiten Fall “D7 an Rx3, D6 an Rx2” stehen (die Port-Nummern fangen ja bei 0 an).

    Grüße
    Clemens

Leave a Reply

Your email address will not be published. Required fields are marked *