;***************************************************************************** ; Ce sous-programme est destiné à être utilisé sur la Maquette à PIC16F877. ; ; Fonction : Gestion du clavier 16 Touches ; ; Le clavier est connecté sur le port B (en parallèle avec l'afficheur LCD), ; les 4 bits de poids faibles pilotent les colonnes et les 4 bits de poids fort ; analysent les rangées. ; ; Col1 Col2 Col3 Col3 ; (RB0) (RB1) (RB2) (RB3) ; ;Rangee1(RB4) 1 2 3 F ; ;Rangee2(RB5) 4 5 6 E ; ;Rangee3(RB6) 7 8 9 D ; ;Rangee4(RB7) A 0 B C ; ; ;***************************************************************************** ; Déclarations KBD ;***************************************************************************** ;KBD_TEMP EQU 0x50 ; variable temporaire ;KBD_INDEX EQU 0x51 ; index ;KBD_ROW EQU 0x52 ; Rangée ;***************************************************************************** ; Routine : ; KEYBOARD : Renvoie le code ASCII de la touche dans W ;***************************************************************************** ; Programme KBD.ASM ; mise à jour 31/03/00 ; Auteur WEISS Jacques ; ;***************************************************************************** ;============================================================================= ; ; Sous-programme de gestion du clavier ; ; on scanne le clavier et on renvoie le code dans W ;============================================================================= KEYBOARD MOVLW 0x0F MOVWF PORTB BANKSEL TRISB MOVWF TRISB ; PortB[7..4] en Sortie, PortB[3..0] en Entrée BANKSEL PORTB CLRF KBD_TEMP ; initialisation des variables CLRF KBD_ROW MOVLW 0x08 MOVWF KBD_INDEX ; B3 représente la colonne de droite KBD_LOOP ; MOVFW KBD_INDEX SWAPF KBD_INDEX,W ; on ramène les poids forts en bas (LSB) CALL SCAN_KBD ; scan de la colonne pointée par KBD_INDEX SKPNZ ; a-t'on frappé une touche ? GOTO NEXT_KBD ; non, alors on passe à la suivante BTFSC KBD_TEMP,0 ; analyse des rangées MOVLW 0x00 BTFSC KBD_TEMP,1 MOVLW 0x04 BTFSC KBD_TEMP,2 MOVLW 0x08 BTFSC KBD_TEMP,3 MOVLW 0x0C ADDWF KBD_ROW,W ; on ajoute la valeur de la rangée (KBD_ROW) ANDLW 0x0F MOVWF KBD_TEMP ; recherche du code de la touche SKPNZ MOVLW 'A' DECF KBD_TEMP,F SKPNZ MOVLW '0' DECF KBD_TEMP,F SKPNZ MOVLW 'B' DECF KBD_TEMP,F SKPNZ MOVLW 'C' DECF KBD_TEMP,F SKPNZ MOVLW '7' DECF KBD_TEMP,F SKPNZ MOVLW '8' DECF KBD_TEMP,F SKPNZ MOVLW '9' DECF KBD_TEMP,F SKPNZ MOVLW 'D' DECF KBD_TEMP,F SKPNZ MOVLW '4' DECF KBD_TEMP,F SKPNZ MOVLW '5' DECF KBD_TEMP,F SKPNZ MOVLW '6' DECF KBD_TEMP,F SKPNZ MOVLW 'E' DECF KBD_TEMP,F SKPNZ MOVLW '1' DECF KBD_TEMP,F SKPNZ MOVLW '2' DECF KBD_TEMP,F SKPNZ MOVLW '3' DECF KBD_TEMP,F SKPNZ MOVLW 'F' GOTO FIN_KBD ; on sort du sous-programme NEXT_KBD INCF KBD_ROW,F ; passage à la rangée suivante RRF KBD_INDEX,F ; KBD_INDEX = 0x08, 0x84, 0x42, 0x21, 0x11 BTFSS KBD_INDEX,4 ; a t'on fini ? GOTO KBD_LOOP ; NON, alors on reprend sur la prochaine rangée FIN_KBD BANKSEL TRISB CLRF TRISB ; tous les bits en sortie BANKSEL PORTB CLRF PORTB ANDLW 0xFF ; pour positionner STATUS (Z) RETURN ;============================================================================= ; Scrutation du clavier ;============================================================================= SCAN_KBD XORLW 0xFF ; inversion bit à bit MOVWF PORTB MOVLW H'FF' ; on temporise MOVWF KBD_TEMP K_LOOP DECFSZ KBD_TEMP, F GOTO K_LOOP MOVF PORTB,W ; lecture du port B XORLW 0xFF ; inversion des bits ; MOVWF KBD_TEMP ; SWAPF KBD_TEMP,W ; on ramène les poids forts en bas (LSB) ANDLW 0x0F ; masquage des MSB MOVWF KBD_TEMP ; stockage du code RETURN