Στο μάθημα, θα μάθουμε για τα σχήματα σύνδεσης ενδείξεων LED επτά τμημάτων σε μικροελεγκτές, σχετικά με τον τρόπο ελέγχου των ενδείξεων.

Οι ενδείξεις επτά τμημάτων LED παραμένουν ένα από τα πιο δημοφιλή στοιχεία για την εμφάνιση ψηφιακών πληροφοριών.

Αυτό διευκολύνεται από τις ακόλουθες ιδιότητες.

  • Χαμηλή τιμή. Δεν υπάρχει τίποτα φθηνότερο στα μέσα ένδειξης από τις ψηφιακές ενδείξεις LED.
  • Ποικιλία μεγεθών. Οι μικρότερες και μεγαλύτερες ενδείξεις είναι LED. Γνωρίζω ενδείξεις LED με ύψος ψηφίου από 2,5 mm έως 32 cm.
  • Λάμψη στο σκοτάδι. Σε ορισμένες εφαρμογές, αυτή η ιδιότητα είναι σχεδόν καθοριστική.
  • Έχουν διαφορετικά χρώματα φωτός. Υπάρχουν ακόμη και δύο χρώματα.
  • Αρκετά χαμηλά ρεύματα ελέγχου. Οι σύγχρονες ενδείξεις LED μπορούν να συνδεθούν στις εξόδους των μικροελεγκτών χωρίς πρόσθετα πλήκτρα.
  • Επιτρέπουν σκληρές συνθήκες λειτουργίας (εύρος θερμοκρασίας, υψηλή υγρασία, κραδασμούς, επιθετικά περιβάλλοντα κ.λπ.). Όσον αφορά αυτήν την ποιότητα, οι ενδείξεις LED δεν έχουν ίσο με άλλους τύπους στοιχείων οθόνης.
  • Απεριόριστη διάρκεια ζωής.

Τύποι ενδείξεων LED.

Η ένδειξη LED επτά τμημάτων εμφανίζει τον χαρακτήρα χρησιμοποιώντας επτά τμήματα LED του ψηφίου. Το όγδοο LED ανάβει την υποδιαστολή. Υπάρχουν λοιπόν 8 τμήματα σε έναν δείκτη επτά τμημάτων.

Τα τμήματα χαρακτηρίζονται με λατινικά γράμματα από "A" έως "H".

Οι άνοδοι ή οι κάθοδοι κάθε LED συνδυάζονται στον δείκτη και σχηματίζουν ένα κοινό καλώδιο. Επομένως, υπάρχουν δείκτες με κοινή άνοδο και κοινή κάθοδο.

Ένδειξη LED με κοινή άνοδο.

Ένδειξη LED κοινής καθόδου.

Στατικός έλεγχος LED.

Είναι απαραίτητο να συνδέσετε ενδείξεις LED στον μικροελεγκτή μέσω αντιστάσεων που περιορίζουν το ρεύμα.

Ο υπολογισμός της αντίστασης είναι ο ίδιος όπως για μεμονωμένα LED.

R = (παροχή U - τμήμα U) / τμήμα I

Για αυτό το κύκλωμα: Τμήμα I = (5 - 1,5) / 1000 = 3,5 mA

Οι σύγχρονες ενδείξεις LED ανάβουν αρκετά έντονα ήδη με ρεύμα 1 mA. Για ένα κύκλωμα με κοινή άνοδο, θα ανάψουν τμήματα, στις εξόδους ελέγχου των οποίων ο μικροελεγκτής θα δημιουργήσει χαμηλή στάθμη.

Στο διάγραμμα σύνδεσης του δείκτη με κοινή κάθοδο, αλλάζει η πολικότητα των σημάτων τροφοδοσίας και ελέγχου.

Το τμήμα θα ανάψει, στην έξοδο ελέγχου του οποίου θα σχηματιστεί υψηλό επίπεδο(5 V).

Λειτουργία ελέγχου πολλαπλών LED.

Για να συνδέσετε το καθένα δείκτης επτά τμημάτωναπαιτούνται οκτώ ακίδες στον μικροελεγκτή. Εάν υπάρχουν 3 - 4 δείκτες (ψηφία), τότε η εργασία γίνεται πρακτικά αδύνατη. Απλώς δεν υπάρχουν αρκετές ακίδες μικροελεγκτή. Σε αυτήν την περίπτωση, οι ενδείξεις μπορούν να συνδεθούν σε λειτουργία πολυπλεξίας, σε λειτουργία δυναμικής ένδειξης.

Τα συμπεράσματα των τμημάτων με το ίδιο όνομα κάθε δείκτη συνδυάζονται. Αποδεικνύεται μια μήτρα LED που συνδέονται μεταξύ των εξόδων των τμημάτων και των κοινών εξόδων των ενδείξεων. Εδώ είναι ένα κύκλωμα πολυπλεξίας ελέγχου τριψήφιου δείκτη με κοινή άνοδο.

Για τη σύνδεση τριών ενδείξεων, χρειάστηκαν 11 ακίδες και όχι 24, όπως στη λειτουργία στατικού ελέγχου.

Με δυναμική ένδειξη, ανάβει μόνο ένα ψηφίο κάθε φορά. Ένα σήμα υψηλού επιπέδου (5 V) εφαρμόζεται στην κοινή έξοδο ενός από τα bit και σήματα χαμηλού επιπέδου αποστέλλονται στις εξόδους του τμήματος για εκείνα τα τμήματα που θα πρέπει να ανάβουν σε αυτό το bit. Μετά από ένα ορισμένο χρονικό διάστημα, η επόμενη εκκένωση αναφλέγεται. Εφαρμόζεται υψηλό επίπεδο στην κοινή του έξοδο και τα σήματα κατάστασης για αυτό το bit αποστέλλονται στις εξόδους τμήματος. Και έτσι για όλα τα bit σε έναν άπειρο βρόχο. Ο χρόνος κύκλου ονομάζεται χρόνος ανανέωσης του δείκτη. Εάν ο χρόνος αναγέννησης είναι αρκετά μικρός, τότε το ανθρώπινο μάτι δεν θα παρατηρήσει την αλλαγή των εκκενώσεων. Θα φαίνεται ότι όλες οι εκκενώσεις λάμπουν συνεχώς. Για να αποφευχθεί το τρεμόπαιγμα των δεικτών, θεωρείται ότι η συχνότητα του κύκλου αναγέννησης πρέπει να είναι τουλάχιστον 70 Hz. Προσπαθώ να χρησιμοποιήσω τουλάχιστον 100Hz.

Το κύκλωμα δυναμικής ένδειξης για LED με κοινή κάθοδο μοιάζει με αυτό.

Η πολικότητα όλων των σημάτων αντιστρέφεται. Τώρα εφαρμόζεται χαμηλή στάθμη στο κοινό καλώδιο της ενεργής εκκένωσης και υψηλή στάθμη εφαρμόζεται στα τμήματα που πρέπει να λάμπουν.

Υπολογισμός στοιχείων δυναμικής ένδειξης δεικτών διόδων εκπομπής φωτός (LED).

Ο υπολογισμός είναι κάπως πιο περίπλοκος από ό,τι για τη στατική λειτουργία. Κατά τον υπολογισμό, είναι απαραίτητο να προσδιορίσετε:

  • μέσο ρεύμα τμημάτων.
  • τμήματα παλμικού ρεύματος.
  • αντίσταση αντίστασης τμήματος.
  • παλμικό ρεύμα των κοινών συμπερασμάτων των εκκενώσεων.

Επειδή τα ψηφία της ένδειξης ανάβουν με τη σειρά τους και, στη συνέχεια, η φωτεινότητα της λάμψης καθορίζει το μέσο ρεύμα. Πρέπει να το επιλέξουμε με βάση τις παραμέτρους του δείκτη και την απαιτούμενη φωτεινότητα. Το μέσο ρεύμα θα καθορίσει τη φωτεινότητα του δείκτη σε επίπεδο που αντιστοιχεί σε στατικό έλεγχο με το ίδιο σταθερό ρεύμα.

Ας επιλέξουμε ένα μέσο ρεύμα τμήματος 1 mA.

Τώρα ας υπολογίσουμε το παλμικό ρεύμα του τμήματος. Για να παρέχεται το απαιτούμενο μέσο ρεύμα, το παλμικό ρεύμα πρέπει να είναι N φορές μεγαλύτερο. Όπου N είναι ο αριθμός των ενδεικτικών ψηφίων.

σεγμ. διαβολάκι. = σεγμ. μέσος όρος * Ν

Για το σχέδιό μας segm. διαβολάκι. = 1 * 3 = 3 mA.

Υπολογίζουμε την αντίσταση των αντιστάσεων που περιορίζουν το ρεύμα.

R \u003d (U power - U segment) / I τμήμα. διαβολάκι.

R \u003d (5 - 1,5) / 0,003 \u003d 1166 ohms

Καθορίζουμε τα ρεύματα παλμών των κοινών συμπερασμάτων των εκκενώσεων. Ταυτόχρονα, 8 τμήματα μπορούν να λάμπουν, πράγμα που σημαίνει ότι το ρεύμα παλμού ενός τμήματος πρέπει να πολλαπλασιαστεί επί 8.

I κατηγορίας imp. = σεγμ. διαβολάκι. * οκτώ

Για το πρόγραμμά μας απαλλάσσω το imp. = 3 * 8 = 24 mA.

  • η αντίσταση των αντιστάσεων επιλέγεται 1,1 kOhm.
  • οι έξοδοι του μικροελεγκτή ελέγχου τμήματος πρέπει να παρέχουν ρεύμα τουλάχιστον 3 mA.
  • οι έξοδοι του μικροελεγκτή για την επιλογή του ενδεικτικού ψηφίου πρέπει να παρέχουν ρεύμα τουλάχιστον 24 mA.

Με τέτοιες τιμές ρεύματος, η ένδειξη μπορεί να συνδεθεί απευθείας στους ακροδέκτες της πλακέτας Arduino, χωρίς τη χρήση πρόσθετων πλήκτρων. Για φωτεινούς δείκτες, τέτοια ρεύματα είναι αρκετά.

Σχέδια με πρόσθετα κλειδιά.

Εάν οι ενδείξεις απαιτούν περισσότερο ρεύμα, τότε πρέπει να χρησιμοποιηθούν πρόσθετοι διακόπτες, ειδικά για σήματα επιλογής ψηφίων. Το συνολικό ρεύμα εκφόρτισης είναι 8 φορές το ρεύμα ενός τμήματος.

Διάγραμμα καλωδίωσης για ένδειξη LED με κοινή άνοδο σε λειτουργία πολυπλεξίας με διακόπτες τρανζίστορ για επιλογή ψηφίων.

Για να επιλέξετε ένα bit σε αυτό το κύκλωμα, είναι απαραίτητο να δημιουργήσετε ένα σήμα χαμηλής στάθμης. Το αντίστοιχο κλειδί θα ανοίξει και θα τροφοδοτήσει την εκφόρτιση του δείκτη.

Διάγραμμα καλωδίωσης για ένδειξη LED με κοινή κάθοδο σε λειτουργία πολυπλεξίας με διακόπτες τρανζίστορ για επιλογή ψηφίων.

Για να επιλέξετε ένα bit σε αυτό το κύκλωμα, είναι απαραίτητο να δημιουργήσετε ένα σήμα υψηλού επιπέδου. Ο αντίστοιχος διακόπτης θα ανοίξει και θα κλείσει την κοινή έξοδο της εκφόρτισης προς τη γείωση.

Μπορεί να υπάρχουν κυκλώματα στα οποία είναι απαραίτητο να χρησιμοποιηθούν διακόπτες τρανζίστορ τόσο για τα τμήματα όσο και για τα κοινά καλώδια εκφόρτισης. Τέτοια σχήματα συντίθενται εύκολα από τα δύο προηγούμενα. Όλα τα κυκλώματα που φαίνονται χρησιμοποιούνται όταν η ένδειξη τροφοδοτείται από τάση ίση με αυτή του μικροελεγκτή.

Κλειδιά για ενδείξεις με αυξημένη τάση τροφοδοσίας.

Υπάρχουν δείκτες μεγάλων μεγεθών, στους οποίους κάθε τμήμα αποτελείται από πολλά LED συνδεδεμένα σε σειρά. Για την τροφοδοσία τέτοιων ενδείξεων, απαιτείται μια πηγή με τάση μεγαλύτερη από 5 V. Οι διακόπτες πρέπει να παρέχουν μεταγωγή υψηλής τάσης ελεγχόμενη από σήματα στάθμης μικροελεγκτή (συνήθως 5 V).

Το κύκλωμα των πλήκτρων που κλείνουν τα σήματα ένδειξης στο έδαφος παραμένει αμετάβλητο. Και τα πλήκτρα λειτουργίας θα πρέπει να κατασκευαστούν σύμφωνα με ένα διαφορετικό σχήμα, για παράδειγμα, αυτό.

Σε αυτό το σχήμα, η ενεργή εκφόρτιση επιλέγεται από το υψηλό επίπεδο του σήματος ελέγχου.

Μεταξύ της εναλλαγής των δυαδικών ψηφίων ένδειξης για μικρό χρονικό διάστημα (1-5 µs), όλα τα τμήματα θα πρέπει να απενεργοποιούνται. Αυτός ο χρόνος είναι απαραίτητος για την ολοκλήρωση των μεταβατικών διαδικασιών εναλλαγής κλειδιών.

Δομικά, τα συμπεράσματα των εκκενώσεων μπορούν να συνδυαστούν όπως σε μια περίπτωση πολυψήφιου δείκτη ή ένας πολυψήφιος δείκτης μπορεί να συναρμολογηθεί από ξεχωριστούς μονοψήφιους. Επιπλέον, μπορείτε να συναρμολογήσετε μια ένδειξη από μεμονωμένα LED συνδυασμένα σε τμήματα. Αυτό γίνεται συνήθως όταν είναι απαραίτητο να συναρμολογηθεί ένας δείκτης πολύ μεγάλων διαστάσεων. Όλα τα παραπάνω σχήματα θα ισχύουν για τέτοιες επιλογές.

Στο επόμενο μάθημα, θα συνδέσουμε μια ένδειξη LED επτά τμημάτων στην πλακέτα Arduino, θα γράψουμε μια βιβλιοθήκη για να την ελέγξουμε.

Κατηγορία: . Μπορείτε να προσθέσετε σελιδοδείκτη.

Μερικές φορές απαιτείται η σύνδεση πολλών ενδείξεων επτά τμημάτων ή μιας μήτρας LED στον μικροελεγκτή, ενώ η δυναμική ένδειξη χρησιμοποιείται για την εμφάνιση πληροφοριών. Η ουσία της δυναμικής ένδειξης είναι η διαδοχική εμφάνιση πληροφοριών στους δείκτες. Το παρακάτω διάγραμμα δείχνει ένα παράδειγμα σύνδεσης πολλών δεικτών επτά τμημάτων (για παράδειγμα, με μια κοινή κάθοδο) για την υλοποίηση μιας δυναμικής ένδειξης, γενικά, λαμβάνοντας υπόψη το σημείο, λαμβάνονται 8 τμήματα, αλλά με τον παλιό τρόπο ονομάζεται έτσι. Όλα τα συμπεράσματα (άνοδοι) των τμημάτων με το ίδιο όνομα συνδέονται μεταξύ τους, για συνολικά 8 γραμμές που συνδέονται με τον μικροελεγκτή μέσω αντιστάσεων. Η κοινή κάθοδος κάθε δείκτη συνδέεται με τον μικροελεγκτή μέσω ενός τρανζίστορ.


Ο αλγόριθμος ένδειξης είναι ο εξής: πρώτον, ορίζουμε τα απαιτούμενα λογικά επίπεδα στις γραμμές, ανάλογα με το ποια τμήματα πρέπει να είναι ενεργοποιημένα στην πρώτη ένδειξη (ένδειξη από αριστερά προς τα δεξιά), με υψηλό λογικό επίπεδο για ενεργοποίηση, χαμηλό έως απενεργοποιήστε το τμήμα. Στη συνέχεια, εφαρμόζουμε ένα υψηλό λογικό επίπεδο στη βάση του τρανζίστορ VT1, επομένως η κοινή κάθοδος του πρώτου δείκτη συνδέεται με το κοινό καλώδιο, αυτή τη στιγμή ανάβουν αυτά τα τμήματα, στις ανόδους των οποίων υπάρχει μια λογική μονάδα. Μετά από ένα ορισμένο χρονικό διάστημα (παύση), σβήνουμε τον δείκτη εφαρμόζοντας ένα χαμηλό λογικό επίπεδο στη βάση του τρανζίστορ, μετά αλλάζουμε ξανά τα λογικά επίπεδα στις γραμμές σύμφωνα με τις πληροφορίες εξόδου που προορίζονται για τον δεύτερο δείκτη και στέλνουμε ένα σήμα ενεργοποίησης στο τρανζίστορ VT2. Έτσι, σε έναν κυκλικό κύκλο, αλλάζουμε όλους τους δείκτες, αυτή είναι η όλη δυναμική ένδειξη.

