Mira...no se si te sirva...toy recien kachando komo anda esto...pero aki va:
; - TECLADO.LIB - \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;
www.x-robotics.com; Descipcion: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; Esta libreria realiza un escaneo en un teclado matricial de 4x4 teclas,
; el escaneo lo realiza poniendo un cero logico en las filas correspondientes
; y verificando las columnas para encontrar la interseccion provocada por
; el accionamiento de una tecla y asi saber la fila y columna de la tecla.
; ESTA SUBRUTINA CONVIERTE LA TECLA PULSADA EN SU EQUIVALENTE ASCII
; para ser usada con el display LCD.
;
; Se tienen que inicializar las siguientes variables en el programa que
; use esta libreria:
; - ( Tecla ) ;Devuelve la tecla pulsada
;******************************************
http://www.x-robotics.com *******
KB_Port ;Inicializa la puerta B para las entradas del
;teclado. Programa RB0-3 como salidas y RB4-7
;entradas con las resistencias de polarizacion
;habilitadas.
BSF STATUS,RP0 ;Selecciona P gina 1
MOVLW 0F0h ;PB4-7 como entradas
MOVWF TRISB ;y PB0-3 como salidas
BSF OPCION,RBPU ;Habilita R de polarizacion en entradas
BCF STATUS,RP0 ;Vuelve a la p gina 0.
RETURN ;Retorna.
KB_Scan ;Escanea el teclado
CLRF Tecla ;Borra Tecla y
INCF Tecla,f ;prepara Tecla para primer c¢digo.
MOVLW 0Eh ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada para estabilizaci¢n de señal.
Cheq_Col BTFSS PORTB,4 ;Primera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,5 ;Segunda columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,6 ;Tercera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,7 ;Cuarta columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,incrementa Tecla.
Ultima_Tecla MOVLW d'17' ;Carga W con el n£mero de Teclas + 1.
SUBWF Tecla,w ;y lo compara con el valor actual de Tecla.
BTFSC STATUS,Z ;Si Tecla + 1 = valor actual.
GOTO NTeclas ;No ha sido pulsada ninguna tecla.
BSF STATUS,C ;Pone a 1 Bit C.
RLF PORTB,f ;as¡ la Fila 1 pasa a 1 con la rotaci¢n a izqda.
GOTO Cheq_Col
NTeclas CLRF Tecla ;Coloca variable Tecla a 0
RETURN ;y regresa.
antirebotes ;ahora se espera a que la tecla sea soltada para evitar rebotes
;y reactivaciones de tecla
;esta parte puede ser eliminada si para nuestro proyecto no es necesaria
;o es un inconveniente.
Espera1 BTFSS PORTB,4 ;Si no se suelta la tecla FILA 1
GOTO Espera1 ;vuelve a esperar.
Espera2 BTFSS PORTB,5 ;Si no se suelta la tecla FILA 2
GOTO Espera2 ;vuelve a esperar.
Espera3 BTFSS PORTB,6 ;Si no se suelta la tecla FILA 3
GOTO Espera3 ;vuelve a esperar.
Espera4 BTFSS PORTB,7 ;Si no se suelta la tecla FILA 4
GOTO Espera4 ;vuelve a esperar.
MOVF Tecla,w ;pone en w el numero contenido en la variable
CALL T_Conv ;llama a la tabla de conversion y retorna
MOVWF Tecla ;con el valor en hexadecimal y lo pone en la variable.
RETURN ;vuelve al programa principal que hizo la llamada.
T_Conv ADDWF PCL,1
RETLW '0' ;Tecla nº0 = 0
RETLW '1' ;Tecla nº1 = 1
RETLW '4' ;Tecla nº2 = 4
RETLW '7' ;Tecla nº3 = 7
RETLW 'A' ;Tecla nº4 = A
RETLW '2' ;Tecla nº5 = 2
RETLW '5' ;Tecla nº6 = 5
RETLW '8' ;Tecla nº7 = 8
RETLW '0' ;Tecla nº8 = 0
RETLW '3' ;Tecla nº9 = 3
RETLW '6' ;Tecla nº10 = 6
RETLW '9' ;Tecla nº11 = 9
RETLW 'B' ;Tecla nº12 = B
RETLW 'F' ;Tecla nº13 = F
RETLW 'E' ;Tecla nº14 = E
RETLW 'D' ;Tecla nº15 = D
RETLW 'C' ;Tecla nº16 = C
es la kopia feliz de lo que enkontre iop...tb toy trabajando kon un teklado de 4x4...weno ojala te sirva..chau