Autor Tema: Lectura de teclado  (Leído 5448 veces)

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

Desconectado antoniojdobarro

  • PIC12
  • **
  • Mensajes: 84
Lectura de teclado
« en: 07 de Febrero de 2011, 19:02:03 »
Supongamos quiero leer una pulsación:

Leo teclado.------
Si la tecla pulsada es 2-----Acción 1
Si latecla pulsada es 3-----Acción 2.
-----
----

Y si no detecto ninguna pulsación----Accion 7.

Com puedo hacer esta última condición, es decir si no pulso ninguna tecla ejecutar esa acción.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Lectura de teclado
« Respuesta #1 en: 07 de Febrero de 2011, 19:18:20 »
Usa una comparación del tipo switch-case.

Es decir algo así:

Código: C
  1. switch (cmd) {
  2.  
  3.     case tecla0:(hago algo);
  4.            break;
  5.  
  6.     case tecla1:(hago algo distinto);
  7.            break;
  8.  
  9.     default:(no es ninguna tecla, hago esto otro);
  10.  
  11.             break; }

Se entiende??

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado antoniojdobarro

  • PIC12
  • **
  • Mensajes: 84
Re: Lectura de teclado
« Respuesta #2 en: 07 de Febrero de 2011, 19:41:53 »
Bien, lo tenía construido con If, else if, else, lo que ocurre es que no puedo poner un break, quiero que lo repita siempre, son entradas del teclado que van cambiando, luego tengo tambien do-while. Todo funcionaba perfectamente cuando tenía entradas independientes en el pic (si había tensión en A1 pues haz esto, si en A2 pues lo otro, el problema es cuando quiero que lo haga a partir de caracteres ya que las entradas son de RS232 luego han de ser caracteres, y no funciona como debería, se corta o traba a partir de virtual terminal).

