TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: LACM76 en 18 de Junio de 2006, 19:12:44

Título: Matriz de teclado en lenguaje C
Publicado por: LACM76 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;
}