Autor Tema: programacion de menus en C  (Leído 3917 veces)

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

Desconectado HH_HOZ

  • PIC10
  • *
  • Mensajes: 6
programacion de menus en C
« 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.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: programacion de menus en C
« Respuesta #1 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:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: programacion de menus en C
« Respuesta #2 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.     }
« Última modificación: 20 de Octubre de 2007, 16:10:00 por Modulay »

Desconectado HH_HOZ

  • PIC10
  • *
  • Mensajes: 6
Re: programacion de menus en C
« Respuesta #3 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.....  :-/

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: programacion de menus en C
« Respuesta #4 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
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: programacion de menus en C
« Respuesta #5 en: 21 de Octubre de 2007, 23:58:17 »
Yo tambien utilizo el switch para hacer los menues... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.