Menú y LCD 2 x 16 duda al implementarlo

Para que son 4 botones?
Serian 2 de dirección (arriba-up- y abajo-down-) y 1 de confirmación-ok-? el otro que sería... un 'escape'-esc-?

Se me ocurre a base de un contador-registro, primero estaría en su valor inicial con cero, cuando se oprima down, el registro incrementa en uno, si se oprime up entonces el registro decrementa en uno.
Dependiendo del valor del registro se imprimiría la pantalla adecuada:

Código:
x = 0

--> Opción0x0
    Opción0x1
---------------
x = 1

    Opción0x0
--> Opción0x1
----------------
x = 2

--> Opción0x2
    Opción0x3
----------------
x = 3

    Opción0x2
--> Opción0x3
----------------

Aunque de esta forma no se ve tan "fluido" el cambio, para eso seria mejor abordar todas las posibles combinaciones, que serían 4C2=6. Pero para ello el registro lo dividiría en dos partes: dos bits para la posición absoluta y un bit para la posición relativa.
Al decir posición absoluta son las pantallas

Opción0
Opción1

Opción1
Opción2

Opcion2
Opcion3

Y la posición relativa sería la del cursor, en la linea superior o en la inferior:

Código:
Cursor en primer linea

--> Opción0x0
    Opción0x1
---------------
Cursor en segunda linea

    Opción0x0
--> Opción0x1
---------------

Esto es suponiendo un total de 4 opciones, pero puede extenderse a más.

Buena Vibra!
 
La verdad no entendí del todo tu idea , tenés algun código o diagrama de flujo. Lo que pasa es que ando verdaderamente perdido con el tema y no se de donde empezar.

Agradesco tu ayuda.
 
Hola a todos!

He realizado unos cuantos menus con pantallas de 2x16, y creo que la mejor forma de hacerlo es la siguiente:

En la primer linea del LCD mostras un titulo del menu, o algun texto, por ejemplo: "Elija una opcion", y en la segunda linea, mostras la opcion. Con 2 teclas incrementas o decrementas un contador, y en funcion de ese contador mostras una opcion en la segunda linea del lcd.
Con otra tecla entras a la opcion, una vez dentro de la opcion (si tenes que mostrar mas opciones) haces lo mismo. Osea, en la primer linea mostras el nombre de la opcion a la que entraste, y en la segunda linea mostras las opciones disponibles en funcion de un contador.

Un menu de asi lo podes implementar asi:

Funcion mostrar_menu:

Escribo algo en la primer linea.
Pongo un contador a 0.

loop:
si tecla es +, incrementar contador
si tecla es - , decrementar contador
si tecla es enter {
si contador es 0, ejecutar la opcion 1
si contador es 1, ejecutar la opcion 2
si contador es 2, ejecutar la opcion 3
si contador es 3, ejecutar la opcion 4
si contador es 4, ejecutar la opcion 5
}

(de esta forma, cuando llegues a la ultima opcion, te quedaras en esa)
si contador es menor a 0, contador = a 0
si contador es mayor a numero de opciones, contador = a numero de opciones

(de esta forma, cuando llegues a la ultima opcion, iras a la primera) ( elije una sola)
si contador es menor a 0, contador = a numero de opciones
si contador es mayor a numero de opciones, contador = a 0

si contador es 0, mostrar en la linea 2 la opcion 1
si contador es 1, mostrar en la linea 2 la opcion 2
si contador es 2, mostrar en la linea 2 la opcion 3
si contador es 3, mostrar en la linea 2 la opcion 4
si contador es 4, mostrar en la linea 2 la opcion 5
....
esperar un tiempo cortito(unos 20 o 30 ms)
goto loop.

Espero haberte ayudado, cualquier cosa que no entiendas avisa.

Saludos
 
Moyano Jonathan dijo:
La verdad no entendí del todo tu idea , tenés algun código o diagrama de flujo. Lo que pasa es que ando verdaderamente perdido con el tema y no se de donde empezar.

Agradesco tu ayuda.

Pss no tengo ningún código, de hecho nunca he armado algún programa de ese tipo, son las primeras ideas que se me ocurrieron al leer tu post. Mi idea es parecida a la de 'luis_e' solo que las opciones van "rotando" sobre el LCD, las dos lineas contienen opciones.
Y ahora que lo pienso bien, lo que nombre como 'posición relativa' sería más bien la 'absoluta' (primer linea o segunda linea) y lo contrario para la otra.

Buena Vibra!
 
Bueno he terminado de pulir si se puede decir asi el código del LCD para mis requerimientos, gracias a la ayuda de ustedes. :cool:

Lo que hace es primero me presenta todas las opciones del menu y luego con 3 botones up/down y OK me meto a las diferentes opciones.
 

Adjuntos

  • menu_lcd_619.rar
    12 KB · Visitas: 1,282
Yo elaboro los menus con ayuda de una variable de conteo y muchas comparaciones

Código:
Si menu=00{
-escribir en linea 1 display (texto menu 0)
-escribir en linea 2 display (texto menu 0)
si tecla arriba menu=02 (numero del ultimo menu usado)
si tecla abajo menu=01 (siguiente menu)
si tecla enter ejecutar accion 0
}

Si menu=01{
-escribir en linea 1 display (texto menu 1)
-escribir en linea 2 display (texto menu 1)
si tecla arriba menu=00 (menu anterior)
si tecla abajo menu=02 (siguiente menu)
si tecla enter ejecutar accion 1
}

