Autor Tema: hola otra ves, sigo sin poder hacer funcionar un key Pad de 3x4, alguien tiene algun ejemplo en c ??  (Leído 2346 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado prossis

  • PIC10
  • *
  • Mensajes: 13
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.

Desconectado narcosystem

  • PIC10
  • *
  • Mensajes: 32
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);   
}

Desconectado Ankarius

  • PIC12
  • **
  • Mensajes: 71
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
}