TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: prossis en 27 de Mayo de 2004, 05:55:00
-
alguien me puede pasar un ejemplo en c para controlar un teclado numerico tipo telefonico, de 3 columnas por 4 filas, la distribucion de los pines es igual la que aparece en el proteus, como key pad standard, a ver si alguien me puede ayudar.
-
Hola Prossis, mira te paso un codigo para escanear las teclas de un teclado 4X4 que hice para un proyecto. solo tienes que adaptarlo a tus necesidades.Espero que te sirva de orientacion.



#define PINTEC1 PIN_D0
#define PINTEC2 PIN_D1
#define PINTEC3 PIN_D2
#define PINTEC4 PIN_D3
#define PINTEC5 PIN_D4
#define PINTEC6 PIN_D5
#define PINTEC7 PIN_D6
#define PINTEC8 PIN_D7
#define UNO "1"
#define DOS "2"
#define TRES "3"
#define CUATRO "4"
#define CINCO "5"
#define SEIS "6"
#define SIETE "7"
#define OCHO "8"
#define NUEVE "9"
#define CERO "0"
#define A "A"
#define B "B"
#define C "C"
#define D "D"
#define E "E"
#define F "F"
char coger_tecla (void){
boolean teclapulsada=FALSE;
char tecla;
do{
output_bit (PINTEC2,1);
output_bit (PINTEC3,1);
output_bit (PINTEC4,1);
output_bit (PINTEC1,0);
delay_ms(5);
if (!input(PINTEC5)){
tecla=UNO;
teclapulsada=TRUE;
}
if (!input(PINTEC6)){
tecla=CUATRO;
teclapulsada=TRUE;
}
if (!input(PINTEC7)){
tecla=SIETE;
teclapulsada=TRUE;
}
if (!input(PINTEC8)){
tecla=A;
teclapulsada=TRUE;
}
output_bit(PINTEC1,1);
output_bit(PINTEC2,0);
delay_ms(5);
if (!input(PINTEC5)){
tecla=DOS;
teclapulsada=TRUE;}
if (!input(PINTEC6)){
tecla=CINCO;
teclapulsada=TRUE;}
if (!input(PINTEC7)){
tecla=OCHO;
teclapulsada=TRUE;}
if (!input(PINTEC8)) {
tecla=CERO;
teclapulsada=TRUE;}
output_bit (PINTEC2,1);
output_bit (PINTEC3,0);
delay_ms(5);
if (!input(PINTEC5)){
tecla=TRES;
teclapulsada=TRUE;}
if (!input(PINTEC6)){
tecla=SEIS;
teclapulsada=TRUE;}
if (!input(PINTEC7)){
tecla=NUEVE;
teclapulsada=TRUE;}
if (!input(PINTEC8)){
tecla=B;
teclapulsada=TRUE;}
output_bit (PINTEC3,1);
output_bit (PINTEC4,0);
delay_ms(5);
if (!input(PINTEC5)){
tecla=C;
teclapulsada=TRUE;}
if (!input(PINTEC6)){
tecla=D;
teclapulsada=TRUE;}
if (!input(PINTEC7)){
tecla=E;
teclapulsada=TRUE;}
if (!input(PINTEC8)){
tecla=F;
teclapulsada=TRUE;}
}
while(teclapulsada==FALSE);
return(tecla);
}
-
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
}