[Aporte] Libreria bien modificable para teclado 4x3 Pic C compiler

Buenas! Hace unos dias estuve buscando ayuda para usar la libreria kbd.c del pic c compiler, y no obtuve respuesta alguna, asi que me puse a intentar hacer una libreria mas entendible y que funcione, aunque probablemente no sea optima en cuanto a uso de memoria y eso. Hace poco arranque con esto, asi que no es muy pro que digamos. Aca va, por si a alguien le pasa lo mismo alguna vez. Hay que guardar el archivo con extensión .c en la carpeta de drivers de Pic C, y funca joya.
Código:
// Este es un driver para una teclado de 4 filas y 3 columnas, conectado al 
//puerto B de un PIC con resistencias de pull up en dicho puerto. La conexion es
//de la siguiente forma: Columna 0: RB1
//                       Columna 1: RB2
//                       Columna 2: RB3
//                       Filas (de la 0 a la 3): RB 4, RB5, RB6 y RB7 respectivamente. 
//Se puede utilizar con la interrupcion RB o no. (originalmente se usaba con ella)
//Devuelve un valor de tipo Char.

#use fast_IO(B)
#Byte portb = 0x06 //Direccion del puerto B en un pic 16F877A

char obtener_tecla (void);
int columna(int);
void iniciar_teclado(void);
int f,filas,columnas; 

 // Layout del teclado:
char   DISPLAY1 [3] = {'1', '2' '3'};
char   DISPLAY2 [3] = {'4', '5' '6'};
char   DISPLAY3 [3] = {'7', '8' '9'};
char   DISPLAY4 [3] = {'*', '0' '#'};


void iniciar_teclado (void){ //Configura el TrisB y setea las pullups.
   set_tris_B(0xF0);         //Debe ser llamada en el main. 
   port_b_pullups(true);
   output_b(0xF0);
}


char obtener_tecla(void){ 
   delay_ms(80); //Antirrebote
   for(f=4;f<=7;f++){
      if(bit_test(portb,f)==0){
      filas=f-3;
      columnas=columna(f); 
      output_b(0xF0);
      switch(filas){
      case 1:
      return(DISPLAY1[columnas]);
      break;
      case 2:
      return(DISPLAY2[columnas]);
      break;
      case 3:
      return(DISPLAY3[columnas]);
      break;
      case 4:
      return(DISPLAY4[columnas]);
      break;
   }
      }
      else
      f=f;
      }
      return('N');} //una 'N' se puede usar para probar que no se pulso nada
int columna(int f){
    output_b(0x0c);
    if(bit_test(portb,f)==0){
    return(0);
    }
    else
    output_b(0x0A);
      if(bit_test(portb,f)==0){
      return(1);
      }
      else
      output_b(0x06);
         if(bit_test(portb,f)==0){
         return(2);
         }}
...
 
Atrás
Arriba