Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Luis_Chogi en 22 de Julio de 2006, 01:24:06
Título: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
Publicado por: Luis_Chogi en 22 de Julio de 2006, 01:24:06
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.
Título: Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
Publicado por: Nocturno 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
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:
- 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
case'3':if(k==1)
unidad=c;
else
decena=c;
Título: Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
Publicado por: Luis_Chogi 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)
Título: Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
Publicado por: Luis_Chogi 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.
Título: Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
Publicado por: Nocturno 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++
void pide_minutos(void){
for(k=10;k>=1;k=k-9){
do{//espera hasta...
c=kbd_getc();
}while(c==0);//...pulsar una tecla
if(c!='*'&& c!='#')
minutos =(c-'0')*k + minutos;
}
}
Título: Re: Lectura de un teclado matricial para obtener un valor de 2 teclas pulsadas
Publicado por: Luis_Chogi 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.