- Ενότητα εμφάνισης 7-τμημάτων και 4-ψηφίων 7-τμημάτων:
- Σύνδεση 4-Digit Seven Segment Module με PIC Microcontroller:
- Προγραμματισμός με χρήση PIC16F877A:
- Ρύθμιση και δοκιμή υλικού:
Αυτό είναι το 8ο σεμινάριό μας για την εκμάθηση μικροελεγκτών PIC χρησιμοποιώντας MPLAB και XC8. Έχουμε φτάσει από την εγκατάσταση MPLABX έως τη χρήση LCD με PIC MCU. Εάν είστε νέοι εδώ, τότε δείτε προηγούμενα μαθήματα όπου μπορείτε να μάθετε χρονοδιακόπτες, LED που αναβοσβήνουν, LCD διασύνδεσης κ.λπ. Στο τελευταίο μας σεμινάριο είδαμε πώς μπορούμε να δημιουργήσουμε προσαρμοσμένους χαρακτήρες με την οθόνη LCD 16 * 2, τώρα ας εξοπλίσουμε τον εαυτό μας με έναν άλλο τύπο ενότητας οθόνης που ονομάζεται οθόνη 7 τμημάτων και το διασυνδέουμε με τον μικροελεγκτή PIC.
Αν και η οθόνη LCD 16x2 είναι πολύ πιο άνετη από την οθόνη 7 τμημάτων, αλλά υπάρχουν λίγα σενάρια όπου μια οθόνη 7 τμημάτων θα ήταν πιο εύχρηστη από την οθόνη LCD. Η LCD πάσχει από το μειονέκτημα του χαμηλού μεγέθους χαρακτήρων και θα είναι υπερβολική για το έργο σας εάν σκοπεύετε απλώς να εμφανίσετε ορισμένες αριθμητικές τιμές. Τα 7 τμήματα έχουν επίσης το πλεονέκτημα έναντι της κακής κατάστασης φωτισμού και μπορούν να προβληθούν από γωνίες καθυστερημένης από μια κανονική οθόνη LCD. Ας αρχίσουμε λοιπόν να το γνωρίζουμε.
Ενότητα εμφάνισης 7-τμημάτων και 4-ψηφίων 7-τμημάτων:
Το 7 Segment Display έχει επτά τμήματα σε αυτό και κάθε τμήμα έχει ένα LED στο εσωτερικό του για να εμφανίσει τους αριθμούς φωτίζοντας τα αντίστοιχα τμήματα. Όπως εάν θέλετε το 7-τμήμα να εμφανίζει τον αριθμό "5", τότε πρέπει να κάνετε λάμψη των τμημάτων a, f, g, c και d κάνοντας τις αντίστοιχες ακίδες τους ψηλές. Υπάρχουν δύο τύποι οθονών 7 τμημάτων: Common Cathode και Common Anode, εδώ χρησιμοποιούμε την επίδειξη Common Cathode επτά τμημάτων. Μάθετε περισσότερα για την προβολή 7 τμημάτων εδώ.
Τώρα ξέρουμε πώς να προβάλλουμε τον επιθυμητό αριθμητικό χαρακτήρα σε μία οθόνη 7 τμημάτων. Όμως, είναι αρκετά προφανές ότι θα χρειαζόμασταν περισσότερες από μία οθόνες 7 τμημάτων για να μεταφέρουμε οποιεσδήποτε πληροφορίες είναι περισσότερες από ένα ψηφία. Έτσι, σε αυτό το σεμινάριο θα χρησιμοποιήσουμε μια τετραψήφια ενότητα 7-τμημάτων όπως φαίνεται παρακάτω.
Όπως μπορούμε να δούμε, υπάρχουν τέσσερις οθόνες επτά τμημάτων συνδεδεμένες μεταξύ τους. Γνωρίζουμε ότι κάθε ενότητα 7 τμημάτων θα έχει 10 καρφίτσες και για 4 επτά οθόνες τμημάτων θα υπάρχουν συνολικά 40 ακίδες και θα ήταν πολύ δύσκολο για οποιονδήποτε να τα κολλήσει σε μια κουκκίδα, οπότε θα συνιστούσα ιδιαίτερα σε κανέναν να αγοράσει μια ενότητα ή δημιουργήστε το δικό σας PCB για τη χρήση μιας 4ψήφιας οθόνης 7 τμημάτων. Η σχηματική σύνδεση για το ίδιο φαίνεται παρακάτω:
Για να κατανοήσουμε πώς λειτουργεί η τετραψήφια ενότητα επτά τμημάτων, πρέπει να εξετάσουμε τα παραπάνω σχήματα, όπως φαίνεται ότι οι ακίδες Α και των τεσσάρων ενδείξεων συνδέονται για να συγκεντρωθούν ως ένα Α και το ίδιο για B, C…. έως DP. Λοιπόν, βασικά εάν ενεργοποιηθεί το Α, τότε και τα τέσσερα Α πρέπει να πάνε ψηλά, σωστά;
Όμως, αυτό δεν συμβαίνει. Έχουμε επιπλέον τέσσερις ακίδες από D0 έως D3 (D0, D1, D2 και D3) που μπορούν να χρησιμοποιηθούν για τον έλεγχο της εμφάνισης από τις τέσσερις που πρέπει να φτάσει ψηλά. Για παράδειγμα: Εάν χρειάζομαι την έξοδο μου να υπάρχει μόνο στη δεύτερη οθόνη, τότε μόνο το D1 πρέπει να είναι ψηλό διατηρώντας ταυτόχρονα τους άλλους ακροδέκτες (D0, D2 και D3) χαμηλούς. Απλά μπορούμε να επιλέξουμε ποια οθόνη πρέπει να είναι ενεργή χρησιμοποιώντας τις ακίδες από D0 έως D3 και ποιος χαρακτήρας θα εμφανίζεται χρησιμοποιώντας τις ακίδες από A έως DP.
Σύνδεση 4-Digit Seven Segment Module με PIC Microcontroller:
Εδώ χρησιμοποιήσαμε τον μικροελεγκτή PIC PIC16F877A και το σχήμα για το κύκλωμα φαίνεται παρακάτω.
Έχουμε 12 ακίδες εξόδου από τη μονάδα από τις οποίες 8 χρησιμοποιούνται για την εμφάνιση των χαρακτήρων και τέσσερις χρησιμοποιούνται για την επιλογή μιας οθόνης από τις τέσσερις. Ως εκ τούτου και οι 8 ακίδες χαρακτήρων αντιστοιχίζονται στο PORTD και οι ακίδες επιλογής οθόνης αντιστοιχίζονται στις τέσσερις πρώτες ακίδες του PORTC.
Σημείωση: Ο πείρος γείωσης της μονάδας πρέπει επίσης να συνδεθεί με τη γείωση του MCU που δεν εμφανίζεται εδώ.
Προγραμματισμός με χρήση PIC16F877A:
Τώρα, που ξέρουμε πώς λειτουργεί αυτή η ενότητα, ας μάθουμε πώς να προγραμματίσουμε το PIC16F877A για να εμφανιστεί ένας τετραψήφιος αριθμός. Ας αυξήσουμε μια μεταβλητή από 0 έως 1000 και να την εκτυπώσουμε στην οθόνη 7 τμημάτων. Ξεκινήστε το πρόγραμμα MPLABX και δημιουργήστε ένα νέο έργο, ας ξεκινήσουμε με τα bit διαμόρφωσης.
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT απενεργοποιημένο) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (το RB3 είναι ψηφιακό I / O, HV on Το MCLR πρέπει να χρησιμοποιηθεί για προγραμματισμό) #pragma config CPD = OFF // Δεδομένα EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bit (Απενεργοποίηση εγγραφής; όλη η μνήμη προγράμματος μπορεί να γραφτεί από τον έλεγχο EECON) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
Ως συνήθως, χρησιμοποιούμε το παράθυρο ρυθμίσεων bit ρύθμισης για να ορίσουμε αυτά τα bit. Εάν δεν είστε σίγουροι τι σημαίνουν, επισκεφθείτε τον οδηγό LED που αναβοσβήνει εδώ.
Στη συνέχεια, ας καθορίσουμε τις ακίδες εξόδου για εναλλαγή μεταξύ κάθε ψηφίου της οθόνης.
// *** Ορίστε τις ακίδες σήματος και των τεσσάρων οθονών *** // # ορίστε s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Τέλος ορισμού ** ////
Εδώ οι ακίδες RC0, RC1, RC2 και RC3 χρησιμοποιούνται για την επιλογή μεταξύ των τεσσάρων ψηφίων της μονάδας οθόνης 7 τμημάτων. Αυτές οι ακίδες ορίζονται ως s1, s2, s3 και s4 αντίστοιχα.
Στη συνέχεια, ας πηδήσουμε στο κενό (), μέσα στο οποίο έχουμε την ακόλουθη μεταβλητή δήλωση:
int i = 0; // η τετραψήφια τιμή που πρέπει να εμφανίζεται int flag = 0; // για δημιουργία καθυστέρησης χωρίς υπογραφή int a, b, c, d, e, f, g, h; // απλώς μεταβλητές χωρίς υπογραφή int seg = {0X3F, // Hex value to display the number 0 0X06, // Hex value to display the number 1 0X5B, // Hex value to display the number 2 0X4F, // Hex value to display τον αριθμό 3 0X66, // Hex τιμή για να εμφανιστεί ο αριθμός 4 0X6D, // Hex τιμή για να εμφανιστεί ο αριθμός 5 0X7C, // Hex τιμή για να εμφανιστεί ο αριθμός 6 0X07, // Hex τιμή για να εμφανιστεί ο αριθμός 7 0X7F, / / Hex τιμή για να εμφανιστεί ο αριθμός 8 0X6F // Hex τιμή για να εμφανιστεί ο αριθμός 9}; // End of Array για εμφάνιση αριθμών από 0 έως 9
Εδώ οι μεταβλητές i και flag χρησιμοποιούνται για την αποθήκευση των τιμών που θα εμφανίζονται και τη δημιουργία καθυστέρησης αντίστοιχα. Οι μη υπογεγραμμένες ακέραιες μεταβλητές a έως h χρησιμοποιούνται για να χωρίσουν τους τετραψήφους αριθμούς σε μονοψήφια και να τους αποθηκεύσουν (που θα εξηγηθούν αργότερα εδώ)
Ένα βασικό πράγμα που πρέπει να σημειωθεί εδώ είναι η δήλωση πίνακα "seg" Σε αυτό το πρόγραμμα χρησιμοποιούμε έναν νέο τύπο δεδομένων που ονομάζεται Array. Το Array δεν είναι παρά μια συλλογή παρόμοιων τιμών τύπου δεδομένων. Εδώ, χρησιμοποιήσαμε αυτόν τον πίνακα για να αποθηκεύσουμε όλες τις ισοδύναμες δεκαεξαδικές τιμές για την εμφάνιση ενός αριθμού από 0 έως 9.
Η διεύθυνση του πίνακα ξεκινά πάντα από το μηδέν. Έτσι, αυτός ο πίνακας θα έχει τη δεκαεξαδική τιμή ενός αριθμητικού αριθμού (0-9) αποθηκευμένη στη διεύθυνση που είναι ίδια με εκείνη του αριθμού όπως φαίνεται παρακάτω
Μεταβλητός: |
τμημα |
τμημα |
τμημα |
τμημα |
τμημα |
τμημα |
τμημα |
τμημα |
τμημα |
τμημα |
Hex Κωδικός: |
0Χ3F |
0Χ06 |
0Χ5Β |
0Χ4F |
0Χ66 |
0Χ6Δ |
0Χ7C |
0Χ07 |
0Χ7F |
0Χ6F |
Εξ. Αριθμητικός αριθμός: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Έτσι απλά, εάν θέλετε να εμφανίσετε τον αριθμό 0 στο 7 τμήμα σας, μπορείτε να καλέσετε seg, όπως επίσης και αν θέλετε να εμφανίσετε τον αριθμό 6, απλά πρέπει να χρησιμοποιήσετε το seg.
Για να κατανοήσουμε πώς αποκτήθηκε πραγματικά η τιμή HEX ας ρίξουμε μια ματιά στον παρακάτω πίνακα. Η ισοδύναμη τιμή HEX για κάθε δεκαδικό αριθμό αποθηκεύεται στον πίνακα έτσι ώστε να μπορεί να κληθεί να εμφανίσει έναν συγκεκριμένο αριθμό.
Τώρα, ας προχωρήσουμε στο επόμενο μέρος του κώδικα που είναι η διαμόρφωση I / O:
// ***** Διαμόρφωση I / O **** // TRISC = 0X00; PORTC = 0Χ00; TRISD = 0x00; PORTD = 0Χ00; // *** Λήξη διαμόρφωσης I / O ** ///
Η διαμόρφωση I / O είναι απλή, επειδή όλες οι καρφίτσες στο τμήμα 7 είναι ακίδες εξόδου και οι συνδέσεις εμφανίζονται στο παραπάνω διάγραμμα κυκλώματος, οπότε απλώς δηλώστε τις ως εξόδους και αρχικοποιήστε τις στο μηδέν.
Τώρα ας πηδήσουμε στον άπειρο βρόχο μας (ενώ (1)). Εδώ πρέπει να χωρίσουμε την τιμή του "i" σε τέσσερα ψηφία και να τα εμφανίσουμε στο 7-τμήμα. Αρχικά ας ξεκινήσουμε χωρίζοντας την τιμή στο "i"
// *** Διαχωρίζοντας το "i" σε τέσσερα ψηφία *** // a = i% 10; // Το 4ο ψηφίο αποθηκεύεται εδώ b = i / 10; c = b% 10; // Το 3ο ψηφίο αποθηκεύεται εδώ d = b / 10; e = d% 10; // Το 2ο ψηφίο αποθηκεύεται εδώ f = d / 10; g = f% 10; // Το 1ο ψηφίο αποθηκεύεται εδώ h = f / 10; // *** Τέλος της διάσπασης *** //
Χρησιμοποιώντας απλό συντελεστή και λειτουργία διαίρεσης, ο τετραψήφιος αριθμός (i) χωρίζεται σε μεμονωμένους αριθμούς. Στην περίπτωσή μας ας πάρουμε ένα παράδειγμα όπου η τιμή του "i" είναι 4578. Στη συνέχεια, στο τέλος αυτής της διαδικασίας η μεταβλητή g = 4, e = 5, c = 7 και a = 8. Τώρα θα είναι εύκολο να εμφανίζετε κάθε ψηφίο χρησιμοποιώντας απλώς αυτήν τη μεταβλητή.
PORTD = seg; s1 = 1; // ΕΝΕΡΓΟΠΟΙΗΣΗ την οθόνη 1 και εκτύπωση 4ου ψηφίου __delay_ms (5); s1 = 0; // Απενεργοποιήστε την οθόνη 1 μετά από καθυστέρηση 5 ms PORTD = seg; s2 = 1; // ΕΝΕΡΓΟΠΟΙΗΣΤΕ την οθόνη 2 και εκτυπώστε 3ο ψηφίο __delay_ms (5); s2 = 0; // Απενεργοποιήστε την οθόνη 2 μετά από καθυστέρηση 5 ms PORTD = seg; s3 = 1; // ΕΝΕΡΓΟΠΟΙΗΣΤΕ την οθόνη 3 και εκτυπώστε το 2ο ψηφίο __delay_ms (5); s3 = 0; // Απενεργοποιήστε την οθόνη 3 μετά από καθυστέρηση 5 ms PORTD = seg; s4 = 1; // ΕΝΕΡΓΟΠΟΙΗΣΤΕ την οθόνη 4 και εκτυπώστε το 1ο ψηφίο __delay_ms (5); s4 = 0; // Απενεργοποιήστε την οθόνη 4 μετά από καθυστέρηση 5ms
Αυτό είναι το πραγματικό μέρος όπου το MCU μιλά με το 7-τμήμα. Όπως γνωρίζουμε, μπορούμε να εμφανίσουμε μόνο ένα ψηφίο κάθε φορά, αλλά έχουμε τέσσερα ψηφία που πρέπει να εμφανίζονται και μόνο αν και τα τέσσερα ψηφία βρίσκονται στο πλήρες τετραψήφιο αριθμό θα είναι ορατός για τον χρήστη.
Λοιπόν, πώς πηγαίνουμε με αυτό;
Τυχερός για εμάς το MCU μας είναι πολύ πιο γρήγορο από ένα ανθρώπινο μάτι, οπότε αυτό που πραγματικά κάνουμε: εμφανίζουμε ένα ψηφίο τη φορά, αλλά το κάνουμε πολύ γρήγορα όπως φαίνεται παραπάνω.
Επιλέγουμε μια οθόνη ψηφίων που περιμένει 5ms, έτσι ώστε το MCU και το 7-τμήμα να μπορούν να το επεξεργαστούν και στη συνέχεια να απενεργοποιήσουν αυτό το ψηφίο και να προχωρήσουμε στο επόμενο ψηφίο και να κάνουμε το ίδιο μέχρι να φτάσουμε στο τελευταίο ψηφίο. Αυτή η καθυστέρηση των 5ms δεν μπορεί να παρατηρηθεί από ανθρώπινο μάτι και και τα τέσσερα ψηφία φαίνονται να είναι ταυτόχρονα ενεργοποιημένα.
Δηλαδή, τελικά αυξάνουμε την τιμή του ψηφίου που εμφανίζεται χρησιμοποιώντας μια καθυστέρηση όπως φαίνεται παρακάτω
if (flag> = 100) // περιμένετε έως ότου η σημαία φτάσει τα 100 {i ++; flag = 0; // μόνο αν η σημαία είναι εκατό "i" θα αυξηθεί} flag ++; // σημαία αύξησης για κάθε φλας
Η καθυστέρηση χρησιμοποιείται έτσι ώστε ο χρόνος που απαιτείται για την αλλαγή από έναν αριθμό σε έναν άλλο να είναι αρκετός για να παρατηρήσουμε την αλλαγή.
Ο πλήρης κωδικός δίνεται παρακάτω και η διαδικασία εξηγείται επίσης στο βίντεο στο τέλος.
Ρύθμιση και δοκιμή υλικού:
Όπως πάντα, ας προσομοιώσουμε το πρόγραμμα χρησιμοποιώντας το Proteus πριν πάμε πραγματικά με το υλικό μας. Εάν η προσομοίωση είναι επιτυχής, θα πρέπει να δείτε κάτι τέτοιο
Αυτό το έργο δεν έχει καμία περίπλοκη ρύθμιση υλικού, χρησιμοποιούμε ξανά την ίδια πλακέτα PIC Microcontroller που δημιουργήσαμε στο LED αναβοσβήνει Tutorial. Απλά συνδέστε τη μονάδα 7 τμημάτων με την πλακέτα μικροελεγκτή PIC σύμφωνα με το διάγραμμα σύνδεσης. Μόλις τελειώσετε με τις συνδέσεις, απλώς απορρίψτε τον κωδικό χρησιμοποιώντας τον προγραμματιστή σας PicKit 3 και αυτό απολαμβάνει την παραγωγή σας.