- Λειτουργία οθόνης LCD 16x2
- Διάγραμμα κυκλώματος για διασύνδεση LCD με μικροελεγκτή STM8
- Βιβλιοθήκη STM8 LCD - Αρχείο κεφαλίδας για STM8S103F3P6
- Πρόγραμμα LCD για μικροελεγκτή STM8S
- STM8 με LCD - Λειτουργεί
Η οθόνη αλφαριθμητικών LCD 16x2 είναι η πιο συχνά χρησιμοποιούμενη οθόνη μεταξύ των χομπίστες και των ενθουσιωδών. Η οθόνη είναι πολύ χρήσιμη όταν θέλετε να εμφανίσετε βασικές πληροφορίες στον χρήστη και μπορεί επίσης να βοηθήσει στη δοκιμή ή τον εντοπισμό σφαλμάτων του κώδικα μας. Αυτή η συγκεκριμένη μονάδα LCD 16x2 είναι εύκολα διαθέσιμη και είναι δημοφιλής εδώ και πολύ καιρό. Μπορείτε να μάθετε περισσότερα σχετικά με τα βασικά στοιχεία της μονάδας LCD 16x2 στο συνδεδεμένο άρθρο.
Για να συνεχίσουμε με τη σειρά μαθημάτων STM8 Microcontroller, σε αυτό το σεμινάριο, θα μάθουμε πώς να διασυνδέουμε μια οθόνη LCD με STM8 Microcontroller. Έχουμε προηγουμένως διασυνδέσει LCD 16x2 με πολλούς άλλους μικροελεγκτές επίσης, τα σεμινάρια παρατίθενται παρακάτω και μπορείτε να τα ελέγξετε αν ενδιαφέρεστε.
Εάν είστε νέοι στο STM8, ρίξτε μια ματιά στο άρθρο για να ξεκινήσετε με τον μικροελεγκτή STM8 για να κατανοήσετε τα βασικά στοιχεία του πίνακα ελέγχου και του περιβάλλοντος προγραμματισμού. Δεν θα καλύψουμε τα βασικά σε αυτό το σεμινάριο.
Λειτουργία οθόνης LCD 16x2
Όπως υποδηλώνει το όνομα, μια οθόνη LCD 16x2 θα έχει 16 στήλες και 2 σειρές. Συνολικά, θα είμαστε σε θέση να εμφανίσουμε 32 χαρακτήρες σε αυτήν την οθόνη και αυτοί οι χαρακτήρες μπορεί να είναι αλφάβητα ή αριθμοί ή ακόμη και σύμβολα. Ένα απλό pinout 16x2 LCD που χρησιμοποιούμε σε αυτό το σεμινάριο εμφανίζεται παρακάτω-
Όπως μπορείτε να δείτε, η οθόνη έχει 16 καρφίτσες και μπορούμε να τη χωρίσουμε σε πέντε κατηγορίες, Power Pins, kontras pin, Control Pins, Data pins και Backlight pins όπως φαίνεται στον παρακάτω πίνακα. Θα εξετάσουμε τις λεπτομέρειες κάθε πείρου όταν συζητήσουμε το διάγραμμα κυκλώματος αυτού του σεμιναρίου.
Κατηγορία | Καρφίτσα ΟΧΙ. | Όνομα καρφιτσώματος | Λειτουργία |
Power Pin | 1 | VSS | Καρφίτσα γείωσης, συνδεδεμένη στο έδαφος |
2 | VDD ή Vcc | Πείρος τάσης + 5V | |
Καρφίτσα αντίθεσης | 3 | V0 ή VEE | Ρύθμιση αντίθεσης, συνδεδεμένη με Vcc μέσω μεταβλητής αντίστασης. |
Καρφίτσες ελέγχου | 4 | RS | Εγγραφή Επιλέξτε Pin, RS = 0 Λειτουργία εντολών, RS = 1 Λειτουργία δεδομένων |
5 | RW | Καρφίτσα ανάγνωσης / εγγραφής, RW = 0 Λειτουργία εγγραφής, RW = 1 Λειτουργία ανάγνωσης | |
6 | μι | Ενεργοποίηση, ένας υψηλός έως χαμηλός παλμός πρέπει να ενεργοποιήσει την οθόνη LCD | |
Καρφίτσες δεδομένων | 7-14 | D0-D7 | Καρφίτσες δεδομένων, Αποθηκεύει τα δεδομένα που θα εμφανίζονται σε LCD ή στις οδηγίες εντολής |
Πινέζες οπίσθιου φωτισμού | 15 | LED + ή A. | Για να ενεργοποιήσετε το Backlight + 5V |
16 | LED- ή Κ | Γήπεδο οπίσθιου φωτισμού |
Στο πίσω μέρος της οθόνης LCD, όπως φαίνεται στην παρακάτω εικόνα, θα βρείτε δύο μαύρες κουκκίδες, μέσα στις οποίες διαθέτουμε το HD44780 LCD πρόγραμμα οδήγησης LCD (περικυκλωμένο με κόκκινο χρώμα). Ο μικροελεγκτής μας πρέπει να επικοινωνεί με αυτό το IC το οποίο με τη σειρά του θα ελέγχει τι εμφανίζεται στην οθόνη LCD. Εάν είστε περίεργοι να μάθετε πώς λειτουργεί ακριβώς αυτό, θα πρέπει να ελέγξετε τη λειτουργία της οθόνης LCD 16x2 όπου έχουμε ήδη συζητήσει πώς λειτουργεί η LCD λεπτομερώς.
Σε αυτό το σεμινάριο, θα συζητήσουμε το διάγραμμα κυκλώματος και τον κώδικα για την εμφάνιση αλφαριθμητικών χαρακτήρων (αλφάβητα και αριθμοί) σε μια οθόνη LCD 16x2 χρησιμοποιώντας απλές εντολές LCD_print _char και LCD_print_string . Αυτές οι εντολές μπορούν να χρησιμοποιηθούν απευθείας στο πρόγραμμα αφού συμπεριληφθεί το αρχείο κεφαλίδας. Το αρχείο κεφαλίδας ασχολείται με τα περισσότερα πράγματα για εσάς, επομένως δεν είναι υποχρεωτικό να γνωρίζετε πώς λειτουργεί η οθόνη ή το πρόγραμμα οδήγησης HD44780 IC.
Διάγραμμα κυκλώματος για διασύνδεση LCD με μικροελεγκτή STM8
Το πλήρες κύκλωμα LCD STM8 βρίσκεται στην παρακάτω εικόνα. Όπως μπορείτε να δείτε ότι η σύνδεση για τον ελεγκτή STM8S103F3P6 με LCD είναι πολύ απλή, έχουμε την οθόνη LCD απευθείας συνδεδεμένη στην πλακέτα μας και ο σύνδεσμος ST συνδέεται επίσης για τον προγραμματισμό της πλακέτας.
Οι ακροδέκτες ισχύος Vss και Vcc συνδέονται στον ακροδέκτη 5V στην πλακέτα STM8S, σημειώστε ότι η τάση λειτουργίας της οθόνης LCD είναι 5V και είναι συνδεδεμένη για λειτουργία σε 3.3V. Έτσι, παρόλο που ο μικροελεγκτής STM8S103F3P6 λειτουργεί σε 3.3V είναι υποχρεωτικό να υπάρχει τροφοδοσία 5V για την οθόνη LCD, μπορείτε να το αποφύγετε αυτό χρησιμοποιώντας ένα IC ελεγκτή φόρτισης, αλλά δεν θα το συζητήσουμε αυτό σε αυτό το σεμινάριο.
Στη συνέχεια, έχουμε τον πείρο αντίθεσης που χρησιμοποιείται για τον καθορισμό της αντίθεσης της οθόνης LCD, τον έχουμε συνδέσει με το ποτενσιόμετρο ώστε να μπορούμε να ελέγξουμε την αντίθεση. Έχουμε χρησιμοποιήσει ένα δοχείο 10k, αλλά μπορείτε επίσης να χρησιμοποιήσετε άλλες κοντινές τιμές, το pot λειτουργεί ως πιθανός διαχωριστής για να παρέχει 0-5 V στον πείρο αντίθεσης, συνήθως μπορείτε επίσης να χρησιμοποιήσετε μια αντίσταση απευθείας για να παρέχει περίπου 2,2V για λογική αντίθεση αξία. Έπειτα έχουμε τις ακίδες επαναφοράς (RS), ανάγνωσης / εγγραφής (RW) και ενεργοποίησης (Ε). Ο πείρος ανάγνωσης-εγγραφής είναι γειωμένος επειδή δεν θα διαβάζουμε τίποτα από την οθόνη LCD. Οι άλλοι δύο ακροδέκτες ελέγχου Rs και E συνδέονται με τους ακροδέκτες PA1 και PA2 αντίστοιχα.
Έπειτα έχουμε τις καρφίτσες δεδομένων DB0 έως DB7. Η οθόνη 16x2 LCD μπορεί να λειτουργήσει σε δύο λειτουργίες, η μία είναι λειτουργία 8-bit όπου πρέπει να χρησιμοποιήσουμε και τις 8 ακίδες δεδομένων (DB0-DB7) στην οθόνη LCD και η άλλη είναι η λειτουργία 4-bit όπου χρειαζόμαστε μόνο 4 καρφίτσες δεδομένων (DB4-DB7). Η λειτουργία 4-bit χρησιμοποιείται συνήθως επειδή απαιτεί λιγότερες ακίδες GPIO από τον ελεγκτή, οπότε έχουμε χρησιμοποιήσει επίσης τη λειτουργία 4-bit σε αυτό το σεμινάριο και έχουμε συνδέσει μόνο καρφίτσες DB4, DB5, DB6 και DB7 με καρφίτσες PD1, PD2, PD3 και PD4 αντίστοιχα.
Οι δύο τελευταίοι ακροδέκτες BLA και BLK χρησιμοποιούνται για την τροφοδοσία του εσωτερικού φωτισμού LED, έχουμε χρησιμοποιήσει μια αντίσταση 560 ohm ως τρέχουσα περιοριστική αντίσταση. Ο προγραμματιστής ST-Link είναι συνδεδεμένος όπως πάντα στο προηγούμενο σεμινάριό μας. Έκανα την πλήρη σύνδεση στο breadboard και το σχήμα μου φαίνεται όπως φαίνεται στην παρακάτω εικόνα.
Βιβλιοθήκη STM8 LCD - Αρχείο κεφαλίδας για STM8S103F3P6
Πριν προχωρήσουμε στο διάγραμμα κυκλώματος, ας πάρουμε το αρχείο κεφαλίδας STM8 LCD από το GitHub χρησιμοποιώντας τον ακόλουθο σύνδεσμο-
Αρχείο κεφαλίδας STM8S 16x2 LCD
Μπορείτε είτε να κάνετε λήψη του πλήρους repo και να λάβετε το αρχείο stm8s103_LCD_16x2.h είτε απλώς τον κωδικό από τον παραπάνω σύνδεσμο. Κατά τη ρύθμιση του έργου, βεβαιωθείτε ότι έχετε συμπεριλάβει όλα τα απαιτούμενα αρχεία κεφαλίδας στον κατάλογο inc μαζί με αυτό το αρχείο κεφαλίδας.
Εάν δεν είστε σίγουροι πώς να προσθέσετε τα αρχεία κεφαλίδας και να μεταγλωττίσετε το πρόγραμμα, ακολουθήστε το βίντεο στο κάτω μέρος αυτής της σελίδας. Και αν είστε περίεργοι για το πώς λειτουργεί ο κώδικας μέσα στο αρχείο κεφαλίδας, μπορείτε να δείτε το PIC με έναν οδηγό LCD. Το αρχείο κεφαλίδας που χρησιμοποιείται σε αυτό το έργο είναι πολύ παρόμοιο με αυτό που εξηγείται εκεί, οπότε δεν θα λάβουμε λεπτομέρειες σχετικά με αυτό.
Πρόγραμμα LCD για μικροελεγκτή STM8S
Για την επίδειξη, θα προγραμματίσουμε τον ελεγκτή STM8S να εμφανίσει μια απλή συμβολοσειρά όπως το "Circuit Digest" και στη συνέχεια θα αυξήσουμε μια τιμή "Δοκιμή" για κάθε δευτερόλεπτο στη δεύτερη γραμμή. Το πλήρες πρόγραμμα βρίσκεται στο κάτω μέρος αυτής της σελίδας. Η εξήγηση έχει ως εξής.
Ξεκινάμε το πρόγραμμά μας καθορίζοντας τις καρφίτσες και προσθέτοντας τα απαιτούμενα αρχεία κεφαλίδας όπως πάντα. Στο παραπάνω διάγραμμα κυκλώματος που έχουμε συζητήσει, έχουμε συνδέσει το LCD_RS με το PA1, οπότε το έχουμε ορίσει ως LCD_RS GPIOA, GPIO_PIN_1. Ομοίως, κάναμε το ίδιο και για άλλες καρφίτσες Εάν ακολουθούν διαφορετικό κύκλωμα, βεβαιωθείτε ότι έχετε αλλάξει αυτές τις τιμές ανάλογα.
#define LCD_RS GPIOA, GPIO_PIN_1 #define LCD_EN GPIOA, GPIO_PIN_2 #define LCD_DB4 GPIOD, GPIO_PIN_1 # καθορισμός LCD_DB5 GPIOD, GPIO_PIN_2 # καθορισμός LCD_DB6 GPIOD, GPIO_PIN_3 #dfine LCD_DB
Στη συνέχεια μέσα στο κύριο πρόγραμμά μας, δηλώσαμε τις μεταβλητές που απαιτούνται για αυτόν τον δείγμα κώδικα. Έχουμε μια μεταβλητή δοκιμής που ονομάζεται test_var η οποία αρχικοποιείται στο μηδέν, θα αυξήσουμε τη μεταβλητή και θα την εμφανίσουμε στην οθόνη LCD. Οι χαρακτήρες d1 έως d4 αντιπροσωπεύουν τα 4 ψηφία της δοκιμαστικής μεταβλητής, επειδή η οθόνη LCD μας δεν μπορεί να εμφανίσει απευθείας την τιμή int, πρέπει να τα μετατρέψουμε σε χαρακτήρες.
// Μεταβλητές δηλώσεις int test_var = 0; char d4, d3, d2, d1;
Η λειτουργία LCD_Begin () χρησιμοποιείται για την προετοιμασία της οθόνης LCD. Αυτή η λειτουργία θα προετοιμάσει όλες τις απαιτούμενες ακίδες GPIO και θα ρυθμίσει επίσης την οθόνη LCD σε λειτουργία LCD 16x2 Στη συνέχεια έχουμε τη λειτουργία LCD_Clear () η οποία χρησιμοποιείται για την εκκαθάριση όλων των τιμών στην οθόνη LCD, θα διαγράψει τα πάντα στην οθόνη LCD, ώστε να είναι καθαρό να γράφουμε νέες τιμές. Στη συνέχεια έχουμε τη λειτουργία LCD_Set_Cursor (x, y) όπου x και y είναι οι θέσεις στις οποίες πρέπει να γράψουμε τον νέο μας χαρακτήρα. Για παράδειγμα, (1,1) σημαίνει πρώτη γραμμή και πρώτη στήλη, παρόμοια (2,12) σημαίνει δεύτερη γραμμή 12 στήλη, επίσης. Σημειώστε ότι έχουμε 2 σειρές και 16 στήλες εδώ όπως συζητήσαμε νωρίτερα.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Τώρα, η οθόνη LCD έχει ρυθμιστεί, διαγραφεί και ο δρομέας βρίσκεται στη θέση του. Το επόμενο πράγμα είναι να εκτυπώσετε κάτι στην οθόνη. Μπορούμε να χρησιμοποιήσουμε το LCD_Print_String ("Sample String") για να εκτυπώσουμε μια συμβολοσειρά σε LCD και LCD_Print_Char (a) για να εκτυπώσουμε μια τιμή χαρακτήρα στην LCD. Στο πρόγραμμά μας εδώ έχουμε εκτυπώσει το "STM8S103F3P3 LCD" και δημιουργήσαμε μια καθυστέρηση 5 δευτερολέπτων χρησιμοποιώντας τον παρακάτω κώδικα.
Lcd_Print_String ("STM8S103F3P3 LCD"); καθυστέρηση_ms (5000);
Μετά την καθυστέρηση των 5 δευτερολέπτων, διαγράφουμε ξανά την οθόνη LCD και εμφανίζεται η ένδειξη "Circuit Digest" στην πρώτη σειρά και "Δοκιμή:" I στη δεύτερη σειρά.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Κύκλωμα Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Δοκιμή:");
Στο εσωτερικό του , ενώ βρόχο, θα χωρίσει την τιμή στο ακέραιο μεταβλητής test_var σε επιμέρους χαρακτήρων, έτσι ώστε να μπορεί να εμφανίζεται στην οθόνη LCD με τη χρήση απλών φορέων διαίρεση και μέτρο. Προσθέσαμε επίσης το "0" για να μετατρέψουμε την τιμή ASCII στον χαρακτήρα.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (test_var / 1000) + '0';
Στη συνέχεια, έχουμε ρυθμίσει τον κέρσορα στο (2,6) επειδή έχουμε ήδη γράψει «Δοκιμή:» στη δεύτερη σειρά που είναι 6 χαρακτήρες. Εάν αντικαταστήσουμε, ο υπάρχων χαρακτήρας θα αντικατασταθεί με έναν νέο χαρακτήρα στην οθόνη LCD. Προσθέσαμε επίσης καθυστέρηση 1 δευτερολέπτου και αυξήσαμε τη μεταβλητή
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); καθυστέρηση_ms (1000); test_var ++;
STM8 με LCD - Λειτουργεί
Για να δοκιμάσετε το πρόγραμμά μας, απλώς ανεβάστε τον κωδικό στον ελεγκτή μας και ενεργοποιήστε τον με τη θύρα micro-USB. Λάβετε υπόψη ότι η οθόνη LCD απαιτεί 5V για εργασία, επομένως είναι υποχρεωτική η τροφοδοσία της πλακέτας από τη θύρα USB. Προηγουμένως το τροφοδοτήσαμε απευθείας από το ST-link επειδή δεν χρειαζόμασταν την τροφοδοσία 5V.
Όπως μπορείτε να δείτε, η οθόνη LCD λειτουργεί όπως αναμενόταν με την τιμή της μεταβλητής δοκιμής να αυξάνεται για κάθε δευτερόλεπτο περίπου. Επίσης, σημειώστε ότι δεν έχουμε χρησιμοποιήσει χρονοδιακόπτες και έχουμε χρησιμοποιήσει μόνο τη λειτουργία καθυστέρησης για να δημιουργήσουμε αυτήν την καθυστέρηση, οπότε μην περιμένετε η διάρκεια καθυστέρησης να είναι ακριβής, θα χρησιμοποιήσουμε χρονοδιακόπτες αργότερα σε άλλο σεμινάριο για το σκοπό αυτό.
Η πλήρης εργασία του έργου βρίσκεται στο παρακάτω βίντεο. Ελπίζω να απολαύσατε το σεμινάριο και να μάθετε κάτι χρήσιμο. Εάν έχετε οποιεσδήποτε ερωτήσεις, αφήστε τις στην ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ μας για άλλες τεχνικές ερωτήσεις.