TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: HH_HOZ en 19 de Octubre de 2007, 17:22:48

Título: programacion de menus en C
Publicado por: HH_HOZ en 19 de Octubre de 2007, 17:22:48
 :?
Hola estoy intenando programar un menu de usuario que sea amigable para cuaquier operador como los HMI que existen comercialmente. Estoy usando el PIC 16F877 (PCWH) y una pantalla lcd de 2x16. y un teclado de 4x4 Anteriormente ya he programdo un menu de usuario para un proyecto y la verdad  me salio muy engorroso y hacer uno con varios subniveles se me esta haciendo muy largo. Alguien sabe de rutinas de programacion de menus si me podrian ayudar con esto estaria muy agradecido he tenido mucho tiempo de retraso con este tema.
Título: Re: programacion de menus en C
Publicado por: MGLSOFT en 19 de Octubre de 2007, 23:12:17
Yo programe una aplicacion con menues y submenues, y te puedo asegurar que en cualquier lenguaje son muchas lineas de codigo!!
En mi aplicacion es mas del 80% del programa, ademas de un monton de recursos, ya que hay variables que no las escribo en directo, porque el dato puede ser cambiado tambien via comunicacion serial... :mrgreen:
Título: Re: programacion de menus en C
Publicado por: Modulay en 20 de Octubre de 2007, 16:05:00
Yo ando haciendo un menú para el controlador de mi insoladora y la verdad es que si que se hace engorroso.
Lo hago al estilo máquina de estados,con la participación de únicamente dos rutinas,la que gestiona la transición entre estados y accede a alguna variable y la que procesa lo que tenga que procesar,además de dibujar en el lcd lo que corresponda,dependiendo de a qué estado se haya pasado:

