Con esta rutina podras leer un teclado matricial de 16 teclas (4 renglones y 4 columnas). En el puerto PB del microcontrolador PIC16F84A se conecta el teclado. El código de la tecla solicitada se regresa en el registro W (de 00H a 0FH para teclas individuales, 10H si no se oprimio ninguna tecla y 11H si se oprimieron mas de una tecla). Sólo tienes que definir las siguientes variables COL_NEW (contador de columnas) y TEC_NEW (código de la tecla). Puedes hacer uso del Sistema de Desarrollo para PIC16F84A.
;*****************************************
; ------- Rutina para detectar una tecla -------
COL_NEW equ 0CH ;contador de columnas
TEC_NEW equ 0DH ;código de la tecla
;-------------------------------------------------------
TECLADO
bsf STATUS,5 ;Banco 1
movlw 0FH
movwf TRISB ;Puerto B entrada/salida
bcf OPTION_REG,7 ;habilita resistencias internas de pull-up
bcf STATUS,5 ;Banco 0
BARRIDO:
movlw 0x04
movwf COL_NEW ;inicia conteo de columnas
movlw 0EFH
movwf TEC_NEW ;inicia las columnas (nibble alto)
BARRIDO_00:
movwf PORTB ;envia columna
CHK_REN1:
btfss PORTB,0
goto REN1_OK ;salta si no se cumple PB0 = 0
CHK_REN2:
btfss PORTB,1
goto REN2_OK ;salta si no se cumple PB1 = 0
CHK_REN3:
btfss PORTB,2
goto REN3_OK ;salta si no se cumple PB2 = 0
CHK_REN4:
btfss PORTB,3
goto REN4_OK ;salta si no se cumple PB4 = 0
decfsz COL_NEW,1 ;verifica ultima columna
goto SIG_COL ;continua con los corrimientos
movlw 10H ;codigo de NO tecla oprimida
return
SIG_COL:
bsf STATUS,0 ;activa el CARRY
rlf TEC_NEW,1 ;siguiente columna
movf TEC_NEW,W
goto BARRIDO_00 ;envia siguiente columna
;---------------------------------------------------
REN1_OK:
bcf TEC_NEW,0
goto TEC00
REN2_OK:
bcf TEC_NEW,1
goto TEC00
REN3_OK:
bcf TEC_NEW,2
goto TEC00
REN4_OK:
bcf TEC_NEW,3
TEC00:
comf TEC_NEW,1
movf TEC_NEW,W
xorlw 11H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC01
movlw 01H
return
TEC01:
movf TEC_NEW,W
xorlw 12H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC02
movlw 04H
return
TEC02:
movf TEC_NEW,W
xorlw 14H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC03
movlw 07H
return
TEC03:
movf TEC_NEW,W
xorlw 18H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC04
movlw 0AH
return
TEC04:
movf TEC_NEW,W
xorlw 21H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC05
movlw 02H
return
TEC05:
movf TEC_NEW,W
xorlw 22H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC06
movlw 05H
return
TEC06:
movf TEC_NEW,W
xorlw 24H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC07
movlw 08H
return
TEC07:
movf TEC_NEW,W
xorlw 28H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC08
movlw 00H
return
TEC08:
movf TEC_NEW,W
xorlw 41H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC09
movlw 03H
return
TEC09:
movf TEC_NEW,W
xorlw 42H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0A
movlw 06H
return
TEC0A:
movf TEC_NEW,W
xorlw 44H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0B
movlw 09H
return
TEC0B:
movf TEC_NEW,W
xorlw 48H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0C
movlw 0BH
return
TEC0C:
movf TEC_NEW,W
xorlw 81H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0D
movlw 0CH
return
TEC0D:
movf TEC_NEW,W
xorlw 82H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0E
movlw 0DH
return
TEC0E:
movf TEC_NEW,W
xorlw 84H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0F
movlw 0EH
return
TEC0F:
movf TEC_NEW,W
xorlw 88H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto FIN_TEC00
movlw 0FH
return
FIN_TEC00:
movlw 11H ;codigo de 2 o MAS teclas oprimidas
return
;*****************************************
; ------- Rutina para detectar una tecla -------
COL_NEW equ 0CH ;contador de columnas
TEC_NEW equ 0DH ;código de la tecla
;-------------------------------------------------------
TECLADO
bsf STATUS,5 ;Banco 1
movlw 0FH
movwf TRISB ;Puerto B entrada/salida
bcf OPTION_REG,7 ;habilita resistencias internas de pull-up
bcf STATUS,5 ;Banco 0
BARRIDO:
movlw 0x04
movwf COL_NEW ;inicia conteo de columnas
movlw 0EFH
movwf TEC_NEW ;inicia las columnas (nibble alto)
BARRIDO_00:
movwf PORTB ;envia columna
CHK_REN1:
btfss PORTB,0
goto REN1_OK ;salta si no se cumple PB0 = 0
CHK_REN2:
btfss PORTB,1
goto REN2_OK ;salta si no se cumple PB1 = 0
CHK_REN3:
btfss PORTB,2
goto REN3_OK ;salta si no se cumple PB2 = 0
CHK_REN4:
btfss PORTB,3
goto REN4_OK ;salta si no se cumple PB4 = 0
decfsz COL_NEW,1 ;verifica ultima columna
goto SIG_COL ;continua con los corrimientos
movlw 10H ;codigo de NO tecla oprimida
return
SIG_COL:
bsf STATUS,0 ;activa el CARRY
rlf TEC_NEW,1 ;siguiente columna
movf TEC_NEW,W
goto BARRIDO_00 ;envia siguiente columna
;---------------------------------------------------
REN1_OK:
bcf TEC_NEW,0
goto TEC00
REN2_OK:
bcf TEC_NEW,1
goto TEC00
REN3_OK:
bcf TEC_NEW,2
goto TEC00
REN4_OK:
bcf TEC_NEW,3
TEC00:
comf TEC_NEW,1
movf TEC_NEW,W
xorlw 11H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC01
movlw 01H
return
TEC01:
movf TEC_NEW,W
xorlw 12H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC02
movlw 04H
return
TEC02:
movf TEC_NEW,W
xorlw 14H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC03
movlw 07H
return
TEC03:
movf TEC_NEW,W
xorlw 18H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC04
movlw 0AH
return
TEC04:
movf TEC_NEW,W
xorlw 21H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC05
movlw 02H
return
TEC05:
movf TEC_NEW,W
xorlw 22H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC06
movlw 05H
return
TEC06:
movf TEC_NEW,W
xorlw 24H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC07
movlw 08H
return
TEC07:
movf TEC_NEW,W
xorlw 28H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC08
movlw 00H
return
TEC08:
movf TEC_NEW,W
xorlw 41H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC09
movlw 03H
return
TEC09:
movf TEC_NEW,W
xorlw 42H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0A
movlw 06H
return
TEC0A:
movf TEC_NEW,W
xorlw 44H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0B
movlw 09H
return
TEC0B:
movf TEC_NEW,W
xorlw 48H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0C
movlw 0BH
return
TEC0C:
movf TEC_NEW,W
xorlw 81H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0D
movlw 0CH
return
TEC0D:
movf TEC_NEW,W
xorlw 82H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0E
movlw 0DH
return
TEC0E:
movf TEC_NEW,W
xorlw 84H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto TEC0F
movlw 0EH
return
TEC0F:
movf TEC_NEW,W
xorlw 88H ;verifica tecla
btfss STATUS,2 ;verifica la bandera Z
goto FIN_TEC00
movlw 0FH
return
FIN_TEC00:
movlw 11H ;codigo de 2 o MAS teclas oprimidas
return