Αυτό είναι το έκτο σεμινάριό μας στη σειρά μαθημάτων PIC, σε αυτό το σεμινάριο μαθαίνουμε Interfacing LCD 16x2 με μικροελεγκτή PIC. Στα προηγούμενα μαθήματά μας μάθαμε τα βασικά του PIC χρησιμοποιώντας ορισμένα LED που αναβοσβήνουν Προγράμματα και επίσης μάθαμε πώς να χρησιμοποιούμε χρονοδιακόπτες στο PIC Microcontroller Μπορείτε να ελέγξετε εδώ όλα τα σεμινάρια για την εκμάθηση μικροελεγκτών PIC χρησιμοποιώντας μεταγλωττιστή MPLABX και XC8.
Αυτό το σεμινάριο θα είναι ενδιαφέρον, γιατί θα μάθουμε πώς να διασυνδέουμε LCD 16 × 2 με PIC16F877A, ελέγξτε το λεπτομερές βίντεο στο τέλος αυτού του σεμιναρίου. Πέρασαν οι παλιές μέρες όπου χρησιμοποιήσαμε LED για ενδείξεις χρήστη. Ας δούμε πώς μπορούμε να κάνουμε τα έργα μας να φαίνονται πιο δροσερά και χρήσιμα χρησιμοποιώντας οθόνες LCD. Ελέγξτε επίσης τα προηγούμενα άρθρα μας σχετικά με το Interfacing LCD με 8051, με το Arduino, με Raspberry Pi, με AVR.
Λειτουργίες για διασύνδεση LCD με μικροελεγκτή PIC:
Για να διευκολύνουμε τα πράγματα, δημιουργήσαμε μια μικρή βιβλιοθήκη που θα μπορούσε να κάνει τα πράγματα εύκολα ενώ χρησιμοποιούμε αυτήν την οθόνη LCD με το PIC16F877A μας. Το αρχείο κεφαλίδας "MyLCD.h" δίνεται εδώ για λήψη, το οποίο περιέχει όλες τις απαραίτητες λειτουργίες για την οδήγηση της οθόνης LCD χρησιμοποιώντας PIC MCU. Ο κωδικός της βιβλιοθήκης εξηγείται καλά από τις γραμμές σχολίων, αλλά εάν εξακολουθείτε να έχετε αμφιβολίες επικοινωνήστε μαζί μας μέσω της ενότητας σχολίων. Ελέγξτε επίσης αυτό το άρθρο για τη βασική λειτουργία LCD και τα Pinouts.
Σημείωση: Συνιστάται πάντοτε να γνωρίζετε τι συμβαίνει πραγματικά στο αρχείο κεφαλίδας σας, επειδή θα σας βοηθήσει να κάνετε εντοπισμό σφαλμάτων ή κατά την αλλαγή του MCU.
Τώρα, υπάρχουν δύο τρόποι για να προσθέσετε αυτόν τον κώδικα στο πρόγραμμά σας. Μπορείτε είτε να αντιγράψετε όλες τις παραπάνω γραμμές κώδικα στο MyLCD.h και να τις επικολλήσετε πριν από το κεντρικό κεντρικό (). Εναλλακτικά, μπορείτε να κατεβάσετε το αρχείο κεφαλίδας χρησιμοποιώντας τον σύνδεσμο και να τα προσθέσετε στο αρχείο κεφαλίδας του έργου σας ( #include "MyLCD.h "; ). Αυτό μπορεί να γίνει κάνοντας δεξί κλικ στο αρχείο κεφαλίδας και επιλέγοντας Προσθήκη υπάρχοντος στοιχείου και περιήγηση σε αυτό το αρχείο κεφαλίδας.
Εδώ έχω αντιγράψει και επικολλήσει τον κωδικό αρχείου κεφαλίδας στο κύριο αρχείο C μου. Επομένως, εάν χρησιμοποιείτε τον κωδικό μας, τότε δεν χρειάζεται να κάνετε λήψη και να προσθέσετε το αρχείο κεφαλίδας στο πρόγραμμά σας, απλώς χρησιμοποιήστε τον πλήρη κώδικα που δίνεται στο τέλος αυτού του Οδηγού. Σημειώστε επίσης ότι αυτή η βιβλιοθήκη θα υποστηρίζει μόνο PIC16F σειρά PIC Microcontroller.
Εδώ εξηγώ κάθε λειτουργία μέσα στο αρχείο κεφαλίδας παρακάτω:
void Lcd_Start (): Αυτή η συνάρτηση πρέπει να είναι η πρώτη συνάρτηση που πρέπει να κληθεί για να ξεκινήσει η εργασία με την οθόνη LCD. Πρέπει να καλέσουμε αυτήν τη λειτουργία μόνο μία φορά για να αποφύγουμε καθυστέρηση στο πρόγραμμα.
άκυρο Lcd_Start () {Lcd_SetBit (0x00); για (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 χρησιμοποιείται για επιστροφή στην αρχική σελίδα -> Διαγράφει τη μνήμη RAM και αρχικοποιεί την οθόνη LCD Lcd_Cmd (0x02). // 02H χρησιμοποιείται για επιστροφή στην αρχική σελίδα -> Διαγράφει τη μνήμη RAM και αρχικοποιεί την οθόνη LCD Lcd_Cmd (0x08). // Επιλέξτε Σειρά 1 Lcd_Cmd (0x00); // Clear Row 1 Display Lcd_Cmd (0x0C); // Επιλέξτε Σειρά 2 Lcd_Cmd (0x00); // Clear Row 2 Display Lcd_Cmd (0x06); }
Lcd_Clear (): Αυτή η λειτουργία καθαρίζει την οθόνη LCD και μπορεί να χρησιμοποιηθεί μέσα σε βρόχους για να καθαρίσει την εμφάνιση προηγούμενων δεδομένων.
Lcd_Clear () {Lcd_Cmd (0); // Διαγράψτε την οθόνη LCD Lcd_Cmd (1). // Μετακινήστε τον κέρσορα στην πρώτη θέση}
void Lcd_Set_Cursor (x pos, y pos): Μόλις ξεκινήσει, η οθόνη LCD μας είναι έτοιμη να λάβει εντολές, μπορούμε να δώσουμε εντολή στην οθόνη LCD να ρυθμίσει τον κέρσορα στην προτιμώμενη τοποθεσία σας χρησιμοποιώντας αυτήν τη λειτουργία. Ας υποθέσουμε ότι, χρειαζόμαστε δρομέα στον 5ο χαρακτήρα της 1ης σειράς. Στη συνέχεια, η συνάρτηση θα είναι άκυρη Lcd_Set_Cursor (1, 5)
άκυρο Lcd_Set_Cursor (char a, char b) {char temp, z, y; αν (a == 1) {temp = 0x80 + b - 1; // 80H χρησιμοποιείται για να μετακινήσετε τον κέρσορα z = temp >> 4; // Κάτω 8-bit y = temp & 0x0F; // Άνω 8-bit Lcd_Cmd (z); // Ορισμός σειράς Lcd_Cmd (y); // Ορισμός στήλης} αλλού εάν (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Κάτω 8-bit y = temp & 0x0F; // Άνω 8-bit Lcd_Cmd (z); // Ορισμός σειράς Lcd_Cmd (y); // Ορισμός στήλης}}
void Lcd_Print_Char (char data): Μόλις ρυθμιστεί ο δρομέας μπορούμε να γράψουμε έναν χαρακτήρα στη θέση του κάνοντας απλή κλήση αυτής της λειτουργίας.
void Lcd_Print_Char (char data) // Στείλτε 8-bit μέσω της λειτουργίας 4-bit {char Lower_Nibble, Upper_Nibble; Κάτω_Nibble = δεδομένα & 0x0F; Upper_Nibble = δεδομένα & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Στείλτε το άνω μισό μετατοπίζοντας 4 EN = 1 για (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Κάτω_Nibble); // Αποστολή κατώτερου μισού EN = 1; για (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Εάν πρόκειται να εμφανιστεί μια ομάδα χαρακτήρων, τότε μπορεί να χρησιμοποιηθεί η λειτουργία συμβολοσειράς.
άκυρο Lcd_Print_String (char * a) {int i; για (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Διαχωρίστε τη συμβολοσειρά χρησιμοποιώντας δείκτες και καλέστε τη λειτουργία Char}
Κάθε φορά που καλείται το Lcd_Print_Char (δεδομένα char) , οι αντίστοιχες τιμές χαρακτήρων αποστέλλονται στις γραμμές δεδομένων της οθόνης LCD. Αυτοί οι χαρακτήρες φτάνουν στο HD44780U σε μορφή bits. Τώρα αυτό το IC συνδέει τα bits με τον χαρακτήρα που θα εμφανίζεται χρησιμοποιώντας τη μνήμη ROM όπως φαίνεται στον παρακάτω πίνακα. Μπορείτε να βρείτε bit για όλους τους χαρακτήρες στο φύλλο δεδομένων του HD44780U LCD Controller.
Τώρα, αφού είμαστε ικανοποιημένοι με το αρχείο κεφαλίδας, ας φτιάξουμε το κύκλωμα και δοκιμάστε το πρόγραμμα. Ελέγξτε επίσης το πλήρες αρχείο κεφαλίδας που δίνεται στον παραπάνω σύνδεσμο.
Διάγραμμα κυκλώματος και δοκιμή:
Ακολουθεί το διάγραμμα κυκλώματος για Interfacing 16x2 LCD με PIC Microcontroller.
Δεν έχω δείξει τη σύνδεση τροφοδοσίας ή ICSP στο παραπάνω κύκλωμα, καθώς χρησιμοποιούμε την ίδια πλακέτα που χρησιμοποιήσαμε στο προηγούμενο σεμινάριο, ελέγξτε εδώ.
Ένα σημαντικό πράγμα που πρέπει να προσέξετε στο πρόγραμμα είναι οι ορισμοί ακίδων της οθόνης LCD:
# καθορισμός RS RD2 # καθορισμός EN RD3 # καθορισμός D4 RD4 # καθορισμός D5 RD5 # καθορισμός D6 RD6 # καθορισμός D7 RD7
Αυτοί οι ορισμοί ακίδων μπορούν να αλλάξουν σύμφωνα με τη ρύθμιση υλικού του προγραμματιστή. Θυμηθείτε να αλλάξετε τη σεβαστή διαμόρφωση θύρας στην κύρια λειτουργία εάν αλλάξετε εδώ.
Το υλικό για αυτό το έργο είναι πολύ απλό. Θα ξαναχρησιμοποιήσουμε την ίδια μονάδα PIC που χρησιμοποιήσαμε την τελευταία φορά και θα συνδέσουμε τη μονάδα LCD στο PIC μας χρησιμοποιώντας καλώδια jumper.
Η σύνδεση μπορεί να γίνει κατανοητή από τον ακόλουθο πίνακα:
Αρ. Καρφίτσας LCD |
Όνομα Pin LCD |
Όνομα Pin MCU |
Αριθμός αρ. MCU |
1 |
Εδαφος |
Εδαφος |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Εδαφος |
12 |
4 |
Εγγραφή Επιλέξτε |
RD2 |
21 |
5 |
Διαβάζω γράφω |
Εδαφος |
12 |
6 |
επιτρέπω |
RD3 |
22 |
7 |
Bit δεδομένων 0 |
ΝΚ |
- |
8 |
Bit δεδομένων 1 |
ΝΚ |
- |
9 |
Bit δεδομένων 2 |
ΝΚ |
- |
10 |
Bit δεδομένων 3 |
ΝΚ |
- |
11 |
Bit δεδομένων 4 |
RD4 |
27 |
12 |
Bit δεδομένων 5 |
RD5 |
28 |
13 |
Bit δεδομένων 6 |
RD6 |
29 |
14 |
Bit δεδομένων 7 |
RD7 |
30 |
15 |
Θετικό LED |
+ 5V |
11 |
16 |
Αρνητικό LED |
Εδαφος |
12 |
Τώρα ας κάνουμε απλώς τις συνδέσεις, ρίχνουμε τον κωδικό στο MCU μας και επαληθεύουμε την έξοδο.
Εάν έχετε κάποιο πρόβλημα ή αμφιβολία, χρησιμοποιήστε την ενότητα σχολίων. Δείτε επίσης το Demo Video που δίνεται παρακάτω.