Autor Tema: MENU CON TECLADO MATRICIAL 4X4  (Leído 3625 veces)

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

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
MENU CON TECLADO MATRICIAL 4X4
« 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...");
      }
      }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #1 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.

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #2 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.

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #3 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #4 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
« Última modificación: 18 de Abril de 2015, 08:04:26 por KILLERJC »

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #5 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;
   
     
      }
    }
      }


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #6 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.

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: MENU CON TECLADO MATRICIAL 4X4
« Respuesta #7 en: 20 de Abril de 2015, 05:53:45 »
Muchas gracias KILLERJC, ya lo he conseguido solucionar, gracias por la ayuda.