ΑΣΚΗΣΗ 5 Πληκτρολόγιο Matrix
Σκοπός της άσκησης Είδη πληκτρολογίων Ανάλυση πληκτρολογίου τύπου Matrix Αλγόριθµος ανάγνωσης πατηµένου πλήκτρου Εφαρµογή προηγούµενων γνώσεων 1. Εισαγωγή & εξαγωγή δεδοµένων 2. ηµιουργία πίνακα & άντληση δεδοµένων από πίνακα 3. ηµιουργία Delay to Debounce
Πρόβληµα Στη θύρα Α του µε είναι συνδεδεµένο ένα πληκτρολόγιο τύπου Matrix. Να γραφεί πρόγραµµα που θα ελέγχει αν πατήθηκε κάποιο πλήκτρο και θα εµφανίζει σε έναν ενδείκτη 7 τοµέων, το χαρακτήρα που είναι αποτυπωµένος στο εκάστοτε πατηµένο πλήκτρο. Η εµφάνιση στον ενδείκτη να γίνεται για όσο χρόνο παραµένει το εκάστοτε πλήκτρο πατηµένο.
Είδη Πληκτρολογίων 1 2 3 A B 6 5 4 7 8 9 C D # 0 * COM * 0 5 # 6 D 7 1 8 2 9 3 C 4 B A A B C D 3 6 9 # 2 5 8 0 1 4 7 * COM Ανεξάρτητων πλήκτρων
Είδη Πληκτρολογίων 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D R1 R2 R3 R4 C1 C2 C3 C4 R1 R2 R3 R4 C1 C2 C3 C4 ιάταξη πίνακα
Κύκλωµα άσκησης Ra Rb Rc Rd Re Rf Rg 470R 470R 470R 470R 470R 470R 470R Gnd Rb 470R MCU PTB6 PTB5 PTB4 PTB3 PTB2 PTB1 PTB0 PTD5 A G D B F C E DP PTA6 PTA5 PTA4 PTA3 PTA2 PTA1 PTA0 PTA7 VDD R R R R
Έλεγχος πατηµένου πλήκτρου VDD PTA3= 1 PTA2= 1 PTA1= 1 PTA0= 1 PTA4= 0 PTA5= 0 PTA6= 0 MCU PTA7= 0
Έλεγχος πατηµένου πλήκτρου VDD PTA3= 1 PTA2= 0 PTA1= 1 PTA0= 1 PTA4= 0 PTA5= 0 PTA6= 0 MCU PTA7= 0
Πρόγραµµα CHECK_KEYBOARD CLR PORTA.DATA LDA PORTA.DATA CMPA #$0F BEQ CHECK_KEYBOARD ΣΑΡΩΣΗ
Σάρωση πληκτρολογίου VDD?= 0 PTA3= 1 PTA2= 1 PTA1= 1 PTA0= 1 PTA4= 1 PTA5= 1 PTA6= 1 MCU PTA7= 0
Σάρωση πληκτρολογίου VDD?= 0 PTA3= 1 PTA2= 0 PTA1= 1 PTA0= 1 PTA4= 1 PTA5= 1 PTA6= 0 MCU PTA7= 1
Σάρωση πληκτρολογίου VDD?= 0 PTA3= 1 PTA2= 1 PTA1= 1 PTA0= 1 PTA4= 1 PTA5= 0 PTA6= 1 MCU PTA7= 1
Σάρωση πληκτρολογίου VDD?= 0 PTA3= 1 PTA2= 1 PTA1= 1 PTA0= 1 PTA4= 0 PTA5= 1 PTA6= 1 MCU PTA7= 1
Σάρωση πληκτρολογίου VDD PTA3= 1?= 0 PTA2= 1 PTA1= 1 PTA0= 1 PTA4= 1 PTA5= 1 PTA6= 1 MCU PTA7= 0
Σάρωση πληκτρολογίου VDD PTA3= 1?= 0 PTA2= 0 PTA1= 1 PTA0= 1 PTA4= 1 PTA5= 1 PTA6= 0 MCU PTA7= 1
Πρόγραµµα KEY_TABLE FCB %01110111 FCB %10110111 FCB %11010111 FCB %11100111 FCB %01111011 FCB %10111011 FCB %11011011 FCB %11101011 FCB %01111101 FCB %10111101 FCB %11011101 FCB %11101101 FCB %01111110 FCB %10111110 FCB %11011110 FCB %11101110
CLRX Πρόγραµµα SCAN_KEYBOARD LDA KEY_TABLE,X STA PORTA.DATA CMPA PORTA.DATA BEQ KEY_FOUND INCX CMPX #!15 BLS SCAN_KEYBOARD JMP CHECK_KEYBOARD
Σάρωση πληκτρολογίου VDD PTA3= 1?= 0 PTA2= 0 PTA1= 1 PTA0= 1 PTA4= 1 PTA5= 1 PTA6= 0 MCU PTA7= 1
Πρόγραµµα KEY_FOUND UNTILKEYRELEASE LDA DISPLAY_KEY,X STA PORTB.DATA LDA KEY_TABLE,X CMP PORTA.DATA BEQ UNTILKEYRELEASE CLR PORTB.DATA JMP CHECK_KEYBOARD
Αποφυγή αναπηδήσεων CHECK_KEYBOARD CLR PORTA.DATA LDA PORTA.DATA CMPA #$0F BEQ CHECK_KEYBOARD JSR DEBOUNCE.DELAY KEY_FOUND UNTILKEYRELEASE LDA DISPLAY_KEY,X STA PORTB.DATA LDA KEY_TABLE,X CMP PORTA.DATA BEQ UNTILKEYRELEASE JSR DEBOUNCE.DELAY CLR PORTB.DATA JMP CHECK_KEYBOARD
Ηεντολή PSHX Εντολή PSHX (PuSH X onto stack) Σύνταξη PSHX Χωρίς όρισµα Αποτέλεσµα Γρήγορη αποθήκευση του καταχωρητή Χ στο σωρό (Η µνήµη RAM ως LIFO)
Ηεντολή PULX Εντολή PULX (PULL X from stack) Σύνταξη PULX Χωρίς όρισµα Αποτέλεσµα Ανάκτηση του καταχωρητή Χ από το σωρό (Η µνήµη RAM ως LIFO)
Ηεντολή PSHA Εντολή PSHA (PuSH A onto stack) Σύνταξη PSHA Χωρίς όρισµα Αποτέλεσµα Γρήγορη αποθήκευση του καταχωρητή A στο σωρό (Η µνήµη RAM ως LIFO)
Ηεντολή PULA Εντολή PULA (PULL A from stack) Σύνταξη PULA Χωρίς όρισµα Αποτέλεσµα Ανάκτηση του καταχωρητή A από το σωρό (Η µνήµη RAM ως LIFO)
Debounce Delay DEBOUNCE.DELAY PSHX LDA #!250 LOAD.X LDX #!199 DECREASE.X NOP NOP DBNZX DECREASE.X DBNZA LOAD.X PULX RTS
ιάγραµµα ροής ΑΡΧΗ PTD5 = 1 PTD5: Έξοδος PTB[0..6] = 0 PTB[0..6]: ΕΞΟ ΟΙ ΟΧΙ Σάρωση του Matrix Βρέθηκε το Πλήκτρο ΟΧΙ PTA[0..3] PullUpEn PTA[0..3]: Είσοδοι PTA[4..7]: Έξοδοι Πατήθηκε Πλήκτρο ΟΧΙ Εµφάνιση του πλήκτρου στον ενδείκτη Ελευθερώθηκε το πλήκτρο DELAY 50mSEC DELAY 50mSEC Σβήσιµο ενδείκτη
Πρόγραµµα PORTA.DATA EQU $0000 PORTB.DATA EQU $0001 PORTD.DATA EQU $0003 PORTA.DIRECTION EQU $0004 PORTB.DIRECTION EQU $0005 PORTD.DIRECTION EQU $0007 PORTA.PullUpEn EQU $000D ROM.START EQU $8000 RESET.VECTOR EQU $FFFE
Πρόγραµµα InitPorts ORG ROM.START BSET 0,$001F MOV #$1F,$003C BSET 5,PORTD.DATA BSET 5,PORTD.DIRECTION CLR PORTB.DATA MOV #%01111111,PORTB.DIRECTION MOV #%00001111,PORTA.PullUpEn MOV #%11110000,PORTA.DIRECTION
Πρόγραµµα CHECK_KEYBOARD CLR PORTA.DATA LDA PORTA.DATA CMPA #$0F BEQ CHECK_KEYBOARD JSR DEBOUNCE.DELAY CLRX SCAN_KEYBOARD LDA KEY_TABLE,X STA PORTA.DATA CMPA PORTA.DATA BEQ KEY_FOUND INCX CMPX #!15 BLS SCAN_KEYBOARD JMP CHECK_KEYBOARD
KEY_FOUND Πρόγραµµα LDA DISPLAY_KEY,X STA PORTB.DATA UNTILKEYRELEASE LDA KEY_TABLE,X CMP PORTA.DATA BEQ UNTILKEYRELEASE JSR DEBOUNCE.DELAY CLR PORTB.DATA JMP CHECK_KEYBOARD
Πρόγραµµα DEBOUNCE.DELAY PSHX LDA #!250 LOAD.X LDX #!199 DECREASE.X NOP NOP DBNZX DECREASE.X DBNZA LOAD.X PULX RTS
KEY_TABLE FCB %01110111 FCB %10110111 FCB %11010111 FCB %11100111 FCB %01111011 FCB %10111011 FCB %11011011 FCB %11101011 FCB %01111101 FCB %10111101 FCB %11011101 FCB %11101101 FCB %01111110 FCB %10111110 FCB %11011110 FCB %11101110 Πρόγραµµα
DISPLAY_KEY FCB %00110000 FCB %01101101 FCB %01111001 FCB %01110111 FCB %00110011 FCB %01011011 FCB %01011111 FCB %00011111 FCB %01110000 FCB %01111111 FCB %01111011 FCB %01001110 FCB %01001111 FCB %01111110 FCB %01000111 FCB %00111101 Πρόγραµµα
Πρόγραµµα ORG FDB RESET.VECTOR ROM.START
Ανακεφαλαίωση Είσοδο δεδοµένων από Matrix ιασύνδεση & Σάρωση Matrix 1. Ανίχνευση πατηµένου πλήκτρου 2. Εύρεσης πλήκτρου Αποφυγή αναπηδήσεων Αποθήκευση στο σωρό Εντολές PSHX, PULX Έξοδο δεδοµένων σε ενδείκτη 7 τοµέων
Εργασία στους Η/Υ Να τροποποιηθεί το πρόγραµµα άσκησης έτσι ώστε να µένει η τελευταία ένδειξη στον ενδείκτη 7 τοµέων και µετά την αποδέσµεύση του πλήκτρου.
Εργασία για το σπίτι Να γραφεί πρόγραµµα κατά το οποίο αρχικά το πληκτρολόγιο Matrix θα είναι κλειδωµένο. Όταν το πληκτρολόγιο είναι κλειδωµένο εµφανίζεται στον ενδείκτη ο χαρακτήρας L όταν πατιέται κάποιο πλήκτρο και για όση ώρα είναι το πλήκτρο πατηµένο. Αν πατηθεί το πλήκτρο του αστερίσκου *, τότε θα ξεκλειδώνει ακαριαία το πληκτρολόγιο και θα εµφανίζεται στον ενδείκτη ο χαρακτήρας που είναι αποτυπωµένος στο εκάστοτε πλήκτρο που πατιέται.