"Teoría es cuando se sabe todo y nada funciona. Práctica es cuando todo funciona y nadie sabe porqué. En este recinto se conjugan Teoría y Práctica: nada funciona y nadie sabe porqué..."

---------------------------------------------------------------


Rutina para leer un Teclado Matricial con PIC's

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 con PIC's.

;*****************************************
; ------- Rutina para detectar una tecla -------

COL_NEW equ 0CH ;contador de columnas
TEC_NEW equ 0DH ;codigo 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