Για να έχετε μια συμπαγή εικόνα χωρίς να τρεμοπαίζει, η εναλλαγή πρέπει να γίνεται με υψηλή ταχύτητα, για να αποφευχθεί το τρεμόπαιγμα των LED, ο ρυθμός ανανέωσης πρέπει να ρυθμιστεί από 70 Hz ή περισσότερο, συνήθως το ρυθμίζω στα 100 Hz. Για την παραπάνω κατασκευή, η παύση υπολογίζεται ως εξής: για συχνότητα 100 Hz, η περίοδος είναι 10 ms, υπάρχουν μόνο 4 δείκτες, αντίστοιχα, ο χρόνος λάμψης κάθε δείκτη ορίζεται στα 10/4 = 2,5 ms. Υπάρχουν πολυψήφιοι δείκτες επτά τμημάτων σε ένα περίβλημα, στο οποίο τα τμήματα με το ίδιο όνομα συνδέονται μέσα στο ίδιο το περίβλημα, φυσικά, για να τα χρησιμοποιήσετε, είναι απαραίτητο να χρησιμοποιήσετε δυναμική ένδειξη.

Για την εφαρμογή δυναμικής ένδειξης, είναι απαραίτητο να χρησιμοποιηθούν διακοπές σε υπερχείλιση ενός από τους χρονοδιακόπτες. Παρακάτω είναι ο κωδικός που χρησιμοποιεί το χρονόμετρο TMR0:

;Εφαρμογή δυναμικής ένδειξης για 4 δείκτες επτά τμημάτων ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; bcf ind1 ;σβήστε την 1η ένδειξη bcf ind2 ;σβήστε την 2η ένδειξη bcf ind3 ;σβήστε την 3η ένδειξη bcf ind4 ;σβήστε την 4η ένδειξη. incf shet,F ;increment register shet movlw .5 ;έλεγχος περιεχομένων μητρώου φύλλο xorwf shet,W ;ελέγξτε αν είναι ίσο με 5 btfss STATUS,Z ; goto met1 ;ο αριθμός στον καταχωρητή φύλλων δεν είναι ίσος με 5 movlw .1 ;ο αριθμός στον καταχωρητή φύλλων είναι 5: γράψτε τον αριθμό 1 φύλλο movwf ;στο μητρώο φύλλων ; met1 movlw .1, ελέγξτε το φύλλο περιεχομένων του μητρώου xorwf φύλλο, W ; ίσο με τον αριθμό 1 btfss STATUS,Z ; goto met2 ;ο αριθμός στον καταχωρητή φύλλου δεν είναι ίσος με 1: μετάβαση στο met2 movf datind1,W ;ο αριθμός στον καταχωρητή φύλλου είναι ίσος με 1: αντιγράψτε το movwf PORTB ;περιεχόμενα του καταχωρητή datind1 στον καταχωρητή PORTB bsf ind1 ;ενεργοποιήστε τον 1ο δείκτη met2 movlw .2 ;ελέγξτε τα περιεχόμενα του φύλλου καταχωρητή φύλλο xorwf,W , ίσο με 2 btfss STATUS,Z ; goto met3 ;ο αριθμός στον καταχωρητή φύλλου δεν είναι ίσος με 2: μετάβαση στο met3 movf datind2, W ;ο αριθμός στον καταχωρητή φύλλων είναι 2: αντιγράψτε το movwf PORTB ;περιεχόμενα του καταχωρητή datind2 στον καταχωρητή PORTB bsf ind2 ;ενεργοποιήστε τη 2η ένδειξη goto exit ;μεταπήδηση σε label exit met3 movlw .3, ελέγξτε το φύλλο περιεχομένων του μητρώου xorwf shet,W , ίσο με 3 btfss STATUS,Z ; goto met4 ;ο αριθμός στον καταχωρητή φύλλων δεν είναι ίσος με 3: μετάβαση στο met4 movf datind3, W ;ο αριθμός στον καταχωρητή φύλλων είναι 3: αντιγράψτε το movwf PORTB ;περιεχόμενα του καταχωρητή datind3 στον καταχωρητή PORTB bsf ind3 ;ενεργοποιήστε την 3η ένδειξη goto exit ;μεταπήδηση σε label exit met4 movf datind4,W ;αντιγράψτε τα περιεχόμενα του καταχωρητή datind3 movwf PORTB ;στον καταχωρητή PORTB bsf ind4 ;ενεργοποιήστε την 4η ένδειξη. movlw .100 ;γράψτε 156 στον καταχωρητή χρονοδιακόπτη TMR0 movwf TMR0 ; ; movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Κύριο πρόγραμμα ................. movlw b"11010011" ; OPTION_REG, ρυθμίζοντας έτσι το εσωτερικό , ρυθμίζοντας την αναλογία prescaler 1:16 ; Φύλλο clrf, επαναφορά φύλλου καταχωρητή, πριν από την εκκίνηση, διακοπές κατά την υπερχείλιση TMR0, που πραγματοποιήθηκε. clrf datind1 ;εκκαθάριση καταχωρητών για την έξοδο πληροφοριών σε clrf datind2 ;δείκτες, ισοδυναμεί με την απενεργοποίηση clrf datind3 ;δείκτες, ως δείκτες με κοινό clrf datind4 ;κάθοδο. bcf INTCON,T0IF , διαγραφή διακοπής υπερχείλισης TMR0 σημαία bsf INTCON,T0IE , ενεργοποίηση διακοπών υπερχείλισης TMR0 bsf INTCON,GIE , ενεργοποίηση καθολικών διακοπών. movlw b"00000110"; 13.52 παράδειγμα εξόδου movwf datind1; movlw b"11001111" ; movwf με ημερομηνία2 ; movlw b"01101101" ; movwf με ημερομηνία 3 ; movlwb"01011011" ; movwf με ημερομηνία 4 ; ; . ................; .................; .................; ; τέλος, τέλος όλου του προγράμματος.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Εφαρμογή δυναμικής ένδειξης για 4 δείκτες επτά τμημάτων

;Παράδειγμα συχνότητας ρολογιού 4 MHz, κύκλος μηχανής 1 μs

org 0000h ;ξεκινήστε την εκτέλεση του προγράμματος στη διεύθυνση 0000h

goto Start ;μεταβείτε στην ετικέτα Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Διακοπή ρουτίνας

org 0004h ;έναρξη εκτέλεσης υπορουτίνας στη διεύθυνση 0004h

movwf W_TEMP ;αποθηκεύστε τις τιμές καταχωρητή κλειδιών

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;σβήστε την 1η ένδειξη

bcf ind2 ;σβήστε τη 2η ένδειξη

bcf ind3 ;σβήστε την 3η ένδειξη

bcf ind4 ;σβήστε την 4η ένδειξη

incf shet,F ;increment record shet

movlw .5, ελέγξτε τα περιεχόμενα του φύλλου μητρώου

φύλλο xorwf, W , ίσο με 5

btfss STATUS,Z ;

goto met1 ;ο αριθμός στο φύλλο μητρώου δεν είναι ίσος με 5

movlw .1 ;ο αριθμός στον καταχωρητή φύλλων είναι 5: γράψτε τον αριθμό 1

movwf shet ;για να καταχωρήσω φύλλο

met1 movlw .1, ελέγξτε τα περιεχόμενα του μητρώου φύλλων

φύλλο xorwf, W , ίσο με τον αριθμό 1

btfss STATUS,Z ;

goto met2 ;ο αριθμός στον καταχωρητή φύλλων δεν είναι ίσος με 1: μετάβαση στο met2

movf datind1,W ;ο αριθμός στο μητρώο φύλλων είναι 1: αντίγραφο

movwf PORTB, τα περιεχόμενα του datind1 καταχωρούνται στον καταχωρητή PORTB

bsf ind1 ;ενεργοποιήστε την 1η ένδειξη

goto exit ;μετάβαση στην ετικέτα exit

met2 movlw .2, ελέγξτε τα περιεχόμενα του μητρώου φύλλων

φύλλο xorwf, W , ίσο με τον αριθμό 2

btfss STATUS,Z ;

goto met3 ;ο αριθμός στον καταχωρητή φύλλων δεν είναι ίσος με 2: μετάβαση στο met3

movf datind2,W ;ο αριθμός στον καταχωρητή φύλλων είναι 2: αντίγραφο

movwf PORTB, τα περιεχόμενα του datind2 καταχωρούνται στον καταχωρητή PORTB

bsf ind2 ;ενεργοποιήστε τη 2η ένδειξη

goto exit ;μετάβαση στην ετικέτα exit

met3 movlw .3, ελέγξτε τα περιεχόμενα του καταχωρητή φύλλων

φύλλο xorwf, W , ίσο με τον αριθμό 3

btfss STATUS,Z ;

goto met4 ;ο αριθμός στον καταχωρητή φύλλων δεν είναι ίσος με 3: μετάβαση στο met4

movf datind3,W ;ο αριθμός στον καταχωρητή φύλλων είναι 3: αντίγραφο

movwf PORTB, τα περιεχόμενα του datind3 καταχωρούνται στον καταχωρητή PORTB

bsf ind3 ;ενεργοποιήστε την 3η ένδειξη

goto exit ;μετάβαση στην ετικέτα exit

met4 movf datind4,W ; αντιγράψτε τα περιεχόμενα του μητρώου datind3

movwf PORTB ;to PORTB register

bsf ind4 ;ενεργοποιήστε την 4η ένδειξη

έξοδος bcf INTCON,T0IF ;επαναφέρετε τη σημαία διακοπής υπερχείλισης TMR0

movlw .100 ;γράψτε τον αριθμό 156 στον καταχωρητή χρονοδιακόπτη TMR0

swapf STATUS_TEMP,W ; επαναφέρετε τα περιεχόμενα των καταχωρητών κλειδιών

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;έξοδος από τη ρουτίνα διακοπής

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Κύριο πρόγραμμα

Έναρξη ................. ; αρχική εγκατάστασημητρώα

................. ;ειδικός σκοπός

.................

bsf STATUS,RP0 ;γράψτε δυάδικος αριθμός 11010011 για εγγραφή

movlw b"11010011" ;OPTION_REG, ορίζοντας έτσι την εσωτερική

movwf OPTION_REG ; πηγή ρολογιού για TMR0

bcf STATUS,RP0 ;ενεργοποίηση prescaler πριν από το TMR0

;Ρυθμίστε την αναλογία προκλιμάκωσης σε 1:16

clrf shet ; επαναφέρετε τον καταχωρητή φύλλων πριν ξεκινήσετε

;διακοπή υπερχείλισης TMR0, που πραγματοποιήθηκε

;μια φορά μετά την ενεργοποίηση

clrf datind1, σαφής καταχωρητές για την έξοδο πληροφοριών

clrf datind2 ;δείκτες, ισοδύναμοι με off

clrf datind3 ;δείκτες, αφού δείκτες με κοινό

clrf datind4 ;κάθοδος

bcf INTCON,T0IF ;επαναφέρετε τη σημαία διακοπής υπερχείλισης TMR0

bsf INTCON,T0IE ;ενεργοποιήστε τις διακοπές υπερχείλισης TMR0

bsf INTCON,GIE ; ενεργοποίηση καθολικών διακοπών

movlw b"00000110" ; Παράδειγμα εξόδου 13.52

movlw b"11001111" ;

movlw b"01101101" ;

movlwb"01011011" ;

................. ;

................. ;

................. ;

τέλος, τέλος όλου του προγράμματος

Στο κύριο πρόγραμμα, ρυθμίσαμε πρώτα ένα χρονόμετρο χρησιμοποιώντας τον καταχωρητή OPTION_REG, νωρίτερα μίλησα για τη χρήση χρονοδιακόπτων για . Στη συνέχεια, διαγράφουμε τον καταχωρητή φύλλων, που προορίζεται για την εισαγωγή μέτρησης από το 1 έως το 4, για κάθε δείκτη. Αυτός ο καταχωρητής αυξάνεται στη ρουτίνα διακοπής και προσαρμόζεται εκεί (θα μετρήσει από το 1 έως το 4), οπότε αυτό το καθάρισμαεκτελείται μία φορά μετά την ενεργοποίηση. Με βάση αυτό το μητρώο, θα καθορίσουμε ποιον δείκτη θα συμπεριλάβουμε και θα εκδίδουμε δεδομένα που αντιστοιχούν σε αυτόν. Το επόμενο βήμα είναι η εκκαθάριση των καταχωρητών αποθήκευσης πληροφοριών, των τεσσάρων καταχωρητών dataind1,2,3,4 που αντιστοιχούν στους τέσσερις δείκτες. Η εκκαθάριση ισοδυναμεί με την απενεργοποίηση των ενδείξεων, καθώς στη ρουτίνα της υπηρεσίας διακοπής, τα περιεχόμενα αυτών των καταχωρητών μεταφέρονται στον καταχωρητή PORTB, στον οποίο συνδέονται οι άνοδοι ένδειξης. Αυτό είναι απαραίτητο για να μην εμφανίζονται τυχόν σκουπίδια στις ενδείξεις μετά την ενεργοποίηση των διακοπών, καταρχήν αυτό δεν μπορεί να γίνει εάν οι σωστές πληροφορίες γραφτούν αμέσως για έξοδο. Στη συνέχεια, επαναφέρετε τη σημαία διακοπής υπερχείλισης του χρονοδιακόπτη, ενεργοποιήστε τις διακοπές υπερχείλισης TMR0 και, τέλος, ενεργοποιήστε τις καθολικές διακοπές.

Στη ρουτίνα της διακοπής, πρώτα σβήνουμε όλους τους δείκτες (εφαρμόζοντας χαμηλά λογικά επίπεδα στις βάσεις των τρανζίστορ), γιατί δεν είναι γνωστό ποια είναι αναμμένη. Αυξάνουμε τον καταχωρητή φύλλων, ελέγχοντας για ισότητα με τον αριθμό 5, εάν υπάρχει τέτοια αντιστοίχιση, γράψτε τον αριθμό 1 στο μητρώο, καθώς είναι απαραίτητο να μετρήσετε από το 1 στο 4. Στη συνέχεια, ελέγχουμε ποιος αριθμός βρίσκεται στο φύλλο καταχωρητή, με την οποία φορτώνουμε δεδομένα από το PORTB σε καταχωρητές αποθήκευσης πληροφοριών PORTB (dataind) για την αντίστοιχη ένδειξη και την ενεργοποιούμε. Μετά από αυτό, επαναφέρουμε τη σημαία διακοπής υπερχείλισης TMR0, γράφουμε τον αριθμό 100 στο χρονόμετρο (ο υπολογισμός αυτής της τιμής δίνεται παρακάτω), για μια χρονική καθυστέρηση και βγαίνουμε από τον χειριστή διακοπής. Στην πρώτη διακοπή, η πρώτη ένδειξη ανάβει, στη δεύτερη διακοπή, η δεύτερη και ούτω καθεξής σε κυκλικό κύκλο. Στο κύριο πρόγραμμα, μένει μόνο η φόρτωση δεδομένων στους καταχωρητές αποθήκευσης πληροφοριών για κάθε δείκτη. Στην υπορουτίνα διακοπής, μην ξεχάσετε να αποθηκεύσετε και να επαναφέρετε τις τιμές των καταχωρητών κλειδιών, έγραψα γι 'αυτό σε ένα άρθρο σχετικά.

Για την έξοδο αριθμών, είναι καλύτερο να χρησιμοποιήσετε μια γεννήτρια χαρακτήρων με τη μορφή πίνακα δεδομένων. Για παράδειγμα, για να εμφανιστεί ο αριθμός 3456 στους δείκτες, πρέπει να χωριστεί σε ψηφία, ενώ είναι καλύτερο να χρησιμοποιήσετε ξεχωριστούς καταχωρητές για να αποθηκεύσετε τους αριθμούς των ψηφίων (από το 0 έως το 9), στη συνέχεια να εκτελέσετε αυτούς τους καταχωρητές μέσω της γεννήτριας χαρακτήρων. λήψη των σωστών byte (φορτωμένες στους καταχωρητές δεδομένων) για την ανάφλεξη των αντίστοιχων τμημάτων.

Θα πάρουμε τη συχνότητα της γεννήτριας ρολογιού ως 4 MHz, ο κύκλος της μηχανής είναι 1 μs. Έστω ο ρυθμός ανανέωσης κάθε δείκτη είναι 100 Hz (περίοδος T = 10 ms), αντίστοιχα, η απαιτούμενη χρονική καθυστέρηση είναι 10/4 = 2,5 ms. Ο παράγοντας προκλιμάκωσης για το TMR0 έχει ρυθμιστεί στο 1:16, ενώ η μέγιστη δυνατή καθυστέρηση είναι 256x16 = 4096 μs και χρειαζόμαστε παύση 2,5 ms. Ας υπολογίσουμε τον αριθμό που θα γράψουμε στο TMR0: 256-((256x2,5)/4,096) = 256-156,25 = 99,75. Μετά τη στρογγυλοποίηση, παίρνουμε τον αριθμό 100.

Παρακάτω μπορείτε να κατεβάσετε ένα μοντέλο για το πρόγραμμα Proteus, υλικολογισμικό και πηγαίο κώδικα με εφαρμογή δυναμικής ένδειξης σε 4ψήφιο δείκτη με κοινή κάθοδο χρησιμοποιώντας τον μικροελεγκτή PIC16F628A. Για παράδειγμα, οι αριθμοί 0000 εμφανίζονται στην ένδειξη. 0001; 0002; 13.52; 9764.