Si menu=02{
-escribir en linea 1 display (texto menu 2)
-escribir en linea 2 display (texto menu 2)
si tecla arriba menu=01 (menu anterior)
si tecla abajo menu=00 (siguiente menu)
si tecla enter ejecutar accion 1
}

En fin... la idea es esa, para submenus pongo variables de submenus y las comparo del mismo modo, o puedes incrementar la variable menu en pasos de 10 en 10 que te permitirian poner 9 submenus en cada menu
 
Haber... aqui hay un ejemplo que hice para un cliente, es un extracto de la subrituna de configuracion, por obvias razones no te puedo pasar el programa completo ni decir que hace, pero si te puedo explicar como funciona la subrutina

Para este caso el cliente no queria el uso de 3 botones (arriba, abajo y enter) queria que todo se hicera con un unico boton lo que me obligo a tener que detectar el tiempo que se mantiene presionado, ese tiempo lo comparo contra una constante (_toquel) para saber si se hizo un toque largo o corto y definir que se tiene que hacer a continuacion

Antes de entrar a la sub coloco la variable estado a 21 para mantener el programa dentro del loop principal de configuracion

Si te fijas cada loop es identico y solo cambia las acciones que debe ejecutar cada submenu:

1.-Se coloca un numero en el display que identifica el setpoint que se esta cambiando
2.-Se detiene momentaneamente el programa en lo que la persona suelta y vuelve a presionar el boton para poder contabilizar el tiempo de presionado
3.-Si el toque es corto se pasa al siguiente submenu
4.-Si el toque es largo se pone momentaneamente estado a 30 para editar la variable
5.-Se coloca el valor de la variable en el display
6.-Se vuelve a esperar a que se suelte y se presione el boton para medir de nuevo
7.-Si el toque es corto se incrementa la variable
8.-Si el toque es largo se sale del loop de incremento

Espero que este entendible...
 

Adjuntos

  • rutina_187.c
    6.7 KB · Visitas: 469
Muchas gracias chico, una pregunta el código es en C18, yo utlizo C de CCS pero el código que me pasaste es totalmente trasportable. De nuevo muchas gracias , en este momento ya tengo algo cocinado con interrupciones pero me parece que de la forma en que lo planteas vos es bastante interesante.

PD: tengo algunas dudas, por ejemplo:

- A que le llamas setpoint que está cambiando?
- TMR0 cuando termina de contar , lo verificas por interrupciones o lo haces mirando la bandera que lo indica?
- La variable que sube o baja segun el tiempo de pulsado cual es?

perdon por tantas pregutas , pero es para orientación nomás.
 
Nop... el codigo es para CCS pero el micro que programo es un AVR de Atmel, por eso ves diferencias, en cuanto a las preguntas aqui te van las respuestas:

- Cada setpoint (por que en el ejemplo son 4) es un valor de calibracion para la maquina que se realizo, el cliente entra a esa subrutina para modificar los rangos de operacion en los que trabaja el equipo, y con cada pulsacion se va incrementando ese valor en especial, cuando se excede de cierto nivel maximo lo reinicializo al valor minimo, esto es debido a que solo cuento con un boton,

- El TMR0 siempre esta corriendo y monitoreando el boton, cuando detecta que hubo un cambio de estado habilita una bandera (bbotone,btnconf) que avisa al programa que hubo una pulsacion y comienza a incrementar la variable contbtn en cada interrupcion subsecuente

- La variable de conteo de tiempo de pulsado es contbtn, pero recuerda que este ejemplo es mas complejo por que el cliente solo queria un boton, en tu caso puedes colocar 3 o mas botones que hacen que el programa sea menos complejo y podrias eliminar toda la parte de monitoreo de tiempo de pulsado

Deja hago un ejemplo similar para un caso de 3 botones (enter, arriba y abajo) y te lo subo para que lo veas, desafortunadamente no se programar para C18, pero al estar programando ambos en C la conversion AVR-PIC se puede hacer de manera mas simple
 
Aca te dejo un pequeño programa de un menu con algunos submenus, y un archivo de proteus, para que veas como trabaja. Esta hecho en C18, para correr en un pic18f2550, a 40Mhz, pero se puede adaptar facilmente a la velocidad que necesitas.

Espero que te sirva, cualquier duda avisa.

Tambien hay una libreria para manejar lcds de 2x16 bastante completa, que fui armando en bastante tiempo.
En el archivo LCD.h estan los defines para indicar en los pines que va conectada. Si necesitas cambiar algo avisame, porque la hice para adaptarla sin modificar el codigo, aunque esto se va un poco del tema central.
 

Adjuntos

  • menu_297.rar
    90.2 KB · Visitas: 622
Hola amigos que tal?, estoy haciendo un proyecto fin de curso con una lcd, pero no se ve nada , le he puesto algun progrma de inicializacion que ví ene ste mismo foro, y lo introduzco en el pic 16f876 , y lo unico que sale son cuadrados negros y barras muy fina estilo codigo de barras y nada mas , si alguien pudueria ayudarme se lo agradeceria mucho.Gracias por adelantado
 
Hace el programa que postee en la primera página de este hilo , los consejos de chico3001 soy muy útiles te pueden ayudar a hacer lo que necesitas.

Ahora si querés hacer "algo" con el LCD fijate en el foro hay muchos ejemplos.
 
Aqui tengo un ejemplo con atmega8 de un temporizador que activa una luz utilizando un reloj todo se configura en lcd , compilado en codevisionavr.
cambie de archivo.
 

Adjuntos

  • temporisador2_138.rar
    28.6 KB · Visitas: 184
Atrás
Arriba