Autor Tema: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas  (Leído 6684 veces)

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

Desconectado Luis_Chogi

  • PIC10
  • *
  • Mensajes: 44
Hola foro, tengo un problema con la lectura de un teclado matricial, lo que pasa es lo siguiente:

Trato de leer un teclado matricial para obtener un numero de dos digitos dentro de un ciclo, es decir que si yo presiono la tecla 1 y luego la 2, al final del ciclo obtenga yo el numero 12, esto lo quiero para que después de obtener este digito, ejecute un ciclo durante XX minutos, por ejemplo en este caso si presiono ‘1’ y ‘2’, yo ejecute un proceso durante 12 minutos (lo que yo estoy mostrando durante este tiempo es el voltaje  de un potenciómetro conectado RA0). Sin embargo no eh podido obtener este numero, espero que me puedan ayudar.

Codigo:

int   unidad,decena,segundos;
char  c;
 
                                            // Llamo a la funcion para pedir los minutos
void pide_minutos(void){

   lcd_putc("\f Minutos:\n");   //imprimo mensaje en LCD

      for(k=0;k<=1;k++){               // Hago un ciclo para pedir dos numeros del teclado

         do {                                  //espera a que pulse una tecla
         c=kbd_getc();
         }while(c==0);   
  switch (c)
         {
           case '0' : if (k=1)         //Si es el segundo ciclo que la variable leida la ponga en unidad.
                      unidad=c;
                      else
                      decena=c;      // Si el ciclo se ejecuta por promera ver que el valor leido lo ponga en decena
           case '1' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '2' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '3' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '4' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '5' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '6' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '7' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '8' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           case '9' : if (k=1)
                      unidad=c;
                      else
                      decena=c;
           default :  if (k=1)      //si leo * o # que en unidad o decena ponga 0
                      unidad=0;
                      else
                      decena=0;
         }
      }

 decena=decena10;                            // multiplico decena por 10
segundos=decena+unidad;       // y aquí termina el proceso pero no sale………….

}

 

Posiblemente mi problema esta en las variables pero no se.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
« Respuesta #1 en: 22 de Julio de 2006, 02:38:04 »
Veo varios errores en tu código, tantos que no creo que tu programa haya siquiera compilado correctamente.

Te escribo algunos, aunque seguramente tendrás que seguir dándole vueltas al tema hasta conseguir que funcione correctamente:

- la estructura que propones, de un "case" por cada dígito recibido, se podría simplificar bastante si te aprovechas de los códigos ASCII. Puesto que el char "0" está justo delante del char "1" y así sucesivamente hasta el char "9", cualquier dígito en formato char tiene su traducción a formato int con esta simple fórmula:
Código: C
  1. valor_leido = char_leido - '0';

- en cualquier caso, si insistes en usar el "case", tendrás que poner un "break" en cada bloque. Mira la sintaxis correcta:
Código: C
  1. switch (cmd) {
  2.  
  3.     case 0:printf("cmd 0");
  4.  
  5.            break;
  6.  
  7.     case 1:printf("cmd 1");
  8.  
  9.            break;
  10.  
  11.     default:printf("bad cmd");
  12.  
  13.             break; }

- Aquí te falta el signo de multiplicación:
Código: C
  1. decena=decena10;                            // multiplico decena por 10


- en todos los IF que has usado, has intentado comprobar el valor de "k" con el signo "=", pero en C cuando se utiliza sólo un signo "=" significa asignación, aún cuando esté dentro de un IF. Para comprobar un valor hay que usar el operador "==".
Código: C
  1. case '3' : if (k==1)
  2.                       unidad=c;
  3.                       else
  4.                       decena=c;


Desconectado Luis_Chogi

  • PIC10
  • *
  • Mensajes: 44
Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
« Respuesta #2 en: 22 de Julio de 2006, 22:18:14 »
 nocturno........Sorry por preguntar lo mismo a Vzener.....

Bueno ya voy comprendiento...... lo que me quieres decir es que si yo leo por ejemplo un valor ASCII 2, puiedo obtener el valor entero realizando:
                                       Valor_leido = char leido - '0'   verdad?.


Entonces para este caso no en necesario el case, pero esque yo lo use porque no tenia ni ides de que hacer, jejejejeje, y lo del: decena=decena10 fue un error porque en mi codigo si tengo el *. 

 voy a intentar de hacer algo y lo pongo aqui, de todos modos muchas gracias por su ayuda, soy nuevo programando en C y quise hacer alguas practicas pero no me salen (de verdad que soy malo)

Desconectado Luis_Chogi

  • PIC10
  • *
  • Mensajes: 44
Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
« Respuesta #3 en: 23 de Julio de 2006, 03:01:35 »
Hola nocturno, tomando tus consejos hice esto.... podrias darme tu opinion? Creo que ya mejore un poquitin jejejeje, al menos ya pude obtener lo que queria pero no se, de repente tiene algun detalle.

void pide_minutos(void){

      for(k=0;k<=1;k++){

         do {                                                  //espera hasta...
         c=kbd_getc();
         }while(c==0);   //...pulsar una tecla

         if (k==0)
            decena=c-'0';
         if (k==1)
            unidad=c-'0';

         if(c=='*' || c=='#')
         {                       //si se pulsa * o # pon 0 a decena o unidad
           if (k==0)
             decena=0;
           if (k==1)
             unidad=0;
         }

      }
    decena=decena*10;
    minutos=decena+unidad;
}


Claro que ya declare las variables decena, unidad y minutos.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
« Respuesta #4 en: 23 de Julio de 2006, 04:14:19 »
Creo que ahora te ha quedado bastante mejor. A la hora de optimizar un código cada uno tiene su estilo propio, y creo que es algo personal, pero yo por ejemplo lo haría así:

Código: C++
  1. void pide_minutos(void){
  2.  
  3.       for(k=10;k>=1;k=k-9){
  4.  
  5.          do {                                                  //espera hasta...
  6.          c=kbd_getc();
  7.          }while(c==0);   //...pulsar una tecla
  8.  
  9.          if(c!='*' && c!='#')
  10.                minutos = (c-'0')*k + minutos;
  11.       }
  12. }

Desconectado Luis_Chogi

  • PIC10
  • *
  • Mensajes: 44
Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
« Respuesta #5 en: 23 de Julio de 2006, 21:38:09 »
bueno, como te decia... soy muy nuevo en esto de la programacion en C y pues de repente se reiran de mi porque mis codigos o mis rutinas son muy largas pero bueno...... ya hire mejorando.

Millllll gracias por tus consejos y por tu gran ayuda.


 

anything