Código: C++
  1. void menu()
  2.     {
  3.     int8 estado_actual,estado_siguiente;
  4.     boolean salir;
  5.     estado_actual = INICIAL;
  6.     salir = false;
  7.     while (!salir)
  8.        {
  9.        if (rastreo_teclado())
  10.           {
  11.           switch (boton)
  12.              {
  13.              case OK:                                        //  BOTON OK
  14.                 if (estado_actual == INICIAL)
  15.                    estado_siguiente = MENU_INSOLAR;
  16.                 else if (estado_actual == MENU_INSOLAR)
  17.                    estado_siguiente = MENU_PLACAFREAK;
  18.                 else if (estado_actual == MENU_PLACAFREAK || estado_actual == MENU_PLACACIF || estado_actual == MENU_PLACACOVENCO || estado_actual == MENU_PLACATIPICA)
  19.                    {
  20.                    placa = ((int)(estado_actual/10)) - 10;
  21.                    estado_siguiente = MENU_CARASUPERIOR;
  22.                    }
  23.                 else if (estado_actual == MENU_CARASUPERIOR || estado_actual == MENU_CARAINFERIOR || estado_actual == MENU_AMBASCARAS)
  24.                    {
  25.                    caras = estado_actual - 110;
  26.                    estado_siguiente = MENU_CONFIRMACION;
  27.                    }
  28.                 else if (estado_actual == MENU_CONFIRMACION)
  29.                    estado_siguiente = INSOLANDO;
  30.                 else if (estado_actual == MENU_FIJARTIEMPO)
  31.                    {
  32.                    placa = ENCURSO;
  33.                    estado_siguiente = ACCION_FIJARMINUTOS;
  34.                    }
  35.                 else if (estado_actual == MENU_CONFIGURACION) estado_actual = MENU_TIEMPOFREAK;
  36.                 else if (estado_actual == MENU_TIEMPOFREAK || estado_actual == MENU_TIEMPOCIF || estado_actual == MENU_TIEMPOCOVENCO || estado_actual == MENU_TIEMPOTIPICO)
  37.                    placa = ((int)(estado_actual/10)) - 20;
  38.                    estado_siguiente = ACCION_MINUTOSPLACA;
  39.              case MENOS:                                     //  BOTON <
  40.                 if (estado_actual == MENU_INSOLAR)
  41.                    estado_siguiente = MENU_CONFIGURACION;
  42.                 else if (estado_actual == MENU_CONFIGURACION)
  43.                    estado_siguiente = MENU_INSOLAR;
  44.                 else if (estado_actual == MENU_TIEMPOCIF || estado_actual == MENU_TIEMPOCOVENCO || estado_actual == MENU_TIEMPOTIPICO)
  45.                    estado_siguiente = estado_actual - 10;
  46.                 else if (estado_actual == MENU_TIEMPOFREAK)
  47.                    estado_siguiente = MENU_TIEMPOTIPICO;
  48.                 else if (estado_actual == MENU_PLACACIF || estado_actual == MENU_PLACACOVENCO || estado_actual == MENU_PLACATIPICA || estado_actual == MENU_FIJARTIEMPO)
  49.                    estado_siguiente = estado_actual - 10;
  50.                 else if (estado_actual == MENU_PLACAFREAK)
  51.                    estado_siguiente = MENU_FIJARTIEMPO;
  52.                 else if (estado_actual == MENU_CARAINFERIOR || estado_actual == MENU_AMBASCARAS)
  53.                    estado_siguiente = estado_actual - 10;
  54.                 else if (estado_actual == MENU_CARASUPERIOR)
  55.                    estado_siguiente = MENU_AMBASCARAS;
  56.              case MAS:                                       //  BOTON >
  57.                 if (estado_actual == MENU_INSOLAR)
  58.                    estado_siguiente = MENU_CONFIGURACION;
  59.                 else if (estado_actual == MENU_CONFIGURACION)
  60.                    estado_siguiente = MENU_INSOLAR;
  61.                 else if (estado_actual == MENU_TIEMPOCIF || estado_actual == MENU_TIEMPOCOVENCO || estado_actual == MENU_TIEMPOFREAK || estado_actual == MENU_TIEMPOTIPICO)
  62.                    estado_siguiente = estado_actual + 10;
  63.                 else if (estado_actual == MENU_FIJARTIEMPO)
  64.                    estado_siguiente = MENU_TIEMPOFREAK;
  65.                 else if (estado_actual == MENU_PLACACIF || estado_actual == MENU_PLACACOVENCO || estado_actual == MENU_PLACAFREAK)
  66.                    estado_siguiente = estado_actual + 10;
  67.                 else if (estado_actual == MENU_PLACATIPICA)
  68.                    estado_siguiente = MENU_PLACAFREAK;
  69.                 else if (estado_actual == MENU_CARAINFERIOR || estado_actual == MENU_CARASUPERIOR)
  70.                    estado_siguiente = estado_actual + 10;
  71.                 else if (estado_actual == MENU_AMBASCARAS)
  72.                    estado_siguiente = MENU_CARASUPERIOR;
  73.              case NO:                                        //  BOTON NO
  74.                 if (estado_actual == MENU_INSOLAR || estado_actual == MENU_CONFIGURACION)
  75.                    estado_siguiente = INICIAL;
  76.                 else if (estado_actual == MENU_TIEMPOFREAK || estado_actual == MENU_TIEMPOCIF || estado_actual == MENU_TIEMPOCOVENCO || estado_actual == MENU_TIEMPOTIPICO)
  77.                    estado_siguiente = MENU_CONFIGURACION;
  78.                 else if (estado_actual == MENU_PLACAFREAK || estado_actual == MENU_PLACACIF || estado_actual == MENU_PLACACOVENCO || estado_actual == MENU_PLACATIPICA || estado_actual == MENU_FIJARTIEMPO)
  79.                    estado_siguiente = MENU_INSOLAR;
  80.                 else if (estado_actual == MENU_CARASUPERIOR || estado_actual == MENU_CARAINFERIOR || estado_actual == MENU_AMBASCARAS)
  81.                    estado_siguiente = MENU_PLACAFREAK;
  82.              }
  83.           estado_actual = estado_siguiente;
  84.           salir = procesa_estado(estado_actual);
  85.           }
  86.        }
  87.     }
Título: Re: programacion de menus en C
Publicado por: HH_HOZ en 21 de Octubre de 2007, 00:27:18
 :) Tienen razon la verdad hacer la interfaz de usuario siempre se hace un codigo largo y consume muchos recursos. Gracias por tu respuesta  MGLSOFT, voy a seguir programando.... espero que no me quede demasiado grande el programa. Y muchas gracias modulay por enviarme partes del programa que estas haciendo de menus voy a analizarlo.....  :-/
Título: Re: programacion de menus en C
Publicado por: QIQE en 21 de Octubre de 2007, 17:50:39
hola a mi tambien me a tocado alguna que otra vez lidiar con estos problemillas.... la primera vez recurri a if else... pero se hace engorroso, la ultima vez lo hice con swtich case.  ya que asi el codigo queda mas intuitivo y facil de leer a parte de estosi no tengo mas de 9 menus, y mas de 9 sub menus por menu, utilizo esta tecnica.
us una variable int que ira desde 0 a 99 como mucho, y la inicializo a 0 por lo que que si esta en 0 estoy en el menu inicial, si entro al menu 1 le incremento 10 por lo que se queda como 10 y si entro al sub menu 2 por ejemplo le incremento 2 por lo que se queda como 12, asi que el swtich-case (12) se corresponde con el submenu 2 del menu 1, espero que os sea de ayuda un saludo
Título: Re: programacion de menus en C
Publicado por: MGLSOFT en 21 de Octubre de 2007, 23:58:17
Yo tambien utilizo el switch para hacer los menues... :mrgreen: