quizás te ayude este teclado de 8x8 teclas que escribí estos días atrás para protón:
"****************************************************************
"* Titulo : Proyecto para Teclado de 64 teclas *
"* Nombre : TECLADO64 *
"* Autor : "Se obvia el nombre por seguridad*
"* Notice : Copyright (c) 2002 "Se obvia el nombre por seguridad*
"* : All Rights Reserved *
"* Fecha : 25/11/2004 *
"* Version : 1.00 *
"* MCU : PIC16F877A *
"* COMPILER: PROTON+ Compiler. Version 3.01 *
"* : *
"* REVISIÓN: *
"* *
"* REVISIÓN: *
"* REVISION: *
"* REVISION: *
"****************************************************************
"*******************************************************************
"DESCRIPCION : Se usa un micro 877A para escanear un teclado de hasta 64 teclas
"mediante dos puertos completos PORTB y PORTC. Un tercer puerto (PORTD) se usa
"para pasar la tecla codificada a un segundo microcontrolador o a otro dispositivo.
"Por el PORTA.0 generouna interrupción para avisar de que hay una tecla leida.
"El proceso de escaneo se realiza sin interrupción al ser la única tarea que se
"va a realizar con el micro.
"Al PORTC se le ponen unas resistencias en serie de 270 OHm para limitar corriente
"********************************************************************
"***************************************
"* FUSIBLES *
"***************************************
CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_ON , LVP_OFF , WRT_HALF , CPD_ON , DEBUG_OFF
" Oscilador interno XT_OSC(4MHz)
" Watchdog Timer desconectado
" Power-On Timer conectado
" Brown-Out Detect conectado
" Low Voltage Programming desconectado
" Data Memory Code Protect la mitd
" Flash Program Memory Protect activado
" In Circuit Debuger desactivado
" Program Code Protection activado
"** FIN DE FUSIBLES
"*****************************
"* DEFINE *
"*****************************
DEVICE 16F877A
DECLARE XTAL 4 "Frecuencia del reloj 4MHz
DECLARE WATCHDOG OFF "Wachdog desconectado
"** FIN DE DEFINE
"DEFINICION DE CONSTANTES
SYMBOL NOT_RBPU = OPTION_REG.7 " PORTB Pull-up Enable
SYMBOL LED=PORTA.1
"DEFINICION DE VARIABLES
DIM fila AS BYTE "fila del teclado
DIM columna AS BYTE "columna del teclado
DIM tecla AS BYTE "Variable para el valor de la tecla
DIM salida AS BIT
DIM retardo AS BYTE "retardo para impedir rebotes
"DEFINICION DE LOS PINES DE ENTRADA/SALIDA.
ADCON1 = 7 "PORTA y PORTE como I/O digitales
TRISA=%00000000 "Los pin PORTA son salidas
TRISB=%11111111 "Los pin son entradas.
TRISC=%00000000 "Los pin son SALIDAS.
TRISD=%00000000 "Los pin son SALIDAS.
EWRITE 0,[50,1,0,0] "Configuración activa
"Posicion 0-----------> Retardo ajustado para impedir rebotes, 50 milisegundos.
"Posicion 1,2,3 ------> Version del firmware
EWRITE 48,[50,1,0,0] "Guardo la configuración de fábrica
"INICIALIZACIÓN DE VARIABLES
NOT_RBPU=0 "Activo las resistencias internas de pullup puerto B
fila=0
columna=0
tecla=0
salida=0
PORTC=0
PORTA.0=1
retardo=50
LED=1
" ** PROGRAMA PRINCIPAL **
WHILE 1=1
DELAYMS retardo "tiempo de espera para eliminar rebotes
GOSUB pulsada
GOSUB lee_tecla
WEND
"*************************************************************************
"** SUBRUTINA: pulsada
"** espera hasta que no haya ninguna tecla pulsada
"*************************************************************************
pulsada:
WHILE 1=1
IF PORTB =$FF THEN BREAK
WEND
DELAYMS retardo "tiempo de espera para eliminar rebotes
RETURN
"** FIN SUBRUTINA: pulsada
"*************************************************************************
"** SUBRUTINA: lee_tecla
"** lee una tecla del teclado y devuelve su valor en el puerto PORTD
"** provocando una salida de interrupción para avisar de una pulsación
"*************************************************************************
lee_tecla:
WHILE 1=1
FOR columna=0 TO 7
PORTC=(DCD columna)^$FF
fila=PORTB
IF fila != $FF THEN
salida=1
BREAK
ENDIF
NEXT columna
IF salida=1 THEN BREAK
LED=~LED
WEND
salida=0
tecla= (columna*

+ (NCD (fila ^ $FF))
PORTD=tecla "Pongo en el PORTD la codificación de la tecla
PORTA.0=0 "genero la interrupción de tecla pulsada 10 milisegundos
DELAYMS 10
PORTA.0=1
RETURN
"** FIN SUBRUTINA: lee_tecla
END
Saludos
Ricky