void main(void) {
do{
switch(getchar())
{
case '2':avance();
case '3':giro_derecha();

case '5':retroceso();

default: detencion();
}

}
while(x<10);


El problema es que si no es 2 ni 3 ni 5 no tiene por que ejecutar detencion() ya que el caso contrario a esos es cualquier letra a,b,c, y yo quiero que detecte como caso contrario ninguna pulsación
« Última modificación: 07 de Febrero de 2011, 19:44:23 por antoniojdobarro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Lectura de teclado
« Respuesta #3 en: 07 de Febrero de 2011, 20:06:53 »
Hola amigo
cuando quieres que salga?

verifica antes del switch que letra pueden entrar ,
y en caso contrario actue como si fuese sordo a ellas.

Un saludo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Lectura de teclado
« Respuesta #4 en: 07 de Febrero de 2011, 20:30:53 »
  Lo que creo tendrías que hacer antes de entrar al switch, sería testear si realmente hay un caracter a la espera de ser leído. Porque creo que getchar() se queda ahí esperando a que ingrese un caracter. ¿Qué compilador estás usando?

  Básicamente para saber si hay algún caracter en el registro RCREG basta con testear el bit RCIF. Entonces podrías hacer algo así....

Código: C
  1. if (RCIF == 1) // si me llego un caracter ejecuto esta parte
  2. {
  3.   swicth (getchar())
  4.   {
  5.     .........
  6.     .........
  7.     .........
  8.   }
  9. }
  10. else // si no llego caracter ejecuto esta parte
  11. {
  12. .........
  13. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado antoniojdobarro

  • PIC12
  • **
  • Mensajes: 84
Re: Lectura de teclado
« Respuesta #5 en: 08 de Febrero de 2011, 03:41:46 »
Esta  última estructura tiene muy buena pinta, y puede ser mi solución, pero no me reconoce el comando RCIF.

Puede ser debido a utilizar CCS C PCW?
« Última modificación: 08 de Febrero de 2011, 04:10:50 por antoniojdobarro »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Lectura de teclado
« Respuesta #6 en: 08 de Febrero de 2011, 08:21:03 »
El comando kbhit() hace ese testeo en CCS, igual eso no te dice si es un carácter o un numero, vas a tener que testearlo fuera del switch case y filtrarlo antes de entrar en el mismo.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado antoniojdobarro

  • PIC12
  • **
  • Mensajes: 84
Re: Lectura de teclado
« Respuesta #7 en: 08 de Febrero de 2011, 08:40:05 »
Bien, copio la estructura:

void main(void) {

do{
if (kbhit()){

char entrada;
entrada=getchar();

if (entrada=='2')
avance();

else if (entrada=='5')
retroceso();


}
else detencion();
}
while(x<10);
}


El problema es que en virtual console de proteus una vez que pulso 2 o 5, luego la única manera de detenerlo es pulsando una tecla que no sea una de esas dos. Es como si kbhit no funcionase, ya que si fuese cero debería irse directamente a detención y solamente entrar en la sentencia if si hubiese algún botón presionado.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Lectura de teclado
« Respuesta #8 en: 08 de Febrero de 2011, 08:43:27 »
Hola, como adición a lo dicho por MGLSOFT, kbhit() debe ser llamado frecuentemente; si has presionado una tecla te devuelve su valor, y si no has presionado nada te devuelve /0.  Del encabezado de la librería KBD.C de CCS:
Citar
////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not  ////
////                   This function should be called frequently so as       ////
////                   not to miss a key press.                                      ////
El uso de este comando de la librería KBD.C lo puedes ver en el ejemplo EX_LCDKB.C

Saludos!
« Última modificación: 08 de Febrero de 2011, 17:10:34 por bmb »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Lectura de teclado
« Respuesta #9 en: 08 de Febrero de 2011, 08:44:31 »
Una vez que comparas deberías poner la variable entrada en 0, asi no te molesta, ya que la variable mantiene el valor aun después y el if vuelve a entrar, por eso se ejecuta continuamente.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Lectura de teclado
« Respuesta #10 en: 08 de Febrero de 2011, 09:31:22 »
Una vez que comparas deberías poner la variable entrada en 0, asi no te molesta, ya que la variable mantiene el valor aun después y el if vuelve a entrar, por eso se ejecuta continuamente.

  Pero en teoría no debería volver a entrar porque está el kbhit() con anterioridad.

  Digo yo especulando un poco porque en realidad no se como trabaja CCS con eso.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado antoniojdobarro

  • PIC12
  • **
  • Mensajes: 84
Re: Lectura de teclado
« Respuesta #11 en: 08 de Febrero de 2011, 11:58:14 »
El problema de kbhit() es que una vez que se pulsa una tecla se pone a -1. Luego alguien sabe como resetearlo?

Toco la solución pero...

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Lectura de teclado
« Respuesta #12 en: 08 de Febrero de 2011, 16:51:00 »
El problema de kbhit() es que una vez que se pulsa una tecla se pone a -1. Luego alguien sabe como resetearlo?

Toco la solución pero...

Hola antoniojdobarro, el problema es que no estás usando correctamente la función kbhit().  Leiste el post #8 de este hilo?

EDITO: Perdón lo estaba confundiendo con otra función....

Saludos!
« Última modificación: 08 de Febrero de 2011, 17:05:38 por bmb »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Lectura de teclado
« Respuesta #13 en: 08 de Febrero de 2011, 17:05:10 »
El problema de kbhit() es que una vez que se pulsa una tecla se pone a -1. Luego alguien sabe como resetearlo?

Toco la solución pero...

Hola antoniojdobarro, el problema es que no estás usando correctamente la función kbhit().  Leiste el post #8 de este hilo?

Saludos!

  Perdón por mi ignorancia pero esta función (kbd_getc(c)) no se utiliza para leer un teclado? Antoniojdobarro quiere leer del RS232
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Lectura de teclado
« Respuesta #14 en: 08 de Febrero de 2011, 17:06:28 »
Si AngelGris perdón, es que confundi las funciones...


Saludos!
« Última modificación: 08 de Febrero de 2011, 17:11:03 por bmb »