TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ADY12 en 17 de Abril de 2015, 05:10:16

Título: MENU CON TECLADO MATRICIAL 4X4
Publicado por: ADY12 en 17 de Abril de 2015, 05:10:16
Quiero hacer un menu, que tocando una tecla del teclado se obtenga datos. Seria de la siguiente manera:

Seleccione: 1.Obtain 2. Transmitir
Si seleccionas 1, aparece otro menu con 4 opciones (1.Temp 2.NCOMB 3.RPM 4.VEL)

Si seleccionas 2 tendria que aparecer en pantalla transmitiendo datos.

En el submenu de los parametros tambien tendria que haber una opcion, para volver atras.

Aqui os dejo el codigo que he probado de hacer. El problema es que cuando tecleo una tecla, no hace nada. Y todo estaba bien configurado. Anteriormente lo habia probado de hacer con if pero funciona correctamente, pero si le dabas al 1 o el 3 te realizaba siempre la misma funcion.


Código: [Seleccionar]
void main(){

   //Variable de las funciones de parametros
   
   char k;
   int x;
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   
   //Mensaje de Inicio
   lcd_gotoxy(4,1);
   printf(lcd_putc, "BIENVENIDOS");
   lcd_gotoxy(7,2);
   printf(lcd_putc, "dd");
   delay_ms(300);
   lcd_putc('\f');
   lcd_gotoxy(4,1);
   printf(lcd_putc, "viernes 12");
   lcd_gotoxy(4,2);
   printf(lcd_putc, "abril 2015");
   delay_ms(300);
   lcd_putc('\f');
   lcd_gotoxy(1,1);
   printf(lcd_putc, "REALIZADO POR:");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "xxx");
   delay_ms(300);
   lcd_putc('\f');
   lcd_gotoxy(1,1);
   printf(lcd_putc, "SELECCIONE:");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"1.OBT 2.TRANS");

   
   
   
      while(1){              //Bucle infinito siempre consulta el teclado
      k=kbd_getc(); //leer el teclado
      x=k-48;       //Conversion numerica
      switch(k){
      case 1:
         lcd_gotoxy(1,1);
         printf(lcd_putc, "1.TEMP 2.NCOMB");
         lcd_gotoxy(1,2);
         printf(lcd_putc, "3.RPM 4.VEL");
         delay_ms(300);
         lcd_putc('\f');
         
         switch (k){
           
            case 1:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               NTC();
               break;
               
            case 2:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               NIVEL_COMBUSTIBLE();
               break;
               
            case 3:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               REVOLUCIONES();
               break;
               
            case 4:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               VELOCIDAD();
               break;
               
            case 5:
               lcd_gotoxy(1,1);
               printf(lcd_putc,"MENU PRINCIPAL");
               break;
         }
         
    case 2:
      lcd_gotoxy(1,1);
      printf(lcd_putc,"TRANS.DATOS...");
      }
      }
}
Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: KILLERJC en 17 de Abril de 2015, 06:01:42
Imagino por que kbd_getc te devuelve una letra y no un numero, por lo tanto los case quedarian asi:


case '1':
case '2':
case 'A':

Asi que no hace falta la conversion numerica que realizaste.
Otra de las cosas es que te falta definir un caso donde no ocurra lo que esperas o no se presione nada:

default:

y luego dentro del case 1: que tenes ANTES de volver a hacer un nuevo switch deberias de preguntar nuevamente por el valor de k ( k=kbd_getc(); )


Hay algunos codigos en el foro que intentaron hacer exactamente lo mismo, busca con menu ccs y seguro que sale.
Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: ADY12 en 18 de Abril de 2015, 07:28:31
he probado de hacer lo que me has comentado y sigue sin funcionar, he puesto un default y leo antes del switch otro vez el teclado pero nada.
Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: ADY12 en 18 de Abril de 2015, 07:46:34
he conseguido que cuando teclees algun caso funcione, pero cuando clicas 1. NTC hace la funcion NTC, pero si clicas 3.RPM tambien hace la funcion NTC.
Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: KILLERJC en 18 de Abril de 2015, 07:58:52
Código: C
  1. while(k=='\0') { k=kbd_getc(); }
  2. switch(k)
  3. {
  4. case '1':
  5.          
  6.        Muestro_LCD();
  7.        delay_grande();
  8.        while(k=='\0') { k=kbd_getc(); }
  9.        switch(k)
  10.        {
  11.         case '1':
  12.                    NTC();
  13.                    break;
  14.         case '2':
  15.                    Otracosa();
  16.                    break;
  17.         default:
  18.                    break;
  19.          }
  20.          k='\0';
  21.  
  22. case '2':
  23.          Nuevacosa();
  24.          break;
  25.  
  26. default:
  27.          break;
  28.  
  29. k='\0';
  30. }

Ahi lo forzo a quedarse mientras no se presiona nada esperando que se presione algo, mientra no se presiona nada k devuelve /0
Lo que no se es como plantear la condicion, si asi:

       while(k=='\0') { k=kbd_getc(); }

o asi

       while(k=='') { k=kbd_getc(); }    // Suponiendo que '\0' sea igual que ''
       while(!k) { k=kbd_getc(); }         // Suponiendo que '\0' se tome como un NULL o 0.

No se cual exactamente servira
Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: ADY12 en 19 de Abril de 2015, 14:21:57
He realizado lo que me comentas. Cuando sale 1.OBT 2.TRANS, si clicas entra correctamente, pero luego cuando entra en el menu A.TEMP B.NCOMB etc. Clicas cualquier tecla excepto 1,2 o # y no hace nada si clicas una de esas, hace las funciones que tendria que hacer el menu anterior. He probado diferentes coses pero no consigo arreglarlo.

Código: [Seleccionar]
while(TRUE){              //Bucle infinito siempre consulta el teclado
     
      k=kbd_getc();
      if (k!=0)
      switch(k){
      case '1':
         lcd_gotoxy(1,1);
         printf(lcd_putc, "A.TEMP B.NCOMB");
         lcd_gotoxy(1,2);
         printf(lcd_putc, "C.RPM D.VEL #");
         break;
       
         k=kbd_getc();
         if (k!=0)
         switch (k){
           
            case 'A':
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               NTC();
               break;
               
            case 'B':
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               NIVEL_COMBUSTIBLE();
               break;
               
            case 'C':
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               REVOLUCIONES();
               break;
               
            case 'D':
               lcd_gotoxy(1,1);
               printf(lcd_putc,"OBT.DATOS...");
               VELOCIDAD();
               break;
               
           case '#':
               menu();
               break;
             
         }
       
         
    case '2':
      lcd_gotoxy(1,1);
      printf(lcd_putc,"TRANS.DATOS...");
      break;
    case '#':
             menu();
             break;
   
     
      }
    }
      }

Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: KILLERJC en 19 de Abril de 2015, 21:57:06
Citar
Clicas cualquier tecla excepto 1,2 o # y no hace nada si clicas una de esas, hace las funciones que tendria que hacer el menu anterior. He probado diferentes coses pero no consigo arreglarlo.

No hay ninguna condicion que lo mantenga dentro de ese switch case, asi que cuando presionas algo ya sale al otro switch, o lo mantenes dentro de un while a todo el tomado de letra + switch case, y cuando se presione salga de este switch y while.
Título: Re: MENU CON TECLADO MATRICIAL 4X4
Publicado por: ADY12 en 20 de Abril de 2015, 05:53:45
Muchas gracias KILLERJC, ya lo he conseguido solucionar, gracias por la ayuda.