Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

01/02/2009 #1

Avatar de Moyano Jonathan

Menú y LCD 2 x 16 duda al implementarlo
Hola a todos.

Quería saber si me pueden ayudar a llegar a algo como esto:
YouTube - Menu LCD y PIC16F877A
Mi problema específicamente es el desplazamiento de las opciones a través del pulsador.

Cualquier idea o código que pueda orientarme es bienvenido
01/02/2009 #2

Avatar de sangreaztk

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!
01/02/2009 #3

Avatar de Moyano Jonathan

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.
02/02/2009 #4

Avatar de luis_e

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
02/02/2009 #5

Avatar de sangreaztk

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!
02/02/2009 #6

Avatar de Moyano Jonathan

Bueno he terminado de pulir si se puede decir asi el código del LCD para mis requerimientos, gracias a la ayuda de ustedes. 8-)

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.
Archivos Adjuntos
Tipo de Archivo: rar menu_lcd_619.rar (12,0 KB (Kilobytes), 1252 visitas)
02/02/2009 #7
Moderador

Avatar de Chico3001

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
02/02/2009 #8

Avatar de Moyano Jonathan

gracias chico ya voy a ver que puedo hacer con la información que posteaste. Cualquier cosa te pregunto las dudas.

PD: Tenés algún código hecho como para guiarme?
02/02/2009 #9
Moderador

Avatar de Chico3001

en que lenguaje?
02/02/2009 #10
Moderador

Avatar de Chico3001

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...
Archivos Adjuntos
Tipo de Archivo: c rutina_187.c (6,7 KB (Kilobytes), 450 visitas)
03/02/2009 #11

Avatar de Moyano Jonathan

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.
03/02/2009 #12
Moderador

Avatar de Chico3001

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
03/02/2009 #13

Avatar de Moyano Jonathan

Ok dale , igual voy a estudiar tu código para un botón que se ve bastante bueno para implementarlo.
04/02/2009 #14
Moderador

Avatar de Chico3001

Listo... aqui esta la rutina, solo nitas adaptarla a tu micro

Archivos Adjuntos
Tipo de Archivo: c rutina_815.c (2,3 KB (Kilobytes), 404 visitas)
04/02/2009 #15

Avatar de Moyano Jonathan

La verdad que muchas gracias te agradesco el esfuerzo.
04/02/2009 #16

Avatar de luis_e

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.
Archivos Adjuntos
Tipo de Archivo: rar menu_297.rar (90,2 KB (Kilobytes), 601 visitas)
04/02/2009 #17

Avatar de Moyano Jonathan

Gracias por ayuda, la voy a simular y luego contare las dudas que tenga.
12/02/2009 #18


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
12/02/2009 #19

Avatar de Moyano Jonathan

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.
12/02/2009 #20


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.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.