Τώρα σκεφτείτε να συνδέσετε μια μήτρα με ανάλυση 8x8 pixel (LED). Η δομή μιας μήτρας συνήθως εξετάζεται ως προς τις γραμμές και τις στήλες. Στην παρακάτω εικόνα, σε κάθε στήλη, συνδέονται οι κάθοδοι όλων των LED και σε κάθε σειρά, οι άνοδοι. Οι χορδές (8 γραμμές, άνοδοι LED) συνδέονται μέσω αντιστάσεων στον μικροελεγκτή. Κάθε στήλη (κάθοδοι LED) συνδέεται με τον μικροελεγκτή μέσω 8 τρανζίστορ. Ο αλγόριθμος ένδειξης είναι ο ίδιος, πρώτα ορίζουμε τα απαραίτητα λογικά επίπεδα στις σειρές, σύμφωνα με τα οποία πρέπει να ανάβουν τα LED στη στήλη, μετά συνδέουμε την πρώτη στήλη (ένδειξη από αριστερά προς τα δεξιά). Μετά από μια ορισμένη παύση, απενεργοποιούμε τη στήλη και αλλάζουμε τα λογικά επίπεδα στις γραμμές για να εμφανιστεί η δεύτερη στήλη και μετά συνδέουμε τη δεύτερη στήλη. Και έτσι μετακινήστε εναλλάξ όλες τις στήλες. Παρακάτω είναι ένα διάγραμμα σύνδεσης της μήτρας με τον μικροελεγκτή.


Συνολικά, για τη σύνδεση μιας τέτοιας μήτρας, απαιτούνται 16 ακίδες μικροελεγκτή, που είναι αρκετά, επομένως, για να μειώσετε τις γραμμές ελέγχου, είναι καλύτερο να χρησιμοποιήσετε καταχωρητές σειριακής μετατόπισης.

Ο πιο κοινός σειριακός καταχωρητής είναι το μικροκύκλωμα 74HC595, το οποίο περιέχει έναν καταχωρητή μετατόπισης για τη φόρτωση δεδομένων και έναν καταχωρητή αναμονής μέσω του οποίου τα δεδομένα μεταφέρονται στις γραμμές εξόδου. Η φόρτωση δεδομένων σε αυτό είναι απλή, ορίστε το λογικό 0 στην είσοδο ρολογιού SH_CP και, στη συνέχεια, ορίστε το απαιτούμενο λογικό επίπεδο στην είσοδο δεδομένων DS, μετά από το οποίο αλλάζουμε την είσοδο ρολογιού σε 1, ενώ αποθηκεύουμε την τιμή επιπέδου (στην είσοδο DS) μέσα στον καταχωρητή βάρδιας. Ταυτόχρονα, τα δεδομένα μετατοπίζονται κατά ένα bit. Επαναφέρετε ξανά την έξοδο SH_CP στο 0, ορίστε το απαιτούμενο επίπεδο στην είσοδο DS και αυξήστε το SH_CP στο 1. Αφού φορτωθεί πλήρως ο καταχωρητής shift (8 bit), ορίστε την έξοδο ST_CP στο 1, αυτή τη στιγμή τα δεδομένα μεταφέρονται στο καταχωρητή αποθήκευσης και τροφοδοτείται στις γραμμές εξόδου Q0 ... Q7, μετά την οποία επαναφέρουμε την έξοδο του ST_CP. Κατά τη διαδοχική φόρτωση, τα δεδομένα μετατοπίζονται από το Q0 στο Q7. Ο ακροδέκτης Q7' συνδέεται με το τελευταίο bit του καταχωρητή shift, αυτός ο ακροδέκτης μπορεί να συνδεθεί στην είσοδο του δεύτερου μικροκυκλώματος, ώστε να μπορείτε να φορτώσετε δεδομένα σε δύο ή περισσότερα μικροκυκλώματα ταυτόχρονα. Ο ακροδέκτης OE αλλάζει τις γραμμές εξόδου στην τρίτη κατάσταση (υψηλής αντίστασης) όταν εφαρμόζεται σε αυτήν μια λογική 1. Η ακίδα MR έχει σχεδιαστεί για να επαναφέρει τον καταχωρητή μετατόπισης, δηλαδή να ρυθμίζει χαμηλά λογικά επίπεδα στις εξόδους των ενεργειών του καταχωρητή , που ισοδυναμεί με τη φόρτωση οκτώ μηδενικών. Παρακάτω είναι ένα διάγραμμα φόρτωσης δεδομένων στο μικροκύκλωμα 74NS595, ορίζοντας την τιμή 11010001 στις γραμμές εξόδου Q0 ... Q7, με την προϋπόθεση ότι αρχικά υπήρχαν μηδενικά:


Σκεφτείτε να συνδέσετε μια μήτρα 8×8 σε έναν μικροελεγκτή PIC16F628A χρησιμοποιώντας δύο καταχωρητές μετατόπισης 74HC595, το διάγραμμα φαίνεται παρακάτω:


Τα δεδομένα φορτώνονται στο τσιπ DD2 (έλεγχος λογικού επιπέδου στις σειρές, άνοδοι LED), στη συνέχεια μεταφέρονται μέσω του ακροδέκτη Q7 στο DD3 (έλεγχος στήλης), αντίστοιχα, πρώτα φορτώνουμε το byte για να ενεργοποιηθεί η στήλη και μετά το byte με τα λογικά επίπεδα στις σειρές. Οι στήλες μήτρας μεταγωγής τρανζίστορ (κάθοδοι LED) συνδέονται στις γραμμές εξόδου του DD3. Παρακάτω είναι ο κώδικας προγράμματος για την εμφάνιση μιας εικόνας σε μια μήτρα:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Εφαρμογή δυναμικής ένδειξης για πίνακα με ανάλυση 8x8 ;Συχνότητα της γεννήτριας ρολογιού για παράδειγμα 4 MHz, κύκλος μηχανής 1 μs org 0000h ;έναρξη εκτέλεσης προγράμματος από τη διεύθυνση 0000h goto Start ;μετάβαση στην ετικέτα Έναρξη ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Διακοπή ρουτίνας org 0004h ;έναρξη εκτέλεσης υπορουτίνας από τη διεύθυνση 0004h movwf W_TEMP ;αποθήκευση τιμών μητρώου κλειδιών swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; movwf FSR_osn ;στον καταχωρητή FSR_osn movf FSR_prer,W ;επαναφορά της προηγουμένως αποθηκευμένης τιμής movwf FSR ;του καταχωρητή FSR από τον καταχωρητή FSR_prer ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;φορτώστε τα περιεχόμενα του καταχωρητή stolb στο chip movf stolb,W ;αντιγράψτε τα περιεχόμενα του καταχωρητή stolb movwf var ;στον καταχωρητή var met2 btfsc var,0 ;ρυθμίστε το ds εξόδου σύμφωνα με το btfss var,0 ; bcf ds ; bcf sh_cp ; rrf var,F ;Shift register var δεξιά για προετοιμασία;επόμενο bit goto met2 ;scetbit όχι ίσο με μηδέν: μετάβαση στην ετικέτα met2 ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; ;φορτώστε τα περιεχόμενα του καταχωρητή INDF στο τσιπ;74HC595 (σειριακός καταχωρητής μετατόπισης) movf INDF,W ;αντιγράψτε τα περιεχόμενα του καταχωρητή INDF movwf var ;στον καταχωρητή var movlw .8 ,γράψτε τον αριθμό 8 στον καταχωρητή scetbit, για μέτρηση movwf scetbit ;μεταφερόμενα bit met1 btfsc var ,7 ;ορισμός εξόδου ds σύμφωνα με bsf ds ;τιμή 7ου bit καταχωρητή var btfss var,7 ; bcf ds ; bsf sh_cp ;ρολόι εξόδου sh_cp για κλείδωμα δεδομένων bcf sh_cp ; rlf var,F ;Shift register var αριστερά για προετοιμασία; επόμενο bit decfsz scetbit,F ;Μείωση με συνθήκη καταχωρητή scetbit goto met1 ;scetbit όχι ίσο με μηδέν: Μετάβαση στην ετικέτα met1 ; bsf st_cp, ρολογήστε την έξοδο st_cp για να μεταφέρετε τα φορτωμένα bcf st_cp, byte στις γραμμές εξόδου των τσιπ 74HC595. bcf STATUS,C ;επαναφέρετε το C bit της κατάστασης καταχωρητή πριν από τη μετατόπιση rrf stolb,F ;αριστερό καταχωρητή shift stolb ; incf FSR,F ;Αύξηση καταχωρητή FSR, προετοιμασία στη συνέχεια ;Εγγραφή για αποστολή δεδομένων στο φύλλο 74HC595 decfsz,F ;Μείωση με φύλλο συνθηκών καταχωρητή goto exit ;Εγγραφή καταχώρισης δεν ισούται με 0: Μετάβαση για έξοδο από το movlw data1 ;Εγγραφή καταχωρητή ίσο με 0: Γράψτε τη διεύθυνση πρώτα movwf FSR ;Εγγραφή για αποθήκευση πληροφοριών στον καταχωρητή FSR movlw .8 ;Εγγραφή του αριθμού 8 στον καταχωρητή φύλλων, για τη διατήρηση φύλλου movwf ;Μέτρηση στηλών ; έξοδος bcf INTCON,T0IF ;επαναφορά διακοπής υπερχείλισης σημαία TMR0 movlw . 124 ;γράψτε τον αριθμό 124 στον καταχωρητή χρονοδιακόπτη TMR0 movwf TMR0 ; ; movf FSR,W ;Αποθηκεύστε την τρέχουσα τιμή του FSR movwf FSR_prer ;Σε FSR_prer movf FSR_osn ,W ;Επαναφέρετε την προηγουμένως αποθηκευμένη τιμή movwf FSR ;FSR από FSR_osn ; swapf STATUS_TEMP,W ; επαναφορά περιεχομένων των καταχωρητών κλειδιών movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ;έξοδος από την υπορουτίνα διακοπής;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Έναρξη κύριου προγράμματος ................ ;Αρχική ρύθμιση καταχωρητών ................. ;Ειδικός σκοπός..... ............ bsf STATUS,RP0 ;γράψτε τον δυαδικό αριθμό 11010011 στον καταχωρητή movlw b"11010010" ;OPTION_REG, ρυθμίζοντας έτσι την εσωτερική πηγή movwf OPTION_REG ;πηγή ρολογιού για TMR0 bcf STATUS,RP0 ;ενεργοποιήστε τον προκαταρκτικό κλιμάκωση πριν TMR0, ρυθμίστε την αναλογία προκλιμάκωσης 1:8. movlw .8 ;γράψτε τον αριθμό 8 στον καταχωρητή φύλλων, πριν ξεκινήσετε το φύλλο movwf ;tmr0 διακοπές υπερχείλισης, εκτελούνται; μία φορά, μετά την ενεργοποίηση του movlw b"10000000" ;γράψτε τον δυαδικό αριθμό 10000000 στο movwf stolb ;stolb1st register, για να ενεργοποιήσετε εκτελείται μία φορά, μετά την ενεργοποίηση του ρεύματος. movlw data1 ;Γράψτε τη διεύθυνση του πρώτου καταχωρητή (καταχωρητές αποθήκευσης movwf FSR_prer ;πληροφορίες) στον καταχωρητή FSR_prer, που πραγματοποιήθηκε;μία φορά μετά την ενεργοποίηση; movlw .8 ;εκκαθάριση 8 καταχωρητών εξόδου πληροφοριών στο movwf tmp ;μήτρα, που ισοδυναμεί με την απενεργοποίηση του movlw data1 ;matrix movwf FSR ; met3 clrf INDF ; incf FSR,F ; decfsz tmp,F ; goto met3 ; ; bcf INTCON,T0IF , διαγραφή διακοπής υπερχείλισης TMR0 σημαία bsf INTCON,T0IE , ενεργοποίηση διακοπών υπερχείλισης TMR0 bsf INTCON,GIE , ενεργοποίηση καθολικών διακοπών. m1 movlw data1, R παράδειγμα εξόδου movwf FSR ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"01111111" ; movwf INDF ; incf FSR,F ; movlwb"00001001" ; movwf INDF ; incf FSR,F ; movlwb"00011001" ; movwf INDF ; incf FSR,F ; movlwb"00101001" ; movwf INDF ; incf FSR,F ; movlw b"01000110" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; incf FSR,F ; movlw b"00000000" ; movwf INDF ; ; .................; .................; .................; ; τέλος, τέλος όλου του προγράμματος.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Εφαρμογή δυναμικής ένδειξης για μήτρα με ανάλυση 8x8

;Παράδειγμα συχνότητας ρολογιού 4 MHz, κύκλος μηχανής 1 μs

org 0000h ;ξεκινήστε την εκτέλεση του προγράμματος στη διεύθυνση 0000h

goto Start ;μεταβείτε στην ετικέτα Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Διακοπή ρουτίνας

org 0004h ;έναρξη εκτέλεσης υπορουτίνας στη διεύθυνση 0004h

movwf W_TEMP ;αποθηκεύστε τις τιμές καταχωρητή κλειδιών

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;αποθηκεύστε την τρέχουσα τιμή του καταχωρητή FSR

movwf FSR_osn ;σε εγγραφή FSR_osn

movf FSR_prer,W ; επαναφέρετε την προηγουμένως αποθηκευμένη τιμή

movwf FSR ;FSR από FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (σειριακός καταχωρητής μετατόπισης)

movf stolb,W ; αντιγράψτε τα περιεχόμενα του μητρώου stolb

movwf var ;για εγγραφή var

movlw .8 ;γράψτε τον αριθμό 8 στον καταχωρητή scetbit, για μέτρηση

movwf scetbit ;μεταδιδόμενα bits

met2 btfsc var,0 ;ρυθμίστε την έξοδο ds σύμφωνα με

bsf ds ; 7η τιμή bit του καταχωρητή var

bsf sh_cp ;clock sh_cp έξοδος για να κλειδώσει τα δεδομένα

rrf var,F, shift register var δεξιά για προετοιμασία

;το επόμενο κομμάτι

decfsz scetbit,F ;μείωση με συνθήκη μητρώου scetbit

goto met2 ;scetbit δεν ισούται με μηδέν: μεταβείτε στην ετικέτα met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (σειριακός καταχωρητής μετατόπισης)

movf INDF,W ; αντιγράψτε τα περιεχόμενα του μητρώου INDF

movwf var ;για εγγραφή var

movlw .8 ;γράψτε τον αριθμό 8 στον καταχωρητή scetbit, για μέτρηση

movwf scetbit ;μεταδιδόμενα bits

met1 btfsc var,7 ;ρυθμίστε την έξοδο ds σύμφωνα με

bsf ds ; 7η τιμή bit του καταχωρητή var

bsf sh_cp ;clock sh_cp έξοδος για να κλειδώσει τα δεδομένα

rlf var,F ;αριστερή μετατόπιση var για προετοιμασία

;το επόμενο κομμάτι

decfsz scetbit,F ;μείωση με συνθήκη μητρώου scetbit

goto met1 ;scetbit δεν ισούται με μηδέν: μεταβείτε στην ετικέτα met1

bsf st_cp ;ρολογίστε την έξοδο του st_cp για να μεταφέρετε φορτωμένο

bcf st_cp ;bytes ανά 74HC595 γραμμές εξόδου

bcf STATUS,C ; διαγράψτε το C bit του καταχωρητή κατάστασης πριν από τη μετατόπιση

rrf stolb,F ;αριστερός καταχωρητής shift stolb

incf FSR,F ;αύξηση καταχωρητή FSR, προετοιμασία στη συνέχεια

; εγγραφείτε για να στείλετε δεδομένα στο 74HC595

φύλλο decfsz,F ;μείωση με φύλλο κατάστασης καταχωρητή

goto exit ;shet register δεν ισούται με 0: μετάβαση στην έξοδο

movlw data1 ;shet register είναι 0: γράψτε τη διεύθυνση του πρώτου

movwf FSR ;Εγγραφείτε για αποθήκευση πληροφοριών στο FSR

movlw .8 ;γράψτε τον αριθμό 8 στον καταχωρητή φύλλων, για αναφορά

Φύλλο movwf; μετράει στηλών

movlw b"10000000" ;γράψτε τον δυαδικό αριθμό 10000000 σε

movwf stolb ;καταχωρίστε το stolb, για να συμπεριλάβετε την 1η στήλη

έξοδος bcf INTCON,T0IF ;επαναφέρετε τη σημαία διακοπής υπερχείλισης TMR0

movlw .124 ;γράψτε τον αριθμό 124 στον καταχωρητή χρονοδιακόπτη TMR0

movf FSR,W ;αποθηκεύστε την τρέχουσα τιμή του καταχωρητή FSR

movwf FSR_prer ;σε καταχωρητή FSR_prer

movf FSR_osn ,W ; επαναφέρετε την προηγουμένως αποθηκευμένη τιμή

movwf FSR ;FSR από FSR_osn

swapf STATUS_TEMP,W ; επαναφέρετε τα περιεχόμενα των καταχωρητών κλειδιών

swapf W_TEMP,F ;

swapf W_TEMP,W ;

retfie ;έξοδος από τη ρουτίνα διακοπής

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Κύριο πρόγραμμα

Έναρξη ................. ;αρχική ρύθμιση των καταχωρητών

................. ;ειδικός σκοπός

.................

bsf STATUS,RP0 ;γράψτε τον δυαδικό αριθμό 11010011 για εγγραφή

movlw b"11010010" ;OPTION_REG, ορίζοντας έτσι την εσωτερική

movwf OPTION_REG ; πηγή ρολογιού για TMR0

