ΑΣΚΗΣΗ 2 ΔΙΑΚΟΠΤΕΣ ΚΑΙ ΠΛΗΚΤΡΟΛΟΓΙΑ 1.ΣΚΟΠΟΣ Αυτή η άσκηση έχει σαν σκοπό να δείξει τον τρόπο με τον οποίο συνδέουμε διακόπτες και πληκτρολόγια στον 89C51 καθώς και πως προγραμματίζουμε τον μικροελεγκτή για την είσοδο δεδομένων από αυτά. 2.ΘΕΩΡΗΤΙΚΕΣ ΓΝΩΣΕΙΣ 2.1 Διακόπτες Τυπικά ένας διακόπτης μπορεί να είναι είτε απλός on/off ή push button ή μικροδιακόπτης (dip switch)
Μπορεί να συνδεθεί σε ένα dc τροφοδοτικό και να δώσει ένα συγκεκριμένο λογικό επίπεδο. Το σχήμα παραπάνω δείχνει τυπικές συνδεσμολογίες για διακόπτες push buttons για λογικό 0 και λογικό 1 με τον διακόπτη ανοικτό. Ακολουθεί ένα μικρό πρόγραμμα σε assembly που περιμένει όντας σε ένα συνεχή βρόγχο μέχρι να πατηθεί ο διακόπτης. Το πρόγραμμα υποθέτει ότι η έξοδος του διακόπτη συνδέεται στο ποδαράκι p1.0
start:
org sjmp start jnb p1.0, start end
Όταν πατηθεί ο διακόπτης το πρόγραμμα θα βγει από το βρόγχο και θα σταματήσει. Εάν χρησιμοποιείται ένας διακόπτης που όντας ανοικτός είναι σε λογικό 1 τότε η εντολή JNB στο πρόγραμμα παραπάνω πρέπει να αλλάξει με την εντολή JB.
1
2.2 Το πληκτρολόγιο Ένα πολύ σημαντικό interface σε ένα υπολογιστικό σύστημα και σε πολλά συστήματα ελέγχου είναι το πληκτρολόγιο. Πληκτρολόγια υπάρχουν σε μεγάλη ποικιλία μεγεθών και σχημάτων, αλλά η ενότητα αυτή δεν τα καλύπτει όλα. Απλά θα περιγράψει μια στρατηγική που επιτρέπει κάθε πληκτρολόγιο οποιουδήποτε μεγέθους να προσαρμοστεί σε ένα μικροελεγκτή. Ο διακόπτης ενός πληκτρολογίου είναι push button σε κατάσταση normal open. Το σχήμα που ακολουθεί δείχνει το αποτέλεσμα του κωδωνισμού (bouncing) όταν ένας διακόπτης κλείνεται ή ανοίγεται. Διακόπτης κλειστός
Διακόπτης ανοικτός Διάγραμμα χρονισμού που παράγεται από το άνοιγμα και κλείσιμο ενός διακόπτη…
Όπως φαίνεται από το σχήμα ο κωδωνισμός φαίνεται σαν πολλαπλά κλεισίματα ενός διακόπτη. Εάν θέλουμε να ελαχιστοποιήσουμε τα προβλήματα από το κωδωνισμό ενός διακόπτη συνήθως χρησιμοποιούμε μια χρονοκαθυστέρηση. Εάν περιμένουμε για 10-15ms μετά το κλείσιμο ή άνοιγμα του διακόπτη, το φαινόμενο θα έχει σταματήσει και θα έχει περιέλθει στη σταθερή του κατάσταση. Τότε μιλάμε για software debouncing του διακόπτη. Το πρόγραμμα που ακολουθεί κάνει software debounce ενός διακόπτη συνδεδεμένου στο ποδαράκι 0 της πόρτας p1. Όταν ο διακόπτης είναι ανοικτός είναι σε κατάσταση λογικού 1 και όταν κλείνει δίνει στη πόρτα λογικό 0. switch debounce loop1
jb
org 30h db p1 mov switch, #0ffh switch.0, loop1 acall delay jnb switch.0, loop2 acall delay ret
;αναμονή μέχρι να κλείσει ;αναμονή παύσης κωδωνισμού ;αναμονή μέχρι να ανοίξει ;αναμονή παύσης κωδωνισμού
Εκτός από το debounce που γίνεται με λογισμικό που είδαμε προηγουμένως υπάρχει και η δυνατότητα hardware debounce όπως φαίνεται στο παρακάτω σχήμα. Οι pull up αντιστάσεις χρησιμοποιούνται για να παρέχουν τα λογικά επίπεδα τάσεων στο κύκλωμα του διακόπτη.
2
Για μεγάλο αριθμό διακοπτών οι διακόπτες διασυνδέονται σε σειρές και στήλες σε μια μορφή X-Y πίνακα (matrix) όπως φαίνεται στο παρακάτω σχήμα. Η κατάσταση των διακοπτών στο πίνακα διαβάζεται με μία διαδικασία σάρωσης του πληκτρολογίου. Συγκεκριμένα σε ένα τυπικό πίνακα διακοπτών, οι στήλες συνδέονται σε κατάσταση λογικού 1 με τη βοήθεια pull up αντιστάσεων. Οι γραμμές επίσης κρατώνται στο high αλλά οδηγούνται στο low, μία κάθε φορά, σε ένα επαναλαμβανόμενο κύκλο. Κάθε φορά μια σειρά οδηγείται στο low, και οι στήλες διαβάζονται η μία μετά την άλλη να δούμε ποια, αν υπάρχει κάποια, είναι σε low. Επειδή οι διακόπτες είναι σε normal open, εάν δεν έχει πατηθεί κανένα πλήκτρο, όλες οι στήλες θα παραμείνουν high. Εάν ένα πλήκτρο πατηθεί, μια στήλη θα γίνει low όταν η γραμμή που τέμνει αυτή τη στήλη με το διακόπτη κλειστό οδηγηθεί στο low.
Γνωρίζοντας ποια στήλη και ποια γραμμή είναι ταυτόχρονα low μπορούμε να βρούμε ποιο πλήκτρο πατήθηκε. Σημειώστε ότι ο ρόλος των γραμμών και των στηλών μπορεί να αντιστραφεί. Ο πίνακας μπορεί να σαρωθεί με τη βοήθεια λογισμικού χρησιμοποιώντας I/O πόρτες για να οδηγήσουμε τις γραμμές και να διαβάσουμε τις στήλες. Μπορεί να γίνει επίσης με hardware τρόπο με τη χρήση ενός ολοκληρωμένου που σχεδιάστηκε για το σκοπό αυτό όπως το MM74C923 ή το MM74C922
3
Εργασίες 1. Να γίνει πρόγραμμα που να κάνει σάρωση του πληκτρολογίου με κατάλληλο λογισμικό και να επιτρέπει την εμφάνιση ενός χαρακτήρα στο lcd display που δίνεται από το keypad (16 χαρακτήρων) της πλακέτας του εργαστηρίου. 2. Το πρόγραμμα να επιτρέπει την αλλαγή γραμμής όταν γεμίζει η πρώτη γραμμή και το καθάρισμα του display όταν γεμίζει και η δεύτερη γραμμή.
KEYBOARD CONTROL DEFSEG START,ABSOLUTE SEG START ORG 0000H LJMP MAIN ORG 0003H LJMP KEYBOARD ORG 0030H MAIN : ACALL INIT_LCD ;**interrupt initilization** SETB EA SETB EX0 MOV P1,#11110000B ;alternative #0F0h SJMP $ ;*******DELAYS SECTION ************* KEY_DEL: MOV R7,#250 DJNZ R7,$ RET
;Delay for change of line in keyboard
DELAY: SETB P2.5 MOV R7,#28H DEL6: MOV R6,#0FFH DEL7: DJNZ R6,DEL7 DJNZ R7,DEL6 RET DELAYA: SETB P2.5 MOV R5,#0AH DEL8: MOV R7,#28H DEL9: MOV R6,#0FFH DEL0: DJNZ R6,DEL0 DJNZ R7,DEL9 DJNZ R5,DEL8 RET ;*****CONTROL SECTION***************** CONTROL: MOV P0,A ACALL DELAY CLR P2.5 RET CONTROLA: MOV P0,A ACALL DELAYA CLR P2.5 RET ;******LCD INITIALIZATION****************** INIT_LCD: CLR P2.2 ;WRITE TO LCD CLR P2.3 ACALL DELAY MOV A,#38H ACALL CONTROL MOV A,#38H ACALL CONTROL
4
MOV A,#38H ACALL CONTROL MOV A,#38H ACALL CONTROL MOV A,#06H ACALL CONTROL MOV A,#0EH ACALL CONTROL MOV A,#01H ACALL CONTROL MOV A,#80H ACALL CONTROL RET
;******KEYBOARD CONTROL******************* KEYBOARD : MOV P1,#0FFH ;alt #11111111b sets P1 to 1 CLR P1.0 ACALL KEY_DEL ;Short delay every time there is a line change JB P1.4,L1 ;checks P1.4 (column) and if it is set jumps to L1 MOV A,#'0' ;moves the info to accumulator ACALL CONTROLA L1 : JB P1.5,L2 MOV A,#'1' ACALL CONTROLA L2 : JB P1.6,L3 MOV A,#'2' ACALL CONTROLA L3 :JB P1.7,L4 MOV A,#'3' ACALL CONTROLA L4 : SETB P1.0 CLR P1.1 ACALL KEY_DEL JB P1.4,L5 MOV A,#'4' ACALL CONTROLA L5 :JB P1.5,L6 MOV A,#'5' ACALL CONTROLA L6 :JB P1.6,L7 MOV A,#'6' ACALL CONTROLA L7 :JB P1.7,L8 MOV A,#'7' ACALL CONTROLA L8 : SETB P1.1 CLR P1.2 ACALL KEY_DEL JB P1.4,L9 MOV A,#'8' SETB P2.3 ACALL CONTROLA L9 : JB P1.5,L10 MOV A,#'9' ACALL CONTROLA L10 :JB P1.6,L11 MOV A,#'A' ACALL CONTROLA L11 :JB P1.7,L12 MOV A,#'B' ACALL CONTROLA L12 : SETB P1.2 CLR P1.3 ACALL KEY_DEL JB P1.4,L13 MOV A,#'C' ACALL CONTROLA L13 :JB P1.5,L14 MOV A,#'D' ACALL CONTROLA
5
L14 :JB P1.6,L15 MOV A,#'E' ACALL CONTROLA L15 :JB P1.7,L16 MOV A,#'F' ACALL CONTROLA L16 : MOV P1,#0FH ;***delays to avoid multiple characters in one press*** ACALL DELAYA ACALL DELAYA ACALL DELAYA ACALL DELAYA RETI END
6