Autor Tema: Flex_kbd.c 5x5  (Leído 1629 veces)

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

Desconectado ferrioli

  • PIC10
  • *
  • Mensajes: 5
Flex_kbd.c 5x5
« en: 02 de Mayo de 2015, 18:13:00 »
Hola estoy en un proyecto con pic que tengo que   implementar un teclado 5x5 flex, estoy haciendo unas pruebas con el flex_kbd.c de setshomaru que e modificado pero no logro hacerlo funcionar  bien estoy simulando en proteus les dejo la modificación.
 Muchas gracias por cualquier aporte y si tienen alguna simulación en proteus  para guiarme se los agradezco mucho.
 


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Flex_kbd.c 5x5
« Respuesta #1 en: 02 de Mayo de 2015, 22:54:12 »
Código: C
  1. no_pulsa:         //si no hay tecla pulsada
  2.  
  3.       envia_alto(columna[i_col]);//enviamos alto a la col(cambiar segun hardware)
  4.      
  5.       if (recibe_bajo(fila[i_fil]))   //si es cero se pulsó una tecla(segun hardware)
  6.           return(codigo_tecla[cont_tecla]);//retornamos el valor de la tecla pulsada
  7.       envia_bajo(columna[i_col]);//enviamos un bajo a la columna para limpiar
  8.                                  //es al contrario del primer pulso enviado
  9.       ++cont_tecla;  //incrementa contador de la tecla, determina el valor en codigo_tecla[cont_tecla]
  10.       ++i_col;       //incrementa la col a revisar
  11.       if (i_col==5){ //si se revisaron las 5 col incrementa la fila y volvemes a col cero
  12.          i_col=0;
  13.          ++i_fil;
  14.       }
  15.      
  16.       if (i_fil==5){ //se se revisaron las 5 filas salimos de subrutina
  17.          envia_bajo(columna[i_col]);//bajo para limpiar puerto
  18.                                     //es al contrario del primer pulso enviado
  19.          return(' ');//si no hay tecla pulsada returnamos ' '
  20.       }
  21.      
  22.       goto no_pulsa; //si no se an revisado las 4 col y 4 filas volvemos a no pulsa
  23.      
  24.        
  25. }

Yo lo haria asi:

Código: C
  1. for(i_col=0;i_col<5;i_col++)
  2.         {
  3.                 envia_alto(columna[i_col]);//enviamos alto a la col(cambiar segun hardware)
  4.                 for(i_fil=0;i_fil<5;i_fil++)
  5.                 {
  6.                         if (recibe_bajo(fila[i_fil]))   //si es cero se pulsó una tecla(segun hardware)
  7.                                 {
  8.                                         envia_bajo(columna[i_col]);//bajo para limpiar puerto
  9.                                         return(codigo_tecla[i_fil][i_col]);//retornamos el valor de la tecla pulsada
  10.                                 }
  11.                 }
  12.                 envia_bajo(columna[i_col]);//bajo para limpiar puerto
  13.         }
  14.         return('/0');

Es decir activo la columna y me fijo en todas las filas. Asi para todas las columnas. Finalmente Si encuentra algo desactiva esa columna y sale con el resultado, si paso por todas las columnas y no encontro nada, entonces devuelvo un string vacio

Y para que sea mas facil cambiaria el indice del array
Antes: int codigo_tecla[25]
Ahora:


Código: C
  1. int codigo_tecla[5][5]={ '1','2','3','A','H',     //distibucion de simbolos en teclado
  2.                        '4','5','6','B','L',    //se cambia segun distribucion en el mismo
  3.                        '7','8','9','C','K',    //empezando por cero codigo_tecla[0]=1
  4.                        '*','0','#','D','M',
  5.                        'W','S','I','V','C' };//los numeros no se colocan como caracteres
es para hacer:
codigo_tecla[i_fil][i_col]
si no hubiera tenido que hacer:
codigo_tecla[(i_fil*5)+i_col]

Aunque no estoy muy seguro, se que se puede direccionar un array[5][5] haciendo array[j], pero no se si puedo lograrlo al revés, en un array[25] hacer array[J][k]. Me parece que no se puede. Por eso lo cambie


EDIT:

Una cosa mas:

delay_ms(200); //retardo para evitar rebotes

No tiene sentido... deberias quitarlo. Explico por que no tiene sentido, este programa se ejecutaría cuando vos hagas correr el programa y no cuando se presione la tecla.
De la forma que haces el barrido me parece ineficiente

Errores que encontre en tu codigo:
- No desactivas la columna al retornar, esto hace que cuando entres de nuevo y si hubo una coincidencia en la 3era columna, este activada la 3era y la 1era, no desactivandose nunca. Un simple envia_bajo(columna[i_col]) lo hubiera solucionado
- Cuando llega a 'W' es decir fila 5 columna 1, sale diciendo que no existe ningun valor, ni siquiera revisa los otros valores de esa fila, eso por tener mal la condicion del if, este: if (i_fil==5), el cual deberia estar dentro del otro if ( el de las columnas ) o agregarle la condicion: if (i_fil==5&&i_col==5)
« Última modificación: 02 de Mayo de 2015, 23:28:42 por KILLERJC »

Desconectado ferrioli

  • PIC10
  • *
  • Mensajes: 5
Re: Flex_kbd.c 5x5
« Respuesta #2 en: 06 de Mayo de 2015, 08:52:02 »
Muchas gracias por tu ayuda KILLERJC  ((:-)) , voy a probar y te cuento estoy con poco tiempo pero pronto estaré con noticias  .


 

anything