Aqui va otra rutina para manejar un teclado de 4x4 en C de Hitech ... ya sé que soy un poco raro.
Te sará facil adaptartelo a tus necesidades y convertirlo para el CCS.
/*--------------------------------------------------------------------
*
* Rutinas para el manejo de un teclado de 4x4 en el puerto D
* compartido con el LCD:
*
* - Rutina que escanea el teclado y devuelve el valor de la
* tecla pulsada:
* 0xFF - No hay ninguna tecla pulsada
* 0x01 a 0x0F - Tecla pulsada
* 0xF8 - Más de una tecla pulsada
* unsigned char key_scan()
*
*--------------------------------------------------------------------*/
const unsigned char tabla_key[] = { 0x7D, 0xEE, 0xED, 0xEB, 0xDE, 0xDD, 0xDB, 0xBE , 0xBD, 0xBB, 0x7E, 0x7B, 0x77, 0xB7, 0xD7, 0xE7 };
const unsigned char tabla_check[] = { 0x7F, 0xBF, 0xDF, 0xEF };
unsigned char key_check() {
unsigned char mask, key;
unsigned char n;
for ( n = 0; n < 4; n++) {
mask = tabla_check[n]; // Mascara a sacar por el puerto D
PORTD = mask; // para detectar tecla pulsada
nop();
if (PORTD != mask) {
key = PORTD; // Guardamos tecla pulsada
delay_10ms(2); // Pausa de 20 ms
PORTD = mask; // Volvemos a sacar la mascara
nop();
if (PORTD == key) return (key); // Se mantiene la misma tecla pulsada
}
}
return (0xFF); // Valor retornado si no se ha pulsado ninguna
}
unsigned char key_scan() {
unsigned char key, rtn;
unsigned char n;
TRISD = 0x0F; // RD0-3 Entradas RD4-RD7 Salidas
rtn = 0xFF; // Valor inicial a devolver
key = key_check(); // Chequeamos el teclado
if (key != 0xFF) {
rtn = 0xF8; // Valor devolver si no encontramos la tecla pulsada
while(key_check() != 0xFF); // Esperamos a que se suelte la tecla
for (n = 0; n < 16; n++) {
if (key == tabla_key[n]) {
rtn = n; // Encontrada valor de la tecla pulsada
break;
}
}
}
TRISD = 0x00; // RD0-7 Salidas
return (rtn); // Hay más de una tecla pulsada
}