bcf STATUS,RP0 ;ενεργοποίηση prescaler πριν από το TMR0

;Ρυθμίστε την αναλογία προκλιμάκωσης σε 1:8

movlw .8 ;γράψτε τον αριθμό 8 στον καταχωρητή φύλλων πριν την εκτέλεση

φύλλο movwf, η υπερχείλιση TMR0 διακόπτει, τρέχει

;μια φορά μετά την ενεργοποίηση

movlw b"10000000" ;γράψτε τον δυαδικό αριθμό 10000000 σε

movwf stolb ;καταχωρίστε το stolb, για να συμπεριλάβετε την 1η στήλη

Οι πληροφορίες με λογικά επίπεδα για τις σειρές κάθε στήλης αποθηκεύονται σε 8 καταχωρητές αποθήκευσης πληροφοριών, στους οποίους η πρόσβαση γίνεται μέσω. Η διεύθυνση του πρώτου μητρώου ονομάζεται data1. Εκτός από την αρχική εγγραφή των καταχωρητών shet και stolb, είναι απαραίτητο να γράψετε τη διεύθυνση του πρώτου καταχωρητή αποθήκευσης πληροφοριών στον καταχωρητή FSR_prer (ο καταχωρητής είναι data1, η καταχώρηση στο FSR_prer εκτελείται μία φορά, και στη συνέχεια προσαρμόζεται στο χειριστή), μόνο μετά από αυτό, επιτρέψτε τις διακοπές υπερχείλισης TMR0.

Πριν ενεργοποιήσετε τις διακοπές, είναι επιθυμητό να διαγράψετε τους καταχωρητές αποθήκευσης πληροφοριών, αυτή η λειτουργία εκτελείται χρησιμοποιώντας τον πρόσθετο καταχωρητή tmp (ως μετρητή) και έμμεση διευθυνσιοδότηση, η εκκαθάριση ισοδυναμεί με την απενεργοποίηση του πίνακα.

Στη ρουτίνα χειρισμού διακοπών, φορτώνουμε τα περιεχόμενα του καταχωρητή stolb στο τσιπ DD2 (την πρώτη φορά που εισάγετε τον χειριστή μετά την ενεργοποίηση των διακοπών, ο καταχωρητής περιέχει τον αριθμό 10000000, όπως αναφέρθηκε παραπάνω). Η φόρτωση ξεκινά από το χαμηλό bit του καταχωρητή stolb, το οποίο αλλάζει προς την κατεύθυνση από το Q0 στο Q7 (μέσα στο τσιπ DD2) καθώς φορτώνεται, ο αλγόριθμος φόρτωσης συζητήθηκε παραπάνω, οπότε νομίζω ότι δεν θα είναι δύσκολο να κατανοήσουμε τον κώδικα . Στη συνέχεια, φορτώνουμε τα περιεχόμενα του καταχωρητή INDF στο DD2, αυτός είναι ένας από τους καταχωρητές αποθήκευσης πληροφοριών, η διεύθυνση του οποίου βρίσκεται στο FSR (την πρώτη φορά που εισάγετε τον χειριστή μετά την ενεργοποίηση των διακοπών, το FSR περιέχει τη διεύθυνση του πρώτου μητρώο αποθήκευσης πληροφοριών που ονομάζεται data1). Η φόρτωση ξεκινά από το υψηλό bit του καταχωρητή INDF. Μετά τη φόρτωση των θεωρούμενων 2 byte, χρονομετρούμε την έξοδο st_cp, έτσι τα δεδομένα που έχουν ληφθεί μεταδίδονται στις γραμμές εξόδου των μικροκυκλωμάτων DD2, DD3. Έτσι, στην πρώτη είσοδο στον χειριστή, γίνεται εναλλαγή της πρώτης στήλης της μήτρας, στην οποία ανάβουν τα LED, στις ανόδους των οποίων υπάρχει υψηλό λογικό επίπεδο, σύμφωνα με τα περιεχόμενα του καταχωρητή data1 (το πρώτο μητρώο αποθήκευσης πληροφοριών).

Στη συνέχεια, μετατοπίζουμε τον καταχωρητή stolb προς τα δεξιά κατά ένα bit για να προετοιμάσουμε τη δεύτερη στήλη του πίνακα για εναλλαγή στην επόμενη είσοδο στον χειριστή διακοπής. Η σημαία C του καταχωρητή STATUS πρέπει να διαγραφεί πριν από τη μετατόπιση, καθώς η μετατόπιση γίνεται μέσω αυτής της σημαίας και η κατάστασή της δεν είναι γνωστή τη στιγμή της μετατόπισης. Μετά τη μετατόπιση, αυξάνουμε τον καταχωρητή FSR, προετοιμάζοντας τον επόμενο καταχωρητή αποθήκευσης (μετά τον καταχωρητή data1) με λογικά επίπεδα σειρών για τη δεύτερη στήλη. Στη συνέχεια, μειώνουμε τον καταχωρητή φύλλων με την συνθήκη και αν δεν είναι ίση με το μηδέν, επαναφέρουμε τη σημαία διακοπής υπερχείλισης TMR0, γράφουμε τον αριθμό στο χρονόμετρο και βγαίνουμε από τον χειριστή διακοπής.

Την επόμενη φορά που θα εισαγάγετε το πρόγραμμα χειρισμού, η δεύτερη στήλη του πίνακα θα ενεργοποιηθεί και ούτω καθεξής. Όταν γίνεται επαναφορά του καταχωρητή φύλλων (μετά την εναλλαγή της 8ης στήλης), ο αριθμός 8 γράφεται σε αυτόν για τον επόμενο κύκλο εναλλαγής στηλών, επιπλέον, διορθώνεται η τιμή του καταχωρητή stolb, η διεύθυνση του πρώτου καταχωρητή αποθήκευσης πληροφοριών ( data1) εγγράφεται στον καταχωρητή FSR.

Ας υπολογίσουμε τη χρονική καθυστέρηση για το χρονόμετρο TMR0, η συχνότητα ρολογιού είναι 4 MHz, ο κύκλος του μηχανήματος είναι 1 μs. Για να αποφύγουμε το τρεμόπαιγμα των LED, ας πάρουμε τον ρυθμό ανανέωσης κάθε στήλης ως 100Hz (περίοδος T=10ms), η χρονική καθυστέρηση είναι 10/8 = 1,25ms. Ρυθμίσαμε την αναλογία προκλιμάκωσης TMR0 σε 1:8, ενώ η μέγιστη δυνατή καθυστέρηση είναι 256x8 = 2048 μs. Για μια παύση 1,25 ms, ο χρονοδιακόπτης θα πρέπει να μετράει (256x1,25) / 2,048 = 156,25 φορές, στρογγυλεύοντας προς τα πάνω έχουμε 156 μετρήσεις. Αντίστοιχα, είναι απαραίτητο να γράψετε τον αριθμό 256-156 = 100 στο χρονόμετρο. Αλλά αυτή δεν είναι η σωστή τιμή, καθώς χρειάζεται λίγος χρόνος για να εκτελεστεί η ρουτίνα διακοπής, σε αυτήν την περίπτωση χρειάζονται περίπου 190 μs, υπολογιζόμενη εκ νέου λαμβάνοντας υπόψη λαμβάνοντας υπόψη τον συντελεστή prescaler, παίρνουμε 190/8 = 23,75 ή 24 μετρήσεις. Η σωστή τιμή για εγγραφή στο TMR0 είναι: 100+24=124.

Στο κύριο πρόγραμμα, γράφουμε 8 καταχωρητές αποθήκευσης πληροφοριών, σύμφωνα με αυτό που θέλουμε να εμφανίσουμε στη μήτρα. Παρακάτω είναι ένα διάγραμμα που εξηγεί την έξοδο των πληροφοριών στον πίνακα για τον παραπάνω κώδικα.


Εκτός από τους καταχωρητές μετατόπισης, υπάρχουν εξειδικευμένα προγράμματα οδήγησης για την εμφάνιση πληροφοριών σε δείκτες επτά τμημάτων και Μήτρα LED, σε αυτήν την περίπτωση η δυναμική ένδειξη υλοποιείται από το ίδιο το πρόγραμμα οδήγησης, μένει μόνο να του στείλουμε δεδομένα για εμφάνιση. Εξέτασα ένα από αυτά τα δημοφιλή προγράμματα οδήγησης σε ένα άρθρο σχετικά με.

Κάτω από τον σύνδεσμο μπορείτε να κατεβάσετε το υλικολογισμικό και τον πηγαίο κώδικα για τον μικροελεγκτή PIC16F628A, με την υλοποίηση της δυναμικής ένδειξης σε μια μήτρα 8x8 χρησιμοποιώντας δύο καταχωρητές μετατόπισης 74HC595, το διάγραμμα σύνδεσης συζητήθηκε παραπάνω. Τα γράμματα R, L, ο αριθμός 46, ένα χαμόγελο και απλώς ένα μοτίβο με τη μορφή σταυρού εμφανίζονται εναλλάξ στη μήτρα, αυτό το κινούμενο σχέδιο εμφανίζεται στο παρακάτω βίντεο.

με ετικέτες,. Ανάγνωση .

Η δυναμική ένδειξη είναι ένα από τα προβλήματα που αντιμετωπίζουν οι αρχάριοι προγραμματιστές μικροελεγκτών. Πολλά έχουν ειπωθεί γι 'αυτό, αλλά αποφάσισα να ενισχύσω τα γνωστά με εικόνες και παραδείγματα κειμένων πηγής C, έτσι ώστε να είναι ευκολότερο να κυριαρχήσετε αυτήν τη μέθοδο εμφάνισης.

1 Βασικές αρχές των βασικών ή εισαγωγή

Πρώτα απ 'όλα, ας ορίσουμε την ορολογία που θα χρησιμοποιήσουμε σε όλο το άρθρο.

Εάν θέλετε να ελέγξετε μια οθόνη που αποτελείται από μια ενιαία εξοικείωση επτά τμημάτων, αυτό δεν προκαλεί κανένα πρόβλημα - μπορεί να αναπαρασταθεί ως 8 ανεξάρτητα LED. Εάν χρειάζεται να εμφανίσετε περισσότερες πληροφορίες από έναν χαρακτήρα, αρχίζουν τα προβλήματα: 2 εξοικείωση είναι 16 LED, τρία - 24 κ.λπ., δηλαδή, για μια οθόνη τριών ψηφίων, οι έξοδοι του μικροελεγκτή μπορεί απλώς να μην είναι αρκετές, για να μην αναφέρουμε Εμφανίζει 6 ή περισσότερα bit και, ειδικά, δείκτες μήτρας.

Για απλότητα, συμφωνούμε ότι όλοι οι δείκτες μας είναι με μια κοινή κάθοδο. Η λύση στο πρόβλημα είναι αρκετά απλή: συνδέστε τις εξόδους των τμημάτων όλων των δεικτών μεταξύ τους. Τώρα, εάν θέλετε να εμφανίσετε πληροφορίες στην πρώτη εξοικείωση, θα πρέπει να εφαρμόσετε τα απαιτούμενα επίπεδα στις γραμμές τμήματος και να συνδέσετε την κοινή έξοδο του πρώτου δείκτη στο κοινό καλώδιο του κυκλώματος. Φυσικά, πρέπει να υπάρχουν υψηλά επίπεδα στις κοινές καθόδους όλων των άλλων δεικτών. Προφανώς, τα επιθυμητά τμήματα της πρώτης ένδειξης θα ανάψουν. Για έξοδο στο δεύτερο, τρίτο κ.λπ. οι δείκτες θα πρέπει να κάνουν το ίδιο, δηλ. εφαρμόζοντας ένα λογικό μηδέν σε μία από τις κοινές καθόδους, επιλέγουμε το τρέχον εμφανιζόμενο bit και η κατάσταση των γραμμών τμήματος καθορίζει το ορατό σύμβολο.

Για να γίνεται αντιληπτή ολόκληρη η οθόνη ως συνεχώς αναμμένη, τα ψηφία πρέπει να εναλλάσσονται γρήγορα - πιο συχνά από 25 φορές το δευτερόλεπτο. Όπως μπορείτε να δείτε, τα επίπεδα όλων των συμπερασμάτων (τα οποία, παρεμπιπτόντως, έχουν γίνει σημαντικά λιγότερα από ό,τι με τη συνήθη προσέγγιση) αλλάζουν συνεχώς, δηλ. δεν έχουν στατικά επίπεδα, αλλά δυναμικά, εξ ου και η ονομασία της μεθόδου εμφάνισης - δυναμική.

Εικόνα με δυναμική απεικόνιση

2 Ποικιλίες υλοποίησης υλικού

2.1 Επίπεδοι πίνακες

Εάν αφαιρέσουμε από δείκτες επτά τμημάτων, τότε η οθόνη μας μπορεί να αναπαρασταθεί ως μια μήτρα μεμονωμένων LED, οι άνοδοι των οποίων συνδυάζονται σε σειρές της μήτρας και οι κάθοδοι σε στήλες. Στην πραγματικότητα, αυτό ακριβώς είναι.

Προφανώς, εφαρμόζοντας τα απαιτούμενα επίπεδα στις σειρές και τις στήλες του πίνακα μας, μπορούμε να ανάψουμε οποιοδήποτε στοιχειώδες τμήμα LED (γνωστός και ως pixel - αυτός είναι ένας πιο παραδοσιακός όρος για οθόνες μήτρας). Ανάλογα με το πώς ακριβώς θα αλλάξουμε τα επίπεδα σε γραμμές και στήλες, μπορούμε να λάβουμε διάφορους τύπους δυναμικής ένδειξης:

  • με γραμμή?
  • με στήλες?
  • τμήμα προς τμήμα (ανά pixel).
  • με μεικτό τρόπο.

Εξετάσαμε την επιλογή ανά στήλες στο προηγούμενο κεφάλαιο. Η επιλογή ανά γραμμές διαφέρει από αυτήν μόνο στο ότι οι γραμμές και οι στήλες του πίνακα μας εναλλάσσονται. Η μέθοδος τμήμα προς τμήμα συνίσταται στο γεγονός ότι ανά πάσα στιγμή μόνο μία σειρά και μία στήλη έχουν το επίπεδο που απαιτείται για να ανάψει το LED. Δηλαδή, ανά πάσα στιγμή, μόνο ένα LED από ολόκληρη τη μήτρα μπορεί να ανάψει (σε ​​αντίθεση με προηγούμενες επιλογέςόταν ολόκληρη η σειρά ή ολόκληρη η στήλη μπορεί να φωτιστεί ταυτόχρονα). Αυτή η μέθοδος μοιάζει με σάρωση τηλεόρασης, όταν η δέσμη περιστρέφεται γύρω από ολόκληρη την οθόνη, φωτίζοντας μέσα σωστά μέρηφώσφορο. Η μικτή έκδοση, όπως υποδηλώνει το όνομα, είναι ότι ταυτόχρονα «ενεργά» επίπεδα μπορούν να υπάρχουν σε πολλές σειρές και στήλες ταυτόχρονα.

Οι δύο πρώτες επιλογές είναι πολύ εύκολο να εφαρμοστούν, και ως εκ τούτου χρησιμοποιούνται ευρέως. Η τρίτη επιλογή χρησιμοποιείται λιγότερο συχνά, επειδή. απαιτεί περισσότερα υψηλές ταχύτητεςενημερώσεις πληροφοριών σε σειρές και στήλες και το μέσο ρεύμα μέσω του τμήματος (δηλαδή, η φωτεινότητα του τμήματος) σε αυτήν την περίπτωση είναι σημαντικά χαμηλότερο από ό,τι σε άλλες. Η τελευταία μικτή μέθοδος είναι η λιγότερο κοινή, αν και έχει μια σειρά από θετικές ιδιότητες. Πρώτα απ 'όλα, αυτή η μέθοδος απαιτεί τη χρήση σταθερών πηγών ρεύματος στα κυκλώματα σειρών και στηλών, διαφορετικά η φωτεινότητα των φωτεινών τμημάτων θα εξαρτηθεί αναπόφευκτα από τον συνολικό αριθμό τους. Και ο υπολογισμός των συνδυασμών σημάτων σε γραμμές και στήλες δεν είναι πολύ εύκολος.

2.2 Πολυδιάστατοι πίνακες

Τα παραδείγματα που εξετάσαμε προϋποθέτουν την υλοποίηση μονόχρωμη οθόνη, δηλ. που αποτελείται από μονόχρωμα LED. Τι γίνεται αν θέλετε να αποκτήσετε μια πολύχρωμη οθόνη, για παράδειγμα, από RGB LED; Υπάρχουν δύο πιθανές λύσεις.

Το πρώτο είναι απλά να αυξήσουμε τον αριθμό των γραμμών (ή στηλών) του πίνακα μας αντιμετωπίζοντας κάθε RGB LED ως 3 ανεξάρτητα μεμονωμένα LED. Το μεγάλο μειονέκτημα αυτής της προσέγγισης είναι η τριπλάσια αύξηση του αριθμού των γραμμών (ή στηλών). Στο απλό παράδειγμαείναι εύκολο να δούμε τι μεταφράζεται αυτό στην πράξη: με τη βοήθεια δύο προεξοχών οκτώ bit του μικροελεγκτή, μπορούμε να έχουμε μια μονόχρωμη μήτρα 8x8 τμημάτων ή ένα έγχρωμο 4x4. Συμφωνήστε ότι στη δεύτερη περίπτωση είναι πρακτικά αδύνατο να εμφανιστεί κάτι κατανοητό ...

