Dies ist unser sechstes Tutorial in unserer PIC-Tutorial-Reihe. In diesem Tutorial lernen wir die Schnittstelle von 16x2-LCD mit PIC-Mikrocontroller. In unseren vorherigen Tutorials haben wir die Grundlagen von PIC mithilfe einiger LED-Blinkprogramme gelernt und auch gelernt, wie Timer in PIC-Mikrocontrollern verwendet werden. Hier finden Sie alle Tutorials zum Erlernen von PIC-Mikrocontrollern mit MPLABX- und XC8-Compiler.
Dieses Tutorial wird interessant sein, da wir lernen werden, wie man 16 × 2-LCD mit PIC16F877A verbindet. Schauen Sie sich das detaillierte Video am Ende dieses Tutorials an. Vorbei sind die alten Zeiten, in denen wir LEDs für Benutzeranzeigen verwendeten. Lassen Sie uns sehen, wie wir unsere Projekte mithilfe von LCD-Displays cooler und nützlicher gestalten können. Lesen Sie auch unsere vorherigen Artikel über die Schnittstelle zwischen LCD mit 8051, mit Arduino, mit Raspberry Pi und mit AVR.
Funktionen zur Schnittstelle von LCD mit PIC-Mikrocontroller:
Zur Vereinfachung haben wir eine kleine Bibliothek erstellt, die die Verwendung dieses LCD mit unserem PIC16F877A vereinfachen kann. Hier steht die Header-Datei "MyLCD.h" zum Download bereit, die alle notwendigen Funktionen zum Ansteuern des LCD über die PIC-MCU enthält. Der Bibliothekscode wird durch Kommentarzeilen gut erklärt, aber wenn Sie immer noch Zweifel haben, erreichen Sie uns über den Kommentarbereich. In diesem Artikel finden Sie auch Informationen zur grundlegenden LCD-Funktion und deren Pinbelegung.
Hinweis: Es wird immer empfohlen zu wissen, was tatsächlich in Ihrer Header-Datei passiert, da dies Ihnen beim Debuggen oder beim Ändern der MCU hilft.
Es gibt zwei Möglichkeiten, diesen Code in Ihr Programm aufzunehmen. Sie können entweder alle oben genannten Codezeilen in MyLCD.h kopieren und vor dem void main () einfügen. Oder Sie können die Header-Datei über den Link herunterladen und zur Header-Datei Ihres Projekts hinzufügen ( #include "MyLCD.h "; ). Klicken Sie dazu mit der rechten Maustaste auf die Header-Datei, wählen Sie Vorhandenes Element hinzufügen und navigieren Sie zu dieser Header-Datei.
Hier habe ich den Header-Dateicode kopiert und in meine Haupt-C-Datei eingefügt. Wenn Sie also unseren Code verwenden, müssen Sie die Header-Datei nicht herunterladen und in Ihr Programm einfügen. Verwenden Sie einfach den vollständigen Code, der am Ende dieses Tutorials angegeben ist. Beachten Sie auch, dass diese Bibliothek nur PIC-Mikrocontroller der PIC16F-Serie unterstützt.
Hier erkläre ich jede Funktion in unserer Header-Datei unten:
void Lcd_Start (): Diese Funktion sollte die erste Funktion sein, die aufgerufen werden muss, um mit unserem LCD zu arbeiten. Wir sollten diese Funktion nur einmal aufrufen, um Verzögerungen im Programm zu vermeiden.
void Lcd_Start () {Lcd_SetBit (0x00); für (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __delay_ms (5); Lcd_Cmd (0x03); __delay_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H wird für Return home verwendet -> Löscht den RAM und initialisiert das LCD Lcd_Cmd (0x02); // 02H wird für Return home verwendet -> Löscht den RAM und initialisiert das LCD Lcd_Cmd (0x08); // Zeile 1 auswählen Lcd_Cmd (0x00); // Zeile 1 löschen Anzeige Lcd_Cmd (0x0C); // Zeile 2 auswählen Lcd_Cmd (0x00); // Zeile 2 löschen Anzeige Lcd_Cmd (0x06); }}
Lcd_Clear (): Diese Funktion löscht den LCD-Bildschirm und kann in Schleifen verwendet werden, um das Erscheinungsbild vorheriger Daten zu löschen.
Lcd_Clear () {Lcd_Cmd (0); // Lösche das LCD Lcd_Cmd (1); // Bewegen Sie den Cursor auf die erste Position}
void Lcd_Set_Cursor (x pos, y pos): Nach dem Start ist unser LCD bereit, Befehle entgegenzunehmen. Mit dieser Funktion können wir das LCD anweisen, den Cursor an der von Ihnen bevorzugten Position zu setzen. Angenommen, wir benötigen den Cursor auf das 5. Zeichen der 1. Zeile. Dann ist die Funktion ungültig Lcd_Set_Cursor (1, 5)
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; if (a == 1) {temp = 0x80 + b - 1; // 80H wird verwendet, um den Cursor zu bewegen z = temp >> 4; // Untere 8-Bit y = temp & 0x0F; // Obere 8-Bit Lcd_Cmd (z); // Setze Zeile Lcd_Cmd (y); // Spalte setzen} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Untere 8-Bit y = temp & 0x0F; // Obere 8-Bit Lcd_Cmd (z); // Setze Zeile Lcd_Cmd (y); // Spalte setzen}}
void Lcd_Print_Char (char data): Sobald der Cursor gesetzt ist, können wir durch einfaches Aufrufen dieser Funktion ein Zeichen an seine Position schreiben.
void Lcd_Print_Char (char data) // 8-Bit im 4-Bit-Modus senden {char Lower_Nibble, Upper_Nibble; Lower_Nibble = Daten & 0x0F; Upper_Nibble = Daten & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Sende die obere Hälfte durch Verschieben um 4 EN = 1; für (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Sende untere Hälfte EN = 1; für (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }}
void Lcd_Print_String (char * a): Wenn eine Gruppe von Zeichen angezeigt werden soll, kann die Zeichenfolgenfunktion verwendet werden.
void Lcd_Print_String (char * a) {int i; für (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Teile den String mit Zeigern und rufe die Char-Funktion auf}
Bei jedem Aufruf von Lcd_Print_Char (char data) werden die entsprechenden Zeichenwerte an die Datenleitungen des LCD gesendet. Diese Zeichen erreichen den HD44780U in Form von Bits. Dieser IC bezieht nun die Bits auf das anzuzeigende Zeichen, indem er seinen ROM-Speicher verwendet, wie in der folgenden Tabelle gezeigt. Sie finden Bits für alle Zeichen im Datenblatt des LCD-Controllers HD44780U.
Da wir nun mit unserer Header-Datei zufrieden sind, bauen wir die Schaltung auf und testen das Programm. Überprüfen Sie auch die vollständige Header-Datei unter dem oben angegebenen Link.
Schaltplan und Prüfung:
Unten sehen Sie den Schaltplan für die Schnittstelle zwischen 16x2-LCD und PIC-Mikrocontroller.
Ich habe das Netzteil oder die ICSP-Verbindung in der obigen Schaltung nicht gezeigt, da wir dieselbe Karte verwenden, die wir im vorherigen Tutorial verwendet haben. Überprüfen Sie dies hier.
Ein wichtiger Punkt im Programm sind die Pin-Definitionen des LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Diese Pin-Definitionen können je nach Hardware-Setup des Programmierers geändert werden. Denken Sie daran, die respektierte Portkonfiguration in der Hauptfunktion zu ändern, wenn Sie hier ändern.
Die Hardware für dieses Projekt ist sehr einfach. Wir werden dasselbe PIC-Modul, das wir zuletzt verwendet haben, wiederverwenden und das LCD-Modul über Überbrückungskabel mit unserem PIC verbinden.
Der Zusammenhang kann anhand der folgenden Tabelle verstanden werden:
LCD-Pin-Nr. |
LCD-Pin-Name |
MCU Pin Name |
MCU Pin Nr. |
1 |
Boden |
Boden |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Boden |
12 |
4 |
Registrieren Wählen Sie |
RD2 |
21 |
5 |
Lesen Schreiben |
Boden |
12 |
6 |
Aktivieren |
RD3 |
22 |
7 |
Datenbit 0 |
NC |
- - |
8 |
Datenbit 1 |
NC |
- - |
9 |
Datenbit 2 |
NC |
- - |
10 |
Datenbit 3 |
NC |
- - |
11 |
Datenbit 4 |
RD4 |
27 |
12 |
Datenbit 5 |
RD5 |
28 |
13 |
Datenbit 6 |
RD6 |
29 |
14 |
Datenbit 7 |
RD7 |
30 |
15 |
LED positiv |
+ 5V |
11 |
16 |
LED negativ |
Boden |
12 |
Lassen Sie uns nun einfach die Verbindungen herstellen, den Code an unsere MCU senden und die Ausgabe überprüfen.
Wenn Sie Probleme oder Zweifel haben, verwenden Sie bitte den Kommentarbereich. Überprüfen Sie auch das unten angegebene Demo-Video.