Autor Tema: Matriz de teclado en lenguaje C  (Leído 1533 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado LACM76

  • PIC10
  • *
  • Mensajes: 1
Matriz de teclado en lenguaje C
« en: 18 de Junio de 2006, 19:12:44 »
 Agradeciendo la colaboracion, les planteo el ploblema que tengo. No entiendo como funciona los ciclos for en el programa abajo, como hace el escaneo del puerto para determinar como identifica la tecla pulsada.





// Funciones para la gestión de un teclado  4x4

// char kbd_getc()   Devuelve el código ASCII de la tecla pulsada.
//         Si no se pulsó ninguna, devuelve 0.


// Conexiones del teclado.
/*
            RB0 RB1 RB2 RB3
             ^   ^   ^   ^
             |   |   |   |
           |---|---|---|---|
  RB4 ---> | 1 | 2 | 3 | F |
           |---|---|---|---|
  RB5 ---> | 4 | 5 | 6 | E |
           |---|---|---|---|
  RB6 ---> | 7 | 8 | 9 | D |
           |---|---|---|---|
  RB7 ---> | A | 0 | B | C |
           |---|---|---|---|
*/

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','F'},
                                      {'4','5','6','E'},
                                      {'7','8','9','D'},
                                      {'A','0','B','C'}};

#byte kbd_port_b = 6


char kbd_getc()
{
  char tecla=0;
  int f,c,t,i,j;

  port_b_pullups(true);
  set_tris_b(0b00001111);  // RB7-RB4 salidas, RB3-RB0 entradas

 for(f=0x10, i=0; i<4; f<<=1, i++)       
  {                               
    for(c=0x01, j=0; j<4; c<<=1, j++)     
    {
      kbd_port_b = ~f;
      delay_cycles(1);
      t = kbd_port_b & 0x0F;
      t = ~(t | 0xF0);
      if(t == c)
      delay_ms(20);
        tecla=KEYS[j];
        while(t==c)
        {
          restart_wdt();
          t = kbd_port_b & 0x0F;
          t = ~(t | 0xF0);
        }
        break;
      }
    }
    if(tecla)
      break;
  }

  port_b_pullups(false);
  return tecla;
}


 

anything