Ο δεύτερος τρόπος είναι η μετάβαση από έναν «επίπεδο» πίνακα τμημάτων σε έναν «πολυδιάστατο». Εάν το σήμα κάθε γραμμής περάσει από έναν πολυπλέκτη 1x3, τότε μπορούμε να αναπαραστήσουμε το σύστημα απεικόνισης των LED RGB ως 3 ανεξάρτητες μήτρες της αρχικής διάστασης: κάθε μήτρα αποτελείται από LED του ίδιου χρώματος και επιλέγουμε τον επιθυμητό πίνακα με το σήματα ελέγχου πολυπλέκτη. Το σχήμα εξηγεί τι έχει ειπωθεί.

Προφανώς, στην περίπτωση μιας πολυδιάστατης μήτρας, απαιτείται επίσης ένας επιπλέον αριθμός γραμμών ελέγχου, ωστόσο, αυτός ο αριθμός δεν είναι τόσο μεγάλος: στις ίδιες δύο θύρες ελεγκτή, μπορούμε να έχουμε μια έγχρωμη οθόνη 7x7 !!!

2.3 Τρόποι μείωσης της διάστασης των πινάκων

Εάν ο αριθμός των ακροδεκτών μικροελεγκτή είναι πολύ περιορισμένος, θα πρέπει να αναζητήσουμε τρόπους για να μειώσουμε τον αριθμό των γραμμών και στηλών του πίνακα μας. Φυσικά, θαύματα δεν γίνονται και σε αυτή την περίπτωση θα πρέπει να πληρώσουμε από το γεγονός ότι, εκτός από τον μικροελεγκτή, θα χρησιμοποιηθούν και επιπλέον μικροκυκλώματα. Όπως ίσως μαντέψατε, εδώ μπορείτε να χρησιμοποιήσετε την προηγουμένως θεωρημένη μέθοδο των «πολυδιάστατων» πινάκων - τελικά, κανείς δεν θα μας απαγορεύσει να χρησιμοποιήσουμε απλώς έναν τριπλό αριθμό μονόχρωμων LED αντί για LED RGB; Το κυριότερο είναι να τα τακτοποιήσετε κατάλληλα...

Έτσι, μπορούμε να μειώσουμε τη διάσταση του πίνακα εφαρμόζοντας:

  • αποκωδικοποιητές ή πολυπλέκτης?
  • καταχωρητές βάρδιας.

Έχουμε ήδη συναντηθεί με πολυπλέκτη νωρίτερα, αποκρυπτογράφος, όπως μπορείτε να μαντέψετε, διαφέρει από τον πολυπλέκτη κατά κύριο λόγο. Θα πρέπει μόνο να προστεθεί ότι χρησιμοποιώντας αποκωδικοποιητές / πολυπλέκτης τόσο για σειρές όσο και για στήλες, είναι δυνατό να επιτευχθεί μείωση της διάστασης του πίνακα και στις δύο διαστάσεις ταυτόχρονα, ωστόσο, σε αυτήν την περίπτωση, μπορεί να είναι απαραίτητο να χρησιμοποιηθεί μόνο τμήμα προς- δυναμική ένδειξη τμήματος, με όλες τις αδυναμίες της.

Οι καταχωρητές Shift μπορούν να βοηθήσουν πολύ καλύτερα από τους αποκωδικοποιητές. Εξετάστε το διάγραμμα στο παρακάτω σχήμα.

Είναι εύκολο να διαπιστωθεί ότι οποιοσδήποτε αριθμός γραμμών και στηλών θα απαιτήσει μόνο αύξηση του αριθμού των καταχωρητών και ο αριθμός των γραμμών ελέγχου μικροελεγκτή που εμπλέκονται θα παραμείνει ο ίδιος! Ένα μικρό μείον αυτή η προσέγγισηείναι ότι όσο μεγαλώνει ο αριθμός των καταχωρητών στην αλυσίδα, θα είναι απαραίτητο να αυξηθεί η ταχύτητα της διαδοχικής εξόδου πληροφοριών σε αυτούς, κάτι που δεν είναι πάντα εύκολα επιτεύξιμο. Έτσι, για παράδειγμα, κοινοί μικροελεγκτές της οικογένειας AVR, πρακτικά δεν σας επιτρέπουν να ξεπεράσετε τη σειριακή ταχύτητα εξόδου των 10 megabit / sec. Από την άλλη πλευρά, εάν χρησιμοποιείτε άλλους ελεγκτές που μπορούν να εξάγουν σήματα πιο γρήγορα, ενδέχεται να ξεκινήσουν προβλήματα διαφορετικής σειράς: η μετάδοση ενός σήματος ρολογιού υψηλής συχνότητας κατά μήκος μιας μεγάλης γραμμής (και όταν μεγάλοι αριθμοίκαταχωρεί, αναπόφευκτα θα είναι έτσι) είναι εντελώς διαφορετικό από τη χαμηλή συχνότητα, επομένως θα απαιτηθούν ειδικά μέτρα κατά την καλωδίωση πλακέτα τυπωμένου κυκλώματοςκαι άλλα πράγματα που δεν θα εξετάσουμε σε αυτό το άρθρο.

3 Τρόποι υλοποίησης λογισμικού

Δεν θα εξετάσουμε την εφαρμογή λογισμικού όλων των αναφερόμενων επιλογών για δυναμική ένδειξη - αυτό θα διογκώσει αδικαιολόγητα το άρθρο. Θα περιοριστούμε μόνο σε τρία από τα πιο «τρέχοντα» παραδείγματα: μια επίπεδη μήτρα με άμεσο έλεγχο σειρών και στηλών, το ίδιο με τη χρήση αποκωδικοποιητή και, τέλος, μια παραλλαγή με τη χρήση καταχωρητών μετατόπισης. Σε όλες τις περιπτώσεις, θα δοθεί ιδιαίτερη προσοχή σε όλες τις αποχρώσεις υλοποίηση λογισμικού, δηλαδή, ο κωδικός C θα συνοδεύεται από επεξηγήσεις μόνο σε περιπτώσεις που αυτό συμπίπτει με την πρόθεση του συγγραφέα και σε καμία περίπτωση με το επίπεδο εκπαίδευσής σας. Με αυτό υπαινίσσομαι ότι πρέπει να γνωρίζετε τα βασικά του C χωρίς εμένα.

Για όλα τα παραδείγματα, θα συμφωνήσουμε ότι η οθόνη μας βασίζεται σε δείκτες επτά τμημάτων με κοινή κάθοδο.

3.1 Ο απλούστερος τρόπος

Προφανώς, στο πρόγραμμα θα ήταν πιο βολικό να υπάρχει ένας πίνακας, το περιεχόμενο του οποίου θα καθόριζε μοναδικά ποια τμήματα στα οποία οι περιοχές εξοικείωσης της οθόνης φωτίζονται - ένα είδος αναλόγου της RAM οθόνης.

Ας εισαγάγουμε τον ορισμό των παρακάτω σταθερών:

#define SCR_SZ 6 /* αριθμός κενών χαρακτήρων εμφάνισης */ #define ROWS PORTB /* θύρα εμφάνισης "γραμμών", π.χ. διαχείριση τμημάτων */ #define COLS PORTD /* θύρα για διαχείριση "στήλων", π.χ. κοινές κάθοδοι */

Τώρα ας δηλώσουμε μια οθόνη πίνακα:

ανυπόγραφο char SCR;

Αρχικά, θα υποθέσουμε ότι κάθε στοιχείο του πίνακα αντιστοιχεί στην εξοικείωση της οθόνης και κάθε bit αυτού του στοιχείου αντιστοιχεί σε ένα συγκεκριμένο τμήμα του δείκτη. Ποιο bit αντιστοιχεί σε ποιο τμήμα - σε αυτήν την περίπτωση, δεν έχει σημασία, πώς δεν έχει σημασία πώς αυτά τα bit ορίζονται στα byte του πίνακα μας, απλώς θα υποθέσουμε προς το παρόν ότι είναι ήδη εκεί. Επίσης, για λόγους απλότητας, θα υποθέσουμε ότι οι κοινές κάθοδοι συνδέονται με τους ακροδέκτες της θύρας COLSδιαδοχικά: το λιγότερο σημαντικό bit είναι η πιο δεξιά ένδειξη, μετά το δεύτερο, μετά το τρίτο και ούτω καθεξής.

Πώς να κάνετε αυτή τη συστοιχία "εμφάνιση" στην οθόνη; Ας γράψουμε τον παρακάτω κώδικα:

< SCR_SZ; pos++){ ROWS = SCR; COLS = ~(1 << pos); }

Θα εκτελέσει την απαιτούμενη λειτουργία; Ναί. Αλλά είναι κακό.

Πρώτα απ 'όλα, σημειώστε ότι δεν έχουμε κανέναν έλεγχο στον ρυθμό με τον οποίο ενημερώνονται τα περιεχόμενα των γραμμών και των στηλών. Δεύτερον, σημειώστε ότι μέχρι να εξέλθει το νέο στοιχείο πίνακα ΣΕΙΡΕΣστις γραμμές COLSη παλιά αξία είναι ακόμα παρούσα! Πού οδηγεί; Επιπλέον, για κάποιο κλάσμα του δευτερολέπτου, τμήματα μιας γειτονικής οικειότητας θα εμφανίζονται στην εξοικείωση, δηλ. ορισμένα τμήματα θα επισημαίνονται εσφαλμένα.

Μπορείτε να αποφύγετε αυτό το εφέ ως εξής: πριν από την ενημέρωση του περιεχομένου ΣΕΙΡΕΣ, ακυρώστε πάντα την εξοικείωση που ήταν η προηγούμενη. Για να μην ασχοληθείς με τον ορισμό της προηγούμενης οικειότητας, μπορείς να σβήσεις τα πάντα με τη μία. Ο κώδικας μας λοιπόν μοιάζει με αυτό:

ανυπόγραφο char pos? while(1) for(pos = 0; pos< SCR_SZ; pos++){ COLS = 0xFF; ROWS = SCR; COLS = ~(1 << pos); delay(); }

Προσθέσαμε ένα κενό ολόκληρης της οθόνης πριν ενημερώσουμε την κατάσταση των γραμμών τμήματος (θέτοντας υψηλό επίπεδο στις κοινές καθόδους, θα απενεργοποιήσουμε την ένδειξη ανεξάρτητα από το τι υπάρχει στις ανόδους) και εισαγάγαμε μια καθυστέρηση στο τέλος της κύκλος. Τώρα η οθόνη θα λειτουργεί πολύ καλύτερα. Έχουμε όμως γράψει καλό πρόγραμμα; Δυστυχώς όχι.

Το γεγονός είναι ότι ο ατελείωτος κύκλος εμφάνισης ενώαπλά δεν μας αφήνει να κάνουμε κάτι άλλο. Τι είδους πρόγραμμα θα έχουμε, που ξέρει μόνο πώς να εμφανίζει κάτι στην ένδειξη;! Φυσικά, δεν είναι όλα 100% άσχημα, αφού κάτι χρήσιμο μπορεί να γίνει σε διακοπές ... και αντί για καθυστέρηση καθυστέρηση()μπορείτε να εκτελέσετε κάποιες ενέργειες... Αλλά όλα αυτά είναι πολύ, πολύ στραβά: δεν είναι επιθυμητό να εκτελείτε κάτι περίπλοκο και δυσκίνητο στους χειριστές διακοπών. από την άλλη πλευρά, αν γίνει κάτι περίπλοκο και δυσκίνητο αντί για καθυστέρηση, τότε είναι δύσκολο να διασφαλιστεί ο ίδιος χρόνος υπολογισμού, διαφορετικά θα αποδειχθεί ότι η εξοικείωση λάμπει για διαφορετική χρονική περίοδο, η οποία οπτικά θα μοιάζει με τους λάμψη ή τρεμόπαιγμα διαφορετικής φωτεινότητας.

Γενικά, αυτή η επιλογή μπορεί να επιτραπεί μόνο ως εξαίρεση, μόνο ως παράδειγμα εκπαίδευσης ή στην περίπτωση (αλλά πέντε, μόνο ως εξαίρεση!), Όταν το κύριο πρόβλημα που πρέπει να λυθεί είναι πολύ απλό (αυτό μπορεί να είναι, για για παράδειγμα, το πρόβλημα της μέτρησης ADCτάση και εμφανίστε την).

Τι πρέπει να γίνει? Η απάντηση, όπως πάντα, είναι απλή: όλες οι διεργασίες που πρέπει να εκτελούνται ανεπαίσθητα από τη λύση της κύριας εργασίας (και η ένδειξη, φυσικά, είναι μια τέτοια διαδικασία), θα πρέπει να εκτελούνται με διακοπές με χρονοδιακόπτη.
Οι διακοπές θα έρχονται σε αυστηρά καθορισμένα χρονικά διαστήματα, που θα διασφαλίζουν την ομοιομορφία της λάμψης της οικειότητας. Η ένδειξη φόντου θα μας επιτρέψει απλώς να γράψουμε κάτι στον πίνακα τη σωστή στιγμή στον κύριο βρόχο SCR- και θα εμφανιστεί αμέσως στην οθόνη! Και όλες οι αλλαγές κώδικα καταλήγουν στο γεγονός ότι αντί για βρόχους χρησιμοποιούμε τη συνάρτηση χειριστή διακοπής:

ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; COLS = 0xFF; ROWS = SCR; COLS = ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

Μερικά σχόλια.

μεταβλητός pos, δηλώνοντας τον αριθμό της τρέχουσας λαμπερής οικειότητας, φτιάχνουμε μια τοπική στατική μεταβλητή έτσι ώστε να διατηρεί την τιμή της από διακοπή σε διακοπή. Στο τέλος της συνάρτησης, εμείς οι ίδιοι (άλλωστε, δεν έχουμε πια κύκλο) αυξάνουμε τον αριθμό εξοικείωσης μέχρι να φτάσουμε στο όριο - σε αυτήν την περίπτωση, επιστρέφουμε στην αρχή.

Στο κύριο πρόγραμμα, θα χρειαστεί μόνο να αρχικοποιήσουμε τις θύρες και το χρονόμετρο (σε αυτήν την περίπτωση - Χρονοδιακόπτης 0) ώστε να ξεχειλίζει στα διαστήματα που χρειαζόμαστε και να επιτρέπονται διακοπές. Μετά από αυτό, δεν μπορείτε να θυμηθείτε για την ένδειξη - θα λειτουργήσει αθόρυβα και ειρηνικά από μόνο του. Αλλά πώς να προσδιορίσετε το επιθυμητό διάστημα υπερχείλισης του χρονοδιακόπτη; Πολύ απλό. Το ανθρώπινο μάτι αντιλαμβάνεται το τρεμόπαιγμα με συχνότητα μεγαλύτερη από 25 Hz ως συνεχή λάμψη. Έχουμε 6 δείκτες, καθένας από αυτούς πρέπει να τρεμοπαίζει με τέτοια συχνότητα, πράγμα που σημαίνει ότι οι πληροφορίες στην οθόνη πρέπει να ενημερώνονται με συχνότητα 25 x 6 = 150 Hz ή περισσότερο. Τώρα ας υπολογίσουμε την τιμή του χρονοδιακόπτη prescaler: διαιρέστε τη συχνότητα ρολογιού του MK με το 256 ( Χρονοδιακόπτης 0όλοι έχουν AVRοκτώ bit, που σημαίνει ότι υπερχειλίζει, μετρώντας μέχρι το 256) - αυτή θα είναι η επιθυμητή τιμή του προκαθορισμένου χρονοδιακόπτη. Φυσικά, είναι απίθανο το αποτέλεσμα να ταιριάζει με μία από τις τυπικές τιμές προκλιμάκωσης - αυτό δεν είναι πρόβλημα, μπορείτε να πάρετε την πλησιέστερη μικρότερη κατάλληλη τιμή. Η ένδειξη θα λειτουργεί σε υψηλότερη συχνότητα, αλλά αυτό δεν θα υποβαθμίσει την ποιότητά της! Μια παρενέργεια θα είναι ένα μεγάλο φορτίο στον πυρήνα MK για ένδειξη. Εάν αυτό παρεμβαίνει πολύ στο κύριο πρόγραμμα, θα πρέπει να μεταφέρετε την ένδειξη σε άλλο χρονόμετρο, για παράδειγμα, 16-bit Χρονοδιακόπτης 1, ή εισαγάγετε έναν μετρητή για να παραλείψετε τις υπερχειλίσεις χρονοδιακόπτη:

#define SKIP 15 /* αριθμός διακοπών του χρονοδιακόπτη για παράβλεψη */ ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0, στατικό ανυπόγραφο char skip = SKIP, εάν (--skip) επιστρέψει, skip = SKIP; COLS = 0xFF; = SCR ; COLS = ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

Σε αυτά τα απλουστευμένα παραδείγματα, υποθέτουμε ότι το λιμάνι COLS, εκτός από τις κοινές καθόδους των δεικτών, τίποτα άλλο δεν συνδέεται. Ωστόσο, στην πραγματική ζωή, τέτοια ευτυχία δεν συμβαίνει συχνά, και κάτι άλλο πιθανότατα συνδέεται με τις υπόλοιπες γραμμές αυτού του λιμανιού. Επομένως, κατά την οργάνωση της δυναμικής ένδειξης, θα πρέπει πάντα να διασφαλίζεται η αμετάβλητη κατάσταση όλων των λιμενικών γραμμών που δεν εμπλέκονται άμεσα στην ένδειξη. Αυτό γίνεται απλά: αντί να γράψετε απλώς μια νέα τιμή στη θύρα, θα πρέπει να χρησιμοποιηθούν κάλυψη περιττών bits:

COLS |= 0x3F; // έτσι σβήνουμε κάθε εξοικείωση COLS &= ~(1<

Και οι δύο δηλώσεις δεν αλλάζουν την τιμή των high bits της θύρας COLS.

3.2 Μέθοδος αποκωδικοποιητή

Ο αποκωδικοποιητής μπορεί να χρησιμοποιηθεί είτε για μετατροπή ΜΑΓΕΥΩή BCDκωδικοποιήστε σε χαρακτήρες επτά τμημάτων ή για να επιλέξετε μία από τις στήλες του πίνακα. Και οι δύο επιλογές θα διαφέρουν από την απλούστερη μέθοδο που εξετάστηκε προηγουμένως μόνο ως προς τον τρόπο οργάνωσης της εξόδου στις θύρες. ΣΕΙΡΕΣκαι/ή COLSστο οποίο θα συνδεθούν οι είσοδοι του αποκωδικοποιητή.
Επιλογή χρήσης αποκωδικοποιητή για λήψη χαρακτήρα επτά τμημάτων:

ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; COLS |= 0x3F; ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

Όπως μπορείτε να δείτε, οι αλλαγές είναι ελάχιστες - πριν εμφανιστούν ΣΕΙΡΕΣκωδικός χαρακτήρων από πίνακα SCR, τα high bits καλύπτονται και μετά τα χαμηλά bit ορίζονται σύμφωνα με τον κωδικό χαρακτήρων. Δηλαδή θεωρούμε ότι ο αποκωδικοποιητής είναι συνδεδεμένος στο 4ο λιγότερο σημαντικά bits της θύρας ΣΕΙΡΕΣ.

Ελπίζω να μην έχει νόημα να δώσω ένα παράδειγμα για την αποκωδικοποίηση στηλών - ούτως ή άλλως όλα είναι ξεκάθαρα.

3.3 Μέθοδος με καταχωρητές

Αν και η δυναμική ένδειξη με χρήση καταχωρητών μετατόπισης δεν διαφέρει θεμελιωδώς από τις μεθόδους που συζητήθηκαν προηγουμένως, υπάρχουν αρκετές επιλογές για την υλοποίησή της. Θα εξετάσουμε το απλούστερο - την έξοδο των bit με καθαρά λογισμικό. Και στην εφαρμογή άλλων (χρησιμοποιώντας USI/USART/SPI/TWI) μπορείτε να δοκιμάσετε τις δυνάμεις σας στον εαυτό σας.

Για την παραλλαγή της προηγουμένως επιλεγμένης εμφάνισης των 6 διαστημάτων χαρακτήρων επτά τμημάτων, χρησιμοποιούμε 2 καταχωρητές μετατόπισης του τύπου 74HC595. Αυτός ο καταχωρητής ελέγχεται από τρία σήματα: ρολόι εισαγωγής σειριακών δεδομένων CLK, τα πραγματικά δεδομένα ΔΕΔΟΜΕΝΑκαι παλμός ταυτόχρονης παράλληλης εξόδου πληροφοριών που εγγράφονται στον καταχωρητή ΣΕΙΡΑ. Ας δηλώσουμε τις αντίστοιχες μακροεντολές (για λόγους απλότητας, θα "φέρουμε" όλα τα σήματα σε μία θύρα):

#define CLK _BV(PB0) #define DATA _BV(PB1) #define SET _BV(PB2) #define REG_PORT PORTB

Για να γράψετε στο μητρώο, είναι βολικό να γράψετε μια ξεχωριστή συνάρτηση:

Static void shift(unsigned char d)( unsigned char i; for (i=0; i< 8; i++){ // устанавливаем нужный уровень DATA if(d & 1) REG_PORT |= DATA; else REG_PORT &= ~DATA; REG_PORT |= CLK; // даем импульс CLK REG_PORT &= ~CLK; d >>= 1; } }

Είναι πολύ επιθυμητό να γίνει αυτή η συνάρτηση στατική, επειδή θα χρησιμοποιηθεί στον χειριστή διακοπής. Ο μεταγλωττιστής πιθανότατα θα κάνει στατικές συναρτήσεις στη φόρμα στη γραμμή-εισαγωγές στον χειριστή διακοπής, π.χ. Δεν θα υπάρχει περιττή χρήση της στοίβας, η οποία δεν είναι εγγυημένη για μη στατικές λειτουργίες.

Τώρα ο χειριστής διακοπών μας θα μοιάζει με αυτό:

ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; shift(SCR); shift(~(1<< pos)); REG_PORT |= SET; // выдаем импульс SET REG_PORT &= ~SET; if(++pos == SCR_SZ) pos = 0; }

Εφόσον τα δεδομένα που εγγράφονται στους καταχωρητές εμφανίζονται στις εξόδους τους ταυτόχρονα, δεν χρειάζεται να απενεργοποιήσετε πρώτα τους δείκτες. Θα πρέπει να θυμόμαστε ότι η διαδοχική έξοδος προγράμματος είναι μια μάλλον μακρά διαδικασία, ειδικά για πίνακες μεγάλων διαστάσεων, επομένως θα πρέπει να τη βελτιστοποιήσετε όσο το δυνατόν περισσότερο όσον αφορά την ταχύτητα. Αυτό μπορεί να γίνει καλύτερα χρησιμοποιώντας το υλικό σειριακής εξόδου που βρίσκεται στο MCU.

4 Για όσους δεν έχουν ποτέ αρκετό

Έτσι, εξοικειωθείτε με τα βασικά της εφαρμογής δυναμικής ένδειξης. Όμως, ως συνήθως, τα ερωτήματα δεν μειώνονται, αλλά αυξάνονται. Προβλέποντας κάποιες από αυτές, θα προσπαθήσω να δώσω άμεσα τις απαραίτητες απαντήσεις.

4.1 Άνοδοι, κάθοδοι - τι να επιλέξετε;

Όλα όσα εξετάσαμε προηγουμένως αναφέρονταν σε δείκτες με κοινές καθόδους. Και αν θέλετε να χρησιμοποιήσετε με κοινές ανόδους; Σε γενικές γραμμές, όλα παραμένουν ίδια, εκτός από το ότι πριν από την έξοδο θα χρειαστεί να αντιστραφούν τα δεδομένα - η εξάλειψη της εξοικείωσης πραγματοποιείται με την έξοδο μηδενικών σε COLS, ανάφλεξη - αντίστοιχα, μονάδες και τμήματα μέσα ΣΕΙΡΕΣθα περιλαμβάνει μηδενικά αντί για μονάδες. Έτσι ο χειριστής διακοπής γίνεται κάπως έτσι:

ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; COLS &= 0xC0; ROWS = ~SCR; COLS |= (1<< pos); if(++pos == SCR_SZ) pos = 0; }

Όλα είναι απλά. Εκτός, φυσικά, αν προσπαθήσετε να γράψετε έναν καθολικό κώδικα που να είναι κατάλληλος τόσο για κοινές ανόδους όσο και για κοινές καθόδους. Αυτό μπορεί να γίνει με δύο τρόπους: είτε χρησιμοποιώντας οδηγίες μεταγλώττισης υπό όρους, είτε χρησιμοποιώντας μια συνάρτηση μετασχηματισμού. Θα δείξω την πρώτη επιλογή και προτείνω να σκεφτείτε τη δεύτερη μόνοι σας.

#define COMMON_ANODE 1 ISR(TIMER0_OVF_vect)( static unsigned char pos = 0; #if COMMON_ANODE != 1 COLS &= 0xC0; ROWS = ~SCR; COLS |= (1<< pos); #else COLS |= 0x3F; ROWS = SCR; COLS &= ~(1 << pos); #endif if(++pos == SCR_SZ) pos = 0; }

Είναι λίγο δυσκίνητο, αλλά αν το γράψετε μία φορά, μπορείτε να το χρησιμοποιήσετε σε όλα τα έργα χωρίς σχεδόν καμία αλλαγή.

4.2 Τρεμοπαίξιμο

Σε πολλές περιπτώσεις, η οθόνη χρησιμοποιείται όχι μόνο ως μέσο εμφάνισης πληροφοριών που προέρχονται από το εσωτερικό της συσκευής, αλλά και για εμφάνιση πληροφοριών που εισάγει ο χρήστης. Και σε αυτήν την περίπτωση, είναι απαραίτητο να μπορείτε να διαχωρίσετε με κάποιο τρόπο το αμετάβλητο από το μεταβλητό στην οθόνη. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι να κάνετε την αντίστοιχη εξοικείωση (ή πολλές εξοικειώσεις) να τρεμοπαίζουν.

Είναι πολύ εύκολο να γίνει αυτό. Ας εισαγάγουμε μια καθολική μεταβλητή, κάθε μεμονωμένο bit της οποίας θα υποδηλώνει μια οικειότητα που αναβοσβήνει:

ανυπόγραφο αναβοσβήνει = 0;

Τώρα τροποποιούμε λίγο τον χειριστή διακοπής:

ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; στατική ανυπόγραφη καταχώρηση χαρακτήρων = 0; COLS |= 0x3F; if(!(αναβοσβήνει & (1<

Όπως μπορείτε να δείτε, έχει προστεθεί μόνο μία στατική μεταβλητή - ο μετρητής των εισόδων στον χειριστή διακοπών είσοδος, και έναν χειριστή δοκιμής κατάστασης. Η λογική είναι απλή: η έξοδος της επόμενης εξοικείωσης πραγματοποιείται μόνο εάν υπάρχει στο αντίστοιχο bit αναβοσβήνωμηδέν ή το πιο σημαντικό κομμάτι του μετρητή είσοδοςισούται με 1. Αν, ας υποθέσουμε, αναβοσβήνωπεριέχει όλα τα μηδενικά, τότε αυτή η συνθήκη ικανοποιείται πάντα - εμφανίζεται όλη η εξοικείωση. Αν αναβοσβήνωπεριέχει 1 σε ένα από τα bit του, τότε ο αντίστοιχος χαρακτήρας θα εμφανίζεται μόνο τη στιγμή που το πιο σημαντικό bit του μετρητή είναι 1. Επειδή ο μετρητής αυξάνεται κάθε φορά που εισάγεται ο χειριστής διακοπής, ο αντίστοιχος χαρακτήρας θα τρεμοπαίζει σε συχνότητα 128 φορές μικρότερη από τη συχνότητα διακοπής.

4.3 Ρύθμιση της φωτεινότητας των τμημάτων

Έγραψα για τη ρύθμιση της φωτεινότητας σε ένα ξεχωριστό άρθρο, το οποίο ονομάστηκε έτσι.

4.4 Αυθαίρετη διανομή συμπερασμάτων

Νωρίτερα ειπώθηκε ότι η ευτυχία να διατεθεί ολόκληρη η θύρα MK για ένδειξη πέφτει πολύ σπάνια. Αλλά ακόμα λιγότερο συχνά είναι τυχερό να αποκτήσετε ένα βολικό ίχνος PCB εάν η μία θύρα χρησιμοποιείται εξ ολοκλήρου για τις σειρές και η άλλη θύρα χρησιμοποιείται για τις στήλες της μήτρας οθόνης. Πολύ πιο συχνά, η βέλτιστη δρομολόγηση επιτυγχάνεται μόνο όταν σειρές και στήλες αναμιγνύονται μεταξύ δύο ή και περισσότερων θυρών του μικροελεγκτή. Δεν θα χρειαστεί να θυσιάσετε την ομορφιά της πλακέτας τυπωμένου κυκλώματος εάν οργανώσετε την εναλλαγή bit λογισμικού κατά την ένδειξη.

Ας εξετάσουμε ένα αφηρημένο παράδειγμα. Αφήστε την καλύτερη ανίχνευση να παρέχεται με την ακόλουθη κατανομή σημάτων κατά μήκος των γραμμών των θυρών MC:

Τμήμα Α

Τμήμα Β

τμήμα Η

Τμήμα Γ

Τμήμα Δ

Τμήμα G

Τμήμα Ε

Τμήμα ΣΤ

Όπως μπορείτε να δείτε, οι γραμμές μήτρας αναμειγνύονται μεταξύ των τριών θυρών και όλες οι αχρησιμοποίητες γραμμές αυτών των θυρών δεν θα πρέπει, φυσικά, να αλλάξουν τα επίπεδά τους κατά τη διαδικασία ένδειξης.

Είναι καλύτερο να ξεκινήσετε την ανάπτυξη μιας συνάρτησης δυναμικής ένδειξης για αυτήν την περίπτωση κατανέμοντας τα τμήματα στα bit συμβόλων. Προηγουμένως, το θεωρούσαμε στον πίνακα SCRαποθηκεύουμε μάσκες bit χαρακτήρων, π.χ. Οι μονάδες σε ένα byte υποδηλώνουν φωτεινά τμήματα. Δεν σκεφτήκαμε ποιο bit αντιστοιχεί σε ποιο τμήμα. Λοιπόν, τώρα είναι η ώρα να το σκεφτούμε.

Είναι βολικό να ζωγραφίσετε το σκοπό των γραμμών λιμένων με τη μορφή τριών πλακών:

1

ΕΝΑ

0

4

H

3

2

σι

φά

μι

5

σολ

ρε

ντο

Πρέπει να συγκεντρώσουμε όλα τα τμήματα σε ένα byte. Θα πρέπει να το κάνετε αυτό με λειτουργίες βάρδιας, επομένως θα πρέπει να προσπαθήσετε να τις διανείμετε έτσι ώστε να κάνετε ελάχιστες βάρδιες. Ας συζητήσουμε.

Αν το τμήμα μπιτ FEGDCαφήστε στο σύμβολο ώστε να πέσουν μέσα PORTDχωρίς μετατοπίσεις, μετά το τμήμα Hμπορεί επίσης να παραμείνει στο 6ο bit του χαρακτήρα και επίσης δεν χρειάζεται να μετατοπιστεί πριν από την έξοδο PORTC, αλλά για τμήματα ΑΛΛΑκαι ΣΤΟΤα bit 7 και 3 θα παραμείνουν, δηλαδή πιθανότατα ένα τμήμα ΣΤΟθα πρέπει να μετατοπιστεί κατά 3 θέσεις πριν από την έξοδο, και το τμήμα ΑΛΛΑ- με 6. Θα σταματήσω σε αυτήν την επιλογή και μπορείτε να συνεχίσετε την αναζήτηση για τις ελάχιστες βάρδιες (οι βάρδιες σε πολλές θέσεις δεν είναι τόσο γρήγορη λειτουργία, επομένως είναι επιθυμητό να μειώσετε τον αριθμό τους στο ελάχιστο).

Έτσι, στην περίπτωσή μας, πήραμε την ακόλουθη κατανομή bit ανά byte-χαρακτήρα:

ΕΝΑ

H

φά

μι

σι

σολ

ρε

ντο

Σημειώστε τις μάσκες bit για έξοδο στις κατάλληλες θύρες:

ρε

0

0

1

1

0

1

1

1

0x37

σι

1

0

0

0

0

0

0

0

0x80

ντο

0

1

0

0

1

0

0

0

0x48

Με τη βοήθεια αυτών των μασκών, χρησιμοποιώντας τη λειτουργία “bitwise AND” επιλέγουμε τα απαραίτητα bit για έξοδο στη θύρα.

Ας δηλώσουμε σταθερές μάσκας:

#define MASKD 0x37 #define MASKC 0x80 #define MASKC 0x48

Προηγουμένως, βγάζαμε έναν χαρακτήρα σε μία θύρα ΣΕΙΡΕΣ, τώρα αυτή η διαδικασία χωρίζεται σε τρία μέρη:

PORTD = (PORTD & ~MASKD) | (SCR & MASKD); PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6); PORTC = (PORTC & ~MASKC) | ((SCR & _BV(6)) | (((SCR & _BV(3)) >> 3);

Σημειώστε ότι για έξοδο σε PORTCένα bit πρέπει να βγαίνει χωρίς μετατόπιση και το δεύτερο - με μετατόπιση, έτσι αντί για ΜΑΣΚΑέπρεπε να χρησιμοποιήσει ξεχωριστές μακροεντολές _BV().

Τώρα μένει να αποφασίσουμε πώς θα σβήσουμε και θα ανάψουμε την αντίστοιχη οικειότητα. Ας δηλώσουμε τις σταθερές που αντιστοιχούν στα bit ελέγχου εξοικείωσης:

#define COM0 _BV(0) #define COM1 _BV(3) #define COM2 _BV(4) #define COM3 _BV(5) #define COM4 _BV(7) #define COM5 _BV(3) #define COM_D (COM5) #define COM_C (COM2 | COM3 | COM4) #define COM_B (COM0 | COM1)

Για να εξαφανιστεί κάθε εξοικείωση, είναι απαραίτητο να εξάγετε τις αντίστοιχες σταθερές στις θύρες COM_x:

PORTD |= COM_D; PORTC |= COM_C; PORTB |= COM_B;

Αλλά για να ενεργοποιήσετε την εξοικείωση, θα πρέπει να είστε έξυπνοι (δεν έχει νόημα να κάνετε έξοδο και στις τρεις θύρες, επειδή μόνο ένα bit σε μια συγκεκριμένη θύρα θα είναι ενεργό, ανάλογα με την τιμή pos), για παράδειγμα, χρησιμοποιώντας τον τελεστή διακόπτης:

Switch(pos)( case 0: PORTB &= ~COM0; break; case 1: PORTB &= ~COM1; break; case 2: PORTC &= ~COM2; break; case 3: PORTC &= ~COM3; break; case 4: PORTC &= ~COM4; διάλειμμα; περίπτωση 5: PORTD &= ~COM5; διάλειμμα; )

Δεν είναι ο πιο όμορφος τρόπος, αλλά λειτουργεί.

Έτσι, ο χειριστής διακοπών μας έχει την ακόλουθη μορφή:

ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; στατική ανυπόγραφη καταχώρηση char = 0; // σβήσιμο PORTD |= COM_D; PORTC |= COM_C; PORTB |= COM_B; // έξοδος PORTD = (PORTD & ~MASKD) SCR & MASKD); PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6); PORTC = (PORTC & ~MASKC) | ((SCR & _BV(6)) | ((SCR & _BV (3)) >> 3); // αναβοσβήνει αν(!(αναβοσβήνει & (1<< pos)) || (++entry & 0x80)) { switch(pos){ case 0: PORTB &= ~COM0; break; case 1: PORTB &= ~COM1; break; case 2: PORTC &= ~COM2; break; case 3: PORTC &= ~COM3; break; case 4: PORTC &= ~COM4; break; case 5: PORTD &= ~COM5; break; } } if(++pos == SCR_SZ) pos = 0; }

Τώρα μένει να καταλάβουμε πώς να περιγράψουμε τα σύμβολα για έξοδο με πιο βολικό τρόπο… Προτείνω να κάνετε τα εξής: ορίστε σταθερές που αντιστοιχούν στα bit των τμημάτων και, στη συνέχεια, «κατασκευάστε» τα απαραίτητα σύμβολα από αυτές τις σταθερές:

// στοιχειώδη τμήματα #define _A _BV(7) #define _B _BV(3) #define _C _BV(0) #define _D _BV(1) #define _E _BV(4) #define _F _BV(5) #define _G _BV (2) #define _H _BV(6) // ψηφιακά σύμβολα #define d_0 (_A | _B | _C | _D | _E | _F) #define d_1 (_B | _C) #define d_2 (_A | _B | _G | _D | _Ε) // και ούτω καθεξής

Επομένως, εάν πρέπει να εκτυπώσετε ένα μηδέν στα δεξιά της οθόνης, πρέπει απλώς να γράψετε στη σωστή θέση:

SCR = d_0;

Εάν σε άλλο έργο πρέπει να κατανείμετε τα bit διαφορετικά, θα αλλάξετε μόνο τους αριθμούς στις μακροεντολές _BV()για στοιχειώδη τμήματα και όλοι οι χαρακτήρες θα "επαναδημιουργηθούν" αυτόματα. Για τις απλούστερες περιπτώσεις που περιγράφηκαν στην αρχή, δεν θα χρειαστεί να κάνετε τίποτα άλλο, αλλά για την επιλογή "ανταλλαγής κομματιών", θα πρέπει, φυσικά, να το τσιμπήσετε.

4.5 Υποστήριξη κουμπιών

Με την παραδοσιακή έλλειψη εξόδων MK, το πρόβλημα του μεγάλου αριθμού κουμπιών, χωρίς τα οποία σπάνια μπορεί να κάνει οποιαδήποτε συσκευή, είναι πολύ οξύ. Χρησιμοποιούνται διάφορα εγκλείσματα μήτρας κ.λπ. κόλπα, ωστόσο, περιπλέκοντας ελαφρώς τη λειτουργία της δυναμικής ένδειξης, είναι εύκολο να έχετε στη διάθεσή σας τόσα κουμπιά όσα εξοικείωση υπάρχουν στην οθόνη, ενώ επιπλέον χρειάζεται να χρησιμοποιήσετε μόνο μία θύρα του μικροελεγκτή. Είναι αλήθεια ότι κάθε κουμπί πρέπει ακόμα να τοποθετηθεί σε μια δίοδο.

Σχηματικά, αυτό φαίνεται στο σχήμα.

Και προγραμματικά μοιάζει με αυτό:

#define keypin() (!(PIND & _BV(KEY))) ISR(TIMER0_OVF_vect)( στατικό ανυπόγραφο char pos = 0; στατική ανυπόγραφη καταχώρηση χαρακτήρων = 0; στατικό ανυπόγραφο χαρακτήρα tmp_key = 0; ROWS = 0; if(keypin( )) tmp_key |= 1<< pos; COLS |= 0x3F; if(!(blink & (1<< pos)) || (++entry &0x80)){ ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1 << pos); } if(++pos == SCR_SZ){ pos = 0; key = tmp_key; tmp_key = 0; } }

Εδώ κλειδί- αυτή είναι μια μακροεντολή που ορίζει το bit της επιλεγμένης θύρας, στην οποία όλα τα κουμπιά είναι "συνδεδεμένα", η μακροεντολή keypin()επιστρέφει τη δυαδική τιμή TRUE εάν η επιλεγμένη ακίδα είναι λογικά χαμηλή. Στο παράδειγμα, τα κουμπιά συνδέονται με PORTD.

Κάθε φορά που εμφανίζεται μια διακοπή του χρονοδιακόπτη, όλα τα τμήματα σβήνουν πρώτα - αυτό είναι απαραίτητο ώστε το ρεύμα μέσω των LED να μην οδηγεί σε λανθασμένη μη ανίχνευση ενός πατημένου κουμπιού. Μετά από αυτό, η είσοδος του κουμπιού μετριέται - εάν υπάρχει χαμηλό επίπεδο, τότε πιέζεται το κουμπί που είναι συνδεδεμένο στην αντίστοιχη κάθοδο pos. Σε μια μεταβλητή tmp_keyσυσσωρεύονται καταστάσεις κουμπιών, οι οποίες ξαναγράφονται σε μια καθολική μεταβλητή κλειδίμετά την ολοκλήρωση του κύκλου εμφάνισης. Απλά πρέπει να αναλύετε την αξία από καιρό σε καιρό κλειδίκαι χειριστείτε τις πιέσεις που εντοπίστηκαν:

Στατικός ανυπόγραφος χαρακτήρας get_key()( ανυπόγραφο char tmp = 0; tmp = κλειδί; _delay_ms(10); if(key == tmp) επιστροφή tmp; αλλιώς επιστροφή 0; )

Αυτή η απλή λειτουργία εγγυάται ότι δεν θα υπάρχει συνομιλία με κουμπιά, παρόλο που, λόγω της «δυναμικής» φύσης της ψηφοφορίας με κουμπιά, η πιθανότητα συνομιλίας είναι ήδη χαμηλή.

5 Τι άλλο;

Έτσι, έχετε κατακτήσει αρκετά τυπικές τεχνικές για την υλοποίηση δυναμικής ένδειξης. Νομίζω ότι αυτό θα σου είναι αρκετό για πρώτη φορά, ίσως και για την υπόλοιπη ζωή σου. Στο τέλος, το κύριο πράγμα είναι η κατανόηση των τεχνικών και των αλγορίθμων και οι λεπτές αποχρώσεις και οι αποχρώσεις μπορούν πάντα να προστεθούν μόνοι σας. Τι άλλο όμως μπορεί να περιμένει «κοντά» στη δυναμική ένδειξη;

Όπως είπα νωρίτερα, μπορείτε να προσθέσετε, έως και ανεξάρτητη ρύθμιση για κάθε τμήμα.

Μπορείτε να σκεφτείτε τη βέλτιστη λειτουργία του χειριστή διακοπών - για εκπαιδευτικούς σκοπούς έγραψα μάλλον πρόχειρο κώδικα, για παράδειγμα, χρησιμοποίησα παντού SCR, αν και θα ήταν πιο βέλτιστο να διαβάσετε την τιμή σε μια τοπική μεταβλητή μία φορά και στη συνέχεια να λειτουργήσετε με την τιμή της. Αν και ο βελτιστοποιητής σίγουρα θα βοηθήσει με την προσέγγισή μου, για λόγους εξάσκησης, αξίζει να προσπαθήσετε και να βελτιστοποιήσετε τον εαυτό σας, ελέγχοντας τον εαυτό σας από το μέγεθος του κώδικα που προκύπτει ή/και την ταχύτητα του προγράμματος.

Μπορείτε να σκεφτείτε την ενδιαφέρουσα ιδέα της αυτόματης ρύθμισης της φωτεινότητας της οθόνης ανάλογα με το επίπεδο του φωτός του περιβάλλοντος. Όπως γνωρίζετε, οι ενδείξεις LED είναι όσο χειρότερα διακρίνονται, όσο πιο σκούρο είναι γύρω - απλώς θολώνουν. Επομένως, στο σκοτάδι, είναι λογικό να μειωθεί η φωτεινότητα των ενδείξεων, αυξάνοντάς την κατά τη διάρκεια της ημέρας. Το πιο απλό πράγμα είναι να χρησιμοποιήσετε μια ξεχωριστή φωτοαντίσταση ή LED ως αισθητήρα φωτός, αλλά μπορείτε να το κάνετε διαφορετικά: είναι γνωστό ότι το LED μπορεί να λειτουργήσει και ως φωτοδίοδος, οπότε αν χρησιμοποιήσετε τη θύρα που είναι συνδεδεμένη στην είσοδο για ένδειξη ADC, στη συνέχεια, αν θέλετε, μπορείτε να μετρήσετε το photo-emf του μη φωτεινού τμήματος της ένδειξης και να χρησιμοποιήσετε αυτήν την τιμή για να ρυθμίσετε τη φωτεινότητα ...

Μπορείτε να σκεφτείτε τη χρήση της σειριακής εξόδου υλικού, την οποία έχω ήδη υπαινιχθεί.

Μια ενδιαφέρουσα εκδοχή μιας εντελώς καθολικής προσέγγισης για τη δυναμική ένδειξη, την οποία προτείνω επίσης να εξοικειωθείτε, προτάθηκε από MOLCHEC. Εν συντομία, η ουσία: η κατανομή των τμημάτων ανά bit χαρακτήρων, η εκχώρηση θυρών για τον έλεγχο του δείκτη, ακόμη και ο τύπος του δείκτη - εν συντομία, όλες οι παράμετροι - ορίζονται με τη μορφή πίνακα διαμόρφωσης στο EEPROM. Προγραμματικά, όλα οργανώνονται με βάση αυτόν τον πίνακα: από την αντιστροφή ανάλογα με τον τύπο του δείκτη, έως την εναλλαγή bit σε διαφορετικές θύρες. Ταυτόχρονα, ο πηγαίος κώδικας του προγράμματος δυναμικής ένδειξης παραμένει πάντα αμετάβλητος και ο πίνακας ρυθμίσεων καταρτίζεται από τον τελικό χρήστη, ανάλογα με τις προτιμήσεις του. Η μέθοδος είναι πράγματι καθολική και ευέλικτη, ωστόσο, σχετίζεται με αυξημένη κατανάλωση μνήμης προγράμματος.


3 Γραμμένο από ARV, στις 06:48 25/08/2010
Μίσα, αν ήμουν στη θέση σου, δεν θα έδινα τέτοιες επιτακτικές δηλώσεις "δεν μπορείς να το κάνεις", "κανείς δεν έγραψε" ή "πνευματικά δικαιώματα", γιατί πρώτον, αυτό δεν είναι ευγενικό και δεύτερον:
1. Έκανα μια τρέχουσα γραμμή σε μια μήτρα 10x16 πριν από πολύ καιρό (τι ήταν) - μπορείτε να βρείτε ένα βίντεο της δουλειάς της σε αυτή τη σημείωση http://site/content/view/160/38/
2. Έγραψα ένα άρθρο (θα το βρείτε στις ειδήσεις - το τελευταίο για σήμερα) για το πώς να φτιάξετε ένα ticker στην LCD. αν καταπονήσετε λίγο τον εγκέφαλό σας, τότε το να επαναλάβετε τον αλγόριθμο για την έξοδο σε μια μήτρα είναι ασήμαντο.
3. δεν υπάρχει ούτε ένα άρθρο στο site μου αντιγραμμένο από κάπου (το copy-paste δεν είναι πνευματικό δικαίωμα, το έχεις σφραγίσει), όλα τα υλικά είναι εντελώς πρωτότυπα. πολλοί ιστότοποι έχουν αντίγραφα αυτού του υλικού με την άδειά μου (ή την άδεια των δημιουργών του υλικού, οι οποίοι έχουν κάθε δικαίωμα να δημοσιεύουν το υλικό τους ταυτόχρονα σε πολλά μέρη).

Μόνο οι εγγεγραμμένοι χρήστες μπορούν να αφήσουν σχόλια.
Εγγραφείτε ή συνδεθείτε στον λογαριασμό σας.

Οι δείκτες βρίσκονται συνήθως σε μέρη κατάλληλα για την προβολή των πληροφοριών που εμφανίζονται σε αυτές. Το υπόλοιπο ψηφιακό κύκλωμα μπορεί να βρίσκεται σε άλλες πλακέτες τυπωμένων κυκλωμάτων. Με την αύξηση του αριθμού των ενδείξεων, ο αριθμός των αγωγών μεταξύ της πλακέτας ενδείξεων και της ψηφιακής πλακέτας αυξάνεται. Αυτό οδηγεί σε ορισμένες δυσκολίες στην ανάπτυξη του σχεδιασμού και της λειτουργίας του εξοπλισμού. Ο ίδιος λόγος οδηγεί σε αύξηση του κόστους του.

Ο αριθμός των αγωγών σύνδεσης μπορεί να μειωθεί κάνοντας τους δείκτες να λειτουργούν σε παλμική λειτουργία. Το ανθρώπινο μάτι έχει αδράνεια και εάν οι δείκτες αναγκαστούν να εμφανίζουν πληροφορίες εναλλάξ με αρκετά υψηλή ταχύτητα, τότε θα φαίνεται σε ένα άτομο ότι όλοι οι δείκτες εμφανίζουν τις πληροφορίες τους συνεχώς. Ως αποτέλεσμα, είναι δυνατή η εναλλάξ μετάδοση των εμφανιζόμενων πληροφοριών στους ίδιους αγωγούς. Συνήθως αρκεί ένας ρυθμός ανανέωσης 50 Hz, αλλά είναι καλύτερο να αυξήσετε αυτή τη συχνότητα στα 100 Hz.

Ας δούμε το μπλοκ διάγραμμα της συμπερίληψης ενδείξεων LED επτά τμημάτων, που φαίνεται στο Σχήμα 1. Αυτό το κύκλωμα μπορεί να παρέχει μια δυναμική ένδειξη των ψηφιακών πληροφοριών εξόδου.


Εικόνα 1. Δομικό διάγραμμα δυναμικής ένδειξης

Το κύκλωμα που φαίνεται στο σχήμα 1 εμφανίζει τέσσερα ψηφιακά ψηφία. Κάθε bit συνδέεται για λίγο στην είσοδο του διακόπτη. Η γεννήτρια χρησιμοποιείται για τη ρύθμιση της ταχύτητας ενημέρωσης των πληροφοριών στους δείκτες. Ο δυαδικός μετρητής δημιουργεί διαδοχικά τέσσερις καταστάσεις του κυκλώματος και μέσω των πλήκτρων παρέχει εναλλακτική τροφοδοσία στους δείκτες επτά τμημάτων.

Ως αποτέλεσμα, όταν ο διακόπτης παρέχει έναν κωδικό BCD από την είσοδο A στις εισόδους ενός αποκωδικοποιητή επτά τμημάτων, αυτός ο κωδικός εμφανίζεται στην ένδειξη HL1. Όταν ο διακόπτης παρέχει έναν κωδικό BCD από την είσοδο Β στις εισόδους του αποκωδικοποιητή επτά τμημάτων, αυτός ο κωδικός εμφανίζεται στην ένδειξη HL2 και ούτω καθεξής σε έναν κύκλο.

Ο ρυθμός ενημέρωσης πληροφοριών στο εξεταζόμενο κύκλωμα θα είναι τέσσερις φορές μικρότερος από τη συχνότητα της γεννήτριας. Δηλαδή, για να ληφθεί συχνότητα τρεμοπαίσματος δείκτη 100 Hz, απαιτείται συχνότητα ταλαντωτή 400 Hz.

Πόσες φορές έχουμε μειώσει τον αριθμό των αγωγών σύνδεσης ως αποτέλεσμα; Εξαρτάται από το πού σχεδιάζουμε τη διατομή του κυκλώματος. Εάν αφήσουμε μόνο ενδείξεις στον πίνακα ενδείξεων, τότε η λειτουργία τους θα απαιτήσει 7 σήματα πληροφοριών για τα τμήματα και τέσσερα σήματα μεταγωγής. Υπάρχουν 11 αγωγοί συνολικά. Σε ένα στατικό κύκλωμα ένδειξης, θα χρειαζόμασταν 7 × 4 = 28 αγωγούς. Όπως μπορείτε να δείτε, υπάρχει μια νίκη. Κατά την υλοποίηση μιας μονάδας οθόνης 8-bit, το κέρδος θα είναι ακόμη μεγαλύτερο.

Ένα ακόμη μεγαλύτερο κέρδος θα είναι εάν η διατομή του κυκλώματος τραβηχτεί κατά μήκος των εισόδων των δεικτών. Σε αυτήν την περίπτωση, μια τετραψήφια μονάδα οθόνης θα απαιτήσει μόνο έξι αγωγούς σήματος και δύο αγωγούς ισχύος κυκλώματος. Ωστόσο, ένα τέτοιο σημείο διατομής του κυκλώματος δυναμικής ένδειξης χρησιμοποιείται πολύ σπάνια.

Τώρα ας υπολογίσουμε το ρεύμα που διαρρέει κάθε τμήμα του LED όταν είναι αναμμένο. Για να γίνει αυτό, χρησιμοποιούμε το ισοδύναμο κύκλωμα ροής ρεύματος μέσω ενός από τα τμήματα του δείκτη. Αυτό το σχήμα φαίνεται στο σχήμα 2.


Όπως αναφέρθηκε προηγουμένως, ένα LED απαιτεί ρεύμα από 3 έως 10 mA για να λειτουργήσει σωστά. Ας ρυθμίσουμε το ελάχιστο ρεύμα του LED στα 3 mA. Ωστόσο, στον παλμικό τρόπο λειτουργίας, η φωτεινότητα της λάμψης του δείκτη μειώνεται κατά N φορές, όπου ο συντελεστής N είναι ίσος με τον κύκλο λειτουργίας των παλμών ρεύματος που παρέχονται σε αυτόν τον δείκτη.

Εάν πρόκειται να διατηρήσουμε την ίδια φωτεινότητα της λάμψης, τότε πρέπει να αυξήσουμε την τιμή του παλμικού ρεύματος που διαρρέει το τμήμα κατά Ν φορές. Για έναν οκταψήφιο δείκτη, ο συντελεστής N είναι ίσος με οκτώ. Ας υποθέσουμε ότι αρχικά επιλέξαμε ένα στατικό ρεύμα μέσω του LED ίσο με 3 mA. Στη συνέχεια, για να διατηρηθεί η ίδια φωτεινότητα του LED σε έναν οκταψήφιο δείκτη, απαιτείται παλμικό ρεύμα:

I seg din = σεγ στατ× Ν= 3mA×8 = 24mA.

Μόνο κάποιες σειρές ψηφιακών μικροκυκλωμάτων δύσκολα μπορούν να παρέχουν τέτοιο ρεύμα. Για τις περισσότερες σειρές μικροκυκλωμάτων, απαιτούνται ενισχυτές που κατασκευάζονται σε διακόπτες τρανζίστορ.

Τώρα ας προσδιορίσουμε το ρεύμα που θα διαρρέει το κλειδί, μεταβάλλοντας την ισχύ σε μεμονωμένα bit μιας μονάδας οθόνης οκτώ bit. Όπως φαίνεται από το κύκλωμα που φαίνεται στο Σχήμα 2, το ρεύμα οποιουδήποτε τμήματος του δείκτη μπορεί να ρέει μέσω του κλειδιού. Όταν εμφανιστεί ο αριθμός 8, θα χρειαστεί να ανάψετε και τα επτά τμήματα της ένδειξης, πράγμα που σημαίνει ότι το ρεύμα παλμού που διαρρέει το πλήκτρο αυτή τη στιγμή μπορεί να προσδιοριστεί ως εξής:

cl \u003d Segφασαρία× N seg= 24mA×7 = 168mA.

Πώς σας φαίνεται αυτό το ρεύμα;! Σε ραδιοερασιτεχνικά κυκλώματα, συναντώ συχνά λύσεις όπου το ρεύμα μεταγωγής λαμβάνεται απευθείας από την έξοδο του αποκωδικοποιητή, ο οποίος δεν μπορεί να δώσει ρεύμα μεγαλύτερο από 20 mA, και αναρωτιέμαι - πού μπορώ να δω έναν τέτοιο δείκτη; Στο απόλυτο σκοτάδι; Αποδεικνύεται μια "συσκευή νυχτερινής όρασης", δηλαδή μια συσκευή της οποίας οι μετρήσεις είναι ορατές μόνο στο απόλυτο σκοτάδι.

Και τώρα ας δούμε το σχηματικό διάγραμμα της μονάδας εμφάνισης που προκύπτει. Φαίνεται στο Σχήμα 3.



Εικόνα 3. Σχηματικό διάγραμμα του μπλοκ δυναμικής ένδειξης

Τώρα, αφού λάβουμε το κύκλωμα δυναμικής ένδειξης, μπορούμε να συζητήσουμε τα πλεονεκτήματα και τα μειονεκτήματά του. Το αναμφισβήτητο πλεονέκτημα της δυναμικής ένδειξης είναι ο μικρός αριθμός καλωδίων σύνδεσης, γεγονός που το καθιστά απαραίτητο σε ορισμένες περιπτώσεις, όπως η εργασία με δείκτες μήτρας.

Ως μειονέκτημα, θα πρέπει να αναφερθεί η παρουσία μεγάλων παλμικών ρευμάτων και δεδομένου ότι οποιοσδήποτε αγωγός είναι μια κεραία, η δυναμική ένδειξη χρησιμεύει ως ισχυρή πηγή παρεμβολής. Μια άλλη οδός για παρεμβολές είναι η παροχή ρεύματος.

Σημειώστε ότι τα μέτωπα των παλμών μεταγωγής είναι πολύ μικρά, επομένως οι αρμονικές συνιστώσες τους καλύπτουν το εύρος ραδιοσυχνοτήτων έως και υπερμικρά κύματα.

Έτσι, η χρήση δυναμικής ένδειξης επιτρέπει την ελαχιστοποίηση του αριθμού των καλωδίων σύνδεσης μεταξύ της ψηφιακής συσκευής και της ένδειξης, αλλά ταυτόχρονα είναι μια ισχυρή πηγή παρεμβολών, επομένως η χρήση της σε ραδιοφωνικούς δέκτες είναι ανεπιθύμητη.

Εάν για κάποιο λόγο, για παράδειγμα, η ανάγκη χρήσης δεικτών μήτρας, πρέπει να χρησιμοποιήσετε δυναμική ένδειξη, τότε πρέπει να λάβετε όλα τα μέτρα για να καταστείλετε τις παρεμβολές.

Ως μέτρα για την καταστολή παρεμβολών από τη δυναμική ένδειξη, μπορεί να αναφερθεί η θωράκιση της μονάδας, το καλώδιο σύνδεσης και οι πλακέτες. Η χρήση του ελάχιστου μήκους των καλωδίων σύνδεσης, η χρήση φίλτρων ισχύος. Κατά τη θωράκιση ενός μπλοκ, μπορεί να είναι απαραίτητο να θωρακίσετε τους ίδιους τους δείκτες. Σε αυτή την περίπτωση, χρησιμοποιείται συνήθως ένα μεταλλικό πλέγμα. Αυτό το πλέγμα μπορεί ταυτόχρονα να αυξήσει την αντίθεση των χαρακτήρων που εμφανίζονται.

Βιβλιογραφία:

Μαζί με το άρθρο «Δυναμική ένδειξη» διαβάζουν:

Οι δείκτες έχουν σχεδιαστεί για να εμφανίζουν διάφορους τύπους πληροφοριών για ένα άτομο. Η πιο απλή πληροφορία είναι...
http://website/digital/Indic.php

Οι δείκτες εκφόρτισης χρησιμοποιούνται τόσο για την ένδειξη πληροφοριών bit όσο και για την εμφάνιση δεκαδικών πληροφοριών. Κατά την κατασκευή δεκαδικών δεικτών της καθόδου...
http://website/digital/GazIndic/

Επί του παρόντος, τα LED χρησιμοποιούνται σχεδόν παντού για την εμφάνιση δυαδικών πληροφοριών. Αυτό οφείλεται σε...
http://website/digital/LED.php

Αρχές λειτουργίας δεικτών υγρών κρυστάλλων ... Τρόποι λειτουργίας δεικτών υγρών κρυστάλλων ... Σχηματισμός έγχρωμης εικόνας ...
http://website/digital/LCD.php

ρεΓια να εμφανίσετε έναν πολυψήφιο αριθμό στην ένδειξη, πρέπει πρώτα να εκτελέσετε έναν περίπλοκο χειρισμό με αυτόν, ο οποίος συνίσταται στη διάσπαση του αριθμού στα συστατικά του. Ως παράδειγμα, θα δώσω την εμφάνιση του αριθμού 1234 σε έναν τετραπλό δείκτη επτά τμημάτων με μια κοινή άνοδο.


Για να εμφανίσετε έναν τετραψήφιο αριθμό, πρέπει να δημιουργήσετε μια κοινή μεταβλητή στην οποία θα βρίσκεται ο αριθμός που θέλετε να εμφανίσετε (μεταβλητή W), τέσσερις μεταβλητές που θα αποθηκεύουν δεδομένα για κάθε χαρακτήρα (Ν) και τέσσερις ακόμη μεταβλητές για ενδιάμεσους μετασχηματισμούς (Μ) για να μην αγγίξετε την κύρια μεταβλητή. Η μεταβλητή πρέπει να αντιστοιχεί στην τιμή που θα αποθηκευτεί σε αυτήν.ΕΓΩ. Έτσι για μια μεταβλητήWο τύπος θα είναι αρκετόςακέραιος αριθμός , αφού μια μεταβλητή αυτού του τύπου είναι ικανή για xpΚινούμενη κίνηση τιμών από -32768 έως +32767 (ήλέξη εκτός αν σκοπεύετε να χρησιμοποιήσετε αρνητικούς αριθμούς). Σε μεταβλητέςΝθα βρίσκονται αριθμοί από το 0 έως το 9, επομένως θα αρκεί η χρήση μιας μεταβλητής τύπουψηφιόλεξη
. Και σε μεταβλητέςΜ θα είναιτις ίδιες τιμές όπως στη μεταβλητήW, οπότε ορίζουμε τον τύπο ακέραιος αριθμός .

Dim W ως ακέραιος αριθμός
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 ως ακέραιος αριθμός
Dim M2 ως ακέραιος αριθμός
Dim M3 ως ακέραιος αριθμός
Dim M4 ως ακέραιος αριθμός


Μετά τη δήλωση μεταβλητών, ρυθμίζουμε θύρες για έξοδοπου θα χρησιμοποιηθεί για τη σύνδεση του δείκτη:

DDRC = &B11111111
DDRD = &B11111111


DDRC=&B 00001111 και DDRD=&B 01111111 (τέσσερα πρώτα σκέλη της θύρας Cγια ανόδους και έξι πρώτες θύρες D υποτμήματα).

Στη συνέχεια αντιστοιχίστε σε μια μεταβλητή W την τιμή που θα εμφανίσουμε στην ένδειξη:

W=1234

"Arial","sans serif""> Στον κύριο βρόχο του προγράμματος, εκχωρούμε στις μεταβλητές M την τιμή της μεταβλητήςW, κάνω αυτό:

Μ1=Δ
Μ2 = Μ1
Μ3 = Μ1
Μ4 = Μ1


"Arial","sans serif""> Αυτό δεν είναι παράνοια)), αυτό γίνεται με σκοπό σε όλες τις μεταβλητές M να υπάρχει ο ίδιος αριθμός, αφού κατά τη λειτουργία ανάθεσης μπορεί εύκολα να διαρρήξει μια διακοπή (αν υπάρχει και δεν είναι απενεργοποιημένη), στον χειριστή της οποίας η μεταβλητήW μπορεί να αλλάξει. Και αν η ανάθεση πήγε ως εξής: М1=Δ , Μ 2= Δ , Μ 3= Δ , Μ 4= Δ στις μεταβλητές M θα βρίσκεται διαφορετικές έννοιεςπου θα οδηγήσει σε μπάχαλο στις αναγνώσεις.

Μετά την ανάθεση μεταβλητές τιμέςξεκινήστε να εργάζεστε με
καθένα από αυτά, μετατρέποντας με τέτοιο τρόπο ώστε σε μεταβλητήΝ πήρε την αξία που θα είναι
εμφανίζεται στην ένδειξη: σε μια μεταβλητή
Ν Το 1 θα πρέπει να είναι "1", σε N 2 - "2", στο N 3 - "3", και στο N 4 - "4".

M1=M1/1000" M1=1234/1000=1,234
N1=Abs(m1)" N1=Abs(1.234)=1

κοιλιακούς – μια συνάρτηση που επιστρέφει έναν ακέραιο αριθμό μιας μεταβλητής Σε μια μεταβλητήΝ 1 χτύπησε τη μονάδα, η οποία ήταν πραγματικά απαραίτητη.

Για να αντιστοιχίσετε δύο σε μια μεταβλητήΝ 2 η λειτουργία θα είναι λίγο πιο περίπλοκη:

M2= M2 Mod 1000 "M2 =1234 Mod 1000 = 234
Μ2=Μ2/100" Μ2=234/100=2,34
N2= Abs (m2) " N2 = Abs (2,34) = 2

"Arial","sans serif""> Για να ξεκινήσετε με τη λειτουργίαMod επιστρέφουμε τα τρία πρώτα
ψηφία του αριθμού (το υπόλοιπο της διαίρεσης με το 1000), και στη συνέχεια όλα είναι όπως στην πρώτη περίπτωση.

Με τα δύο τελευταία ψηφία, σχεδόν το ίδιο πράγμα:

M3 = M3 Mod100
Μ3=Μ3/10
N3 = Abs (m3)

M4 = M4 Mod 10
N4= Abs (m4)


Τώρα οι μεταβλητές μας περιέχουν τις τιμές που θέλουμε να εμφανίσουμε, ήρθε η ώρα για τον μικροελεγκτή να χτυπήσει τα πόδια του και να εμφανίσει αυτές τις τιμές στην ένδειξη, γι' αυτό ονομάζουμε υπορουτίνα επεξεργασίας οθόνης:

"Arial","sans serif"">

Gosub Led

"Arial","sans serif""> Ο επεξεργαστής θα μεταβεί στην υπορουτίνα με την ετικέταLed:

Led:

Portc = &B00001000

"Arial","sans serif""> Εδώ εξυπηρετούμε σε υψηλό επίπεδοPORTC .3, έχουμε συνδέσει την άνοδο της πρώτης κατηγορίας σε αυτό το σκέλος. Στη συνέχεια επιλέγουμε ποια τμήματα θα ανάψουμε για να εμφανιστεί η τιμή της πρώτης μεταβλητής. Είναι μια από εμάς, οπότε το μηδέν θα είναι στα πόδια της Portd .1 και Portd .2, που αντιστοιχεί στα τμήματαΔείκτης Β και Γ.

Επιλέξτε Υπόθεση N1









Τέλος Επιλογή
Αναμονή 5

"Arial","sans serif""> Αφού ανάψουν τα απαραίτητα τμήματα, περιμένουμε 5 ms και προχωράμε στην εμφάνιση των παρακάτω αριθμών:

Portc = &B00000100
Επιλέξτε Υπόθεση N2
Περίπτωση 0 : Portd = &B11000000
Περίπτωση 1: Portd = &B11111001
Περίπτωση 2: Portd = &B10100100
Περίπτωση 3: Portd = &B10110000
Περίπτωση 4: Portd = &B10011001
Περίπτωση 5: Portd = &B10010010
Περίπτωση 6: Portd = &B10000010
Περίπτωση 7: Portd = &B11111000
Περίπτωση 8: Portd = &B10000000
Περίπτωση 9: Portd = &B10010000
Τέλος Επιλογή

Αναμονή 5

Portc = &B00000010

Επιλέξτε Υπόθεση N3
Περίπτωση 0 : Portd = &B11000000
Περίπτωση 1: Portd = &B11111001
Περίπτωση 2: Portd = &B10100100
Περίπτωση 3: Portd = &B10110000
Περίπτωση 4: Portd = &B10011001
Περίπτωση 5: Portd = &B10010010
Περίπτωση 6: Portd = &B10000010
Περίπτωση 7: Portd = &B11111000
Περίπτωση 8: Portd = &B10000000
Περίπτωση 9: Portd = &B10010000
Τέλος Επιλογή

Αναμονή 5

Portc = &B00000001

Επιλέξτε Υπόθεση N4
Περίπτωση 0 : Portd = &B11000000
Περίπτωση 1: Portd = &B11111001
Περίπτωση 2: Portd = &B10100100
Περίπτωση 3: Portd = &B10110000
Περίπτωση 4: Portd = &B10011001
Περίπτωση 5: Portd = &B10010010
Περίπτωση 6: Portd = &B10000010
Περίπτωση 7: Portd = &B11111000
Περίπτωση 8: Portd = &B10000000
Περίπτωση 9: Portd = &B10010000
Τέλος Επιλογή

Αναμονή 5

"Arial","sans serif""> Αφού εμφανίσετε πληροφορίες για την ένδειξη, πρέπει να επιστρέψετε στον κύριο βρόχο του προγράμματος, όπου πρέπει να ολοκληρώσετε τον βρόχο και να σημειώσετε το τέλος του προγράμματος.

"Arial","sans serif""> Εδώ είναι τι παίρνουμε στο τέλος:

"Arial","sans serif"">

"Arial","sans serif""> Λόγω της μικρής καθυστέρησης, η εναλλαγή δεν θα είναι ορατή στο ανθρώπινο μάτι και θα δούμε τον ακέραιο αριθμό 1234.

Μπορείτε να κατεβάσετε τον πηγαίο κώδικα και το έργο στο Proteus παρακάτω:"Arial","sans serif"">