Autor Tema: Menu desplegable - LCD20x4 - PIC16F877A  (Leído 11040 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Menu desplegable - LCD20x4 - PIC16F877A
« en: 16 de Abril de 2009, 23:05:18 »
hola

Me planteo la realizacion de un menu de opciones para mostrar sobre un LCD de 4 lineas, de forma que con pulsadres me pueda desplazar por las diferntes opciones del menu .

-> menu1
    menu2
    menu3
    menu4
    menu5
    menu6
    menu7 //volver
-----------------si pulso uno de estos me modtrria los que tenga dentro

->menu11
    menu12
    menu13
    menu14
    menu15 //volver
-----------------------------si pulso este

->menu111
   menu112
   menu113 //volver

------------------------

si el programa fuera para pc seria muy facil con printf("...") mostraria el menu y con un get obtendria leerria el teclado para con un switch elegir la opcion y  dentro del case llamaria a uan funcion, pero lo que quiero es mediante pulsadores deplazarme de abajo arriba por el menu y cuando pulse otra tecla en una linea el entienda que quiero entrar en ese menu y me realice la opcion del menu.

En un primer momento pense en definirlos dentro de un vector para ser mas facil el recorrer el menu de arriba abajo.
de forma que cuando pulso una tecla incremento una variable que es la posicion del vector, pero el problema llega cuando quiero sacarlo por pantalla.

alguana sujerencia.


algunas ideas aun poco maduras...
============================

char menup[7][10]={"1.-menu1","2.-menu2","3.-menu3","4.-menu4","5.-menu5","6.-menu6","7.menu7,"}
char menu1[5][10]={"1.-menu11","2.-menu12","3.-menu13","4.-menu14","5.-menu15"}
char menu12[3][15]={"1.-menu111","2.-menu112","3.-menu113"}

for(a=0;a<7;a++)
{
lcd_gotoxy(2,a+1);
printf("%c",menu[a][10]);     //no se si se definiria asi.
}



Un saludo y una ayudita.

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #1 en: 17 de Abril de 2009, 01:14:58 »


  Hola, he realizado muchos menus con submenus, mi clave es usar el comando if(x && y) { hago esto}

lo que quiero decir es que debes manejar con varibles numericas los menus por ejemplo si corresponde al item 1 subiten 2 muestra el mensaje 2, los mensages los saco mediante punteros asi ahorro memoria. Debes empezar con algo sencillo e ir probando hasta llegar al menu completo.  :x)
Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #2 en: 17 de Abril de 2009, 11:24:15 »
for(a=0;a<7;a++)
{
lcd_gotoxy(2,a+1);
printf("%c",menu[a][10]);     //no se si se definiria asi.
}

el detalle es que escribirá fuera de la pantalla apatir de cuando a>3.

solucion! : realiza un for que llene la pantalla for(a=0;a<4;a++), luego amarralo con un indice que le indique los 4 valores que jalará de tu array char menup.

se entiendio  :?


a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #3 en: 17 de Abril de 2009, 18:50:42 »
hola Amigos

Probe con un codigo sencillo:

----------------------------
Código: C
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. /// LCD4x20                                                                   //////
  3. ///                                                                           //////
  4. ////////////////////////////////////////////////////////////////////////////////////
  5.  
  6. #include <16F877A.h>                ///   libreria para el manejo del pic16f877a
  7. #use delay(clock=4000000)          ///   declara  la frecuencia del cristal
  8. #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
  9. #include <lcd420.c>
  10.  
  11.  
  12. #use fast_io(A)
  13. #use fast_io(B)
  14. #use fast_io(C)                     ///   con esta instruccion evitamos que
  15. #use fast_io(D)                     ///   se este configurando cada vez que usamos
  16. #use fast_io(E)                     ///   alguna instruccion de entrada o salida
  17. #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
  18.  
  19. #byte portc = 7                     /// se definen direcciones de memoria
  20. #byte portd = 8
  21.  
  22.  
  23. void mv_cursor(int b);
  24. char menup[7][10]={"1.Menu1","2.Menu2","3.Menu3","4.Menu4","5.Menu5","6.Menu6","7.Menu7"};
  25. int a,b=1;
  26.  
  27. ///////////////////////////////////////////////////////////////////////////////////
  28. //////////////////////Comienzo de la funcion principal//////////////////////////
  29. ///////////////////////////////////////////////////////////////////////////////////
  30. void main()
  31. {
  32.   lcd_init();                               /// inicializamos lcd
  33.  
  34.    for(a=0;a<4;a++)
  35.      {
  36.      lcd_gotoxy( 3,a+1);
  37.      printf(lcd_putc,"%s",menup[a]);
  38.      }
  39.      lcd_gotoxy(1,1);
  40.      printf(lcd_putc,"->");
  41. while(!input(PIN_A2))
  42.    {
  43.    if(!input(PIN_A0))
  44.       {
  45.       delay_ms(125); //evitar rebotes
  46.       b=b+1;
  47.       mv_cursor(b);
  48.       }
  49.    if(!input(PIN_A1))
  50.       {
  51.       delay_ms(125); //evitar rebotes
  52.       b=b-1;
  53.       mv_cursor(b);
  54.       }
  55.    }
  56.  
  57. }
  58. ///para mover cursor
  59.       void mv_cursor(int b)
  60.       {
  61.       lcd_gotoxy(1,b-1);
  62.       printf(lcd_putc,"  ");
  63.       lcd_gotoxy(1,b);
  64.       printf(lcd_putc,"->");
  65.       }

No se lo que ocurre pero, intuyo que los pulsadores me la estan jugando.
Segun el programa si pulso p3 o sea RA2 podre pulsar p1 para bajar en el menu y p2 para subir en el menu.
Pero en la simulacion se ve que lo hace sin pulsar nada.

Algún Consejillo.


Que ocurre?.. ¿? :?
« Última modificación: 17 de Abril de 2009, 21:48:54 por pajaro »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #4 en: 18 de Abril de 2009, 12:25:57 »
como dicen en el futbol, en prima:

- los indicadores de los pulsadores del simulador estan en gris, lo que refiere que la conexión de ese pin esta extraña pues deberia reflejar azul o rojo según el estado del pulsador. veamos que mas encontramos.

- de ahi me di cuenta que tus entradas no tienen pull down, estan al aire..... nooooooooooooooooooooooooooooo

- cual es el estado por defecto de los pulsadores? los deje a tierra y seguian loquitos, los puse a positivo y se corrigio. :shock:
« Última modificación: 18 de Abril de 2009, 12:34:10 por micro_cadaver »
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #5 en: 18 de Abril de 2009, 16:21:01 »
Hola.

Es mejor que definas tus variables asi:

Código: C#
  1. const char menu[7][10] = {"1.Menu1","2.Menu2"....};

Para que ahorres memoria.

Para escribir el string correspondiente, basta con fijar la direccion de la fila y la columna en la LCD, no veo porque moverlas.

Saludos
El papel lo aguanta todo

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #6 en: 18 de Abril de 2009, 19:02:09 »
Hola ..

Gracias por vuestro aporte, vino como agua de mayo que dicen por acá.

Ya corregí lo del vector con const, paso de 23% de peso al 3% menudo cambio si señor, quiero más trucos como ese.

Por cierto, es un vector o es un array tengo esa duda desde hace 2 semanas.? este C difiere .

Lo del LCd_gotoxy no.... no acabo de entenderlo ..

si tengo un menú con 8 líneas y mi lcd solo tiene 4 entonces quiero que me muestre las 4 primeras líneas, pueda seleccionarlas con esto "->" es decir pulso el botón y me baja hasta la línea 4 (baja una posición a cada pulsación) como máximo pero si sigo pulsado el botón lo que debería subir son las líneas es decir se reescribirían en la línea 1 dato 1(anteriormente estaba el 0 del vector ), en línea 2 el dato 2, en línea 3 el dato 3, en la línea 4 el 4, pero si vuelvo a pulsar el botón, me mostraría en la línea 1 el dato de 2, en línea  2, el dato 3, en línea 3 el dato 4,en línea 4 el dato 5, es decir el curso no baja pero la líneas si las subo dan efecto que si que baja el cursor.

Si pulso el botón de subir cursor el "->" subiría hasta la línea 1(cada vez que pulse sube una posición) y si le sigo pulsando lo que bajaría seria la línea.
eso es lo que intento hacer, pero no se si es muy engorroso o se puede hacer de otra forma mas sencilla.

Lo que intento es que pulsando el botón baje el curso hasta el menú que yo quiera y con otro botón suba después cuando pulse un tercer botón me seleccione ese menú y se meta dentro ....y esto será otra historia parecida ala anterior...

---------------------------------------------


El tema de los pulsadores, según lo veo yo (corríjanme si me equivoco, por favor), si son pulsadores esos pines son de entrada, si no pulso el botón no le meto nada y si le pulso si que le meto, ahora llega el otro tema.

Si le pulso, le meto, pero que le meto?, por ahí unos le meten 0 otros le meten 1, yo por manía creo, si  esta pulsado prefiero que le meta 1 y si no que le meta 0, como en electrónica digital, creo que así es mejor, pero claro, el pulsado te conecta la entra a lo que hay en el otro lado, si hay una masa y  pulsas meterás un cero verdad, pero si hay un vcc y pulsas meterás un 1.

menudo cacao verdad? menudo cacao lleva el nene en la cabeza?
lo de las resistencias pull up o pull down realmente para que se usan, para reinyectar señal? no las llevo todas conmigo... y cuando se usan ?y que puertos necesitan conexión de estas?

se que las pull up son positivas verdad? y las down son de masa verdad? corregir si me equivoco.


Un saludo nos vemos..




« Última modificación: 18 de Abril de 2009, 19:13:28 por pajaro »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #7 en: 18 de Abril de 2009, 23:10:04 »
Hola.

Yo variaria el display cada 4, es decir, cuando pulso la flecha hacia abajo solo se mueve la flecha apuntadora, el resto no debe cambiar, cuando pase del 4 al 5, colocaria las siguientes 4 opciones:

-----------------------------
> Menu1
   Menu2
   Menu3
   Menu4
-----------------------------

-----------------------------
   Menu1
> Menu2
   Menu3
   Menu4
-----------------------------

...

-----------------------------
> Menu5
   Menu6
   Menu7
   Menu8
-----------------------------
El papel lo aguanta todo

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #8 en: 21 de Abril de 2009, 18:23:40 »
hola...


probe el programita...y funciona bien a medias


Código: C
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. /// LCD4x20                                                                   //////
  3. ///                                                                           //////
  4. ////////////////////////////////////////////////////////////////////////////////////
  5.  
  6. #include <16F877A.h>                ///   libreria para el manejo del pic16f877a
  7. #use delay(clock=4000000)          ///   declara  la frecuencia del cristal
  8. #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
  9. #include <lcd420.c>
  10.  
  11.  
  12. #use fast_io(A)
  13. #use fast_io(B)
  14. #use fast_io(C)                     ///   con esta instruccion evitamos que
  15. #use fast_io(D)                     ///   se este configurando cada vez que usamos
  16. #use fast_io(E)                     ///   alguna instruccion de entrada o salida
  17. #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
  18.  
  19. #byte portc = 7                     /// se definen direcciones de memoria
  20. #byte portd = 8
  21.  
  22.  
  23.  
  24. const char menup[7][10]={"1.Menu1","2.Menu2","3.Menu3","4.Menu4","5.Menu5","6.Menu6","7.Menu7"};
  25. int a=0,b=4,y,pos;
  26.  
  27. ///////////////////////////////////////////////////////////////////////////////////
  28. //////////////////////Comienzo de la funcion principal//////////////////////////
  29. ///////////////////////////////////////////////////////////////////////////////////
  30. void main()
  31. {
  32. //set_tris_a(0x3F);
  33. //set_tris_b(0x37);
  34. //set_tris_c(0x37);
  35. //set_tris_d(0x37);
  36. //set_tris_e(0x00);
  37.  
  38.   lcd_init();                               /// inicializamos lcd
  39.  
  40. y=1;
  41. /*
  42.  if(!input(PIN_A0))
  43.  {
  44.   y=y+1;
  45.   a=a+1;
  46.  }
  47.  
  48.  if(!input(PIN_A1))
  49.  {
  50.   y=y-1;
  51.   a=a-1;
  52.  }
  53.  */   los comento por no van, por ahora
  54.  
  55.    
  56.    if((y>a)&&(y<a+b))
  57.        {
  58.         for(pos=a;pos<a+b;pos++)
  59.           {
  60.           lcd_gotoxy(3,pos+1);
  61.           printf(lcd_putc,"%s",menup[pos]);
  62.           }
  63.        }
  64. }


¿como puedo poner el pulsador P1 y p2 con entradas, le deje comentado porque no me funciona bien
tal como esta solo muestra el menu en la posicion del cursor "->" 1,1 .

si el hardware si es el mismo..

un saludo
« Última modificación: 21 de Abril de 2009, 20:21:32 por pajaro »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #9 en: 21 de Abril de 2009, 19:40:56 »
es el mismo hardware de la vez pasada?
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #10 en: 21 de Abril de 2009, 20:27:28 »
Hola..

¿como se hace para sacar un ascii por pantalla?

printf(lcd_putc,"%algo",);

no recuerdo como se hacia, lo quiero para sustituir "->" por su ascii se que es el 126,
o por lo menos ese fue el que me dio el programa que me hice

por cierto, amigo Micro_cadaver

¿como rectificaste el problemilla de los pulsadores a mi me siguen saliendo en gris?.


un saludo
« Última modificación: 22 de Abril de 2009, 17:41:39 por pajaro »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #11 en: 21 de Abril de 2009, 23:53:45 »
printf(lcd_putc, "%c",Direccion del caracter especial)
El papel lo aguanta todo

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #12 en: 22 de Abril de 2009, 01:13:35 »
por cierto, amigo Micro_cadaver
¿como rectificaste el problemilla de los pulsadores a mi me siguen saliendo en gris?.

poniendo pull down a los pulsadores, pero te preguntaba si tu hardware ha cambiado para el ultimo còdigo que has subido.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #13 en: 22 de Abril de 2009, 17:57:55 »
hola amigos

Micro_cadaver, el tema del hardware si que le modifique algo, no recuerdo el que, pero si que lo modifique, le puse un buzzer
de todas formas bajate el PIC_002.

Otra cosa donde pusiste esas resistencias pulldown, cambiaste las de los pulsadores por pulldown, le pusiste algo al codigo,
dime algo.
 

MLO__, voy a probar eso, yo antes lo tenia asi:
#define cur 126

....
....

void cursor(int y)
 {
  Lcd_gotoxy(1,y);
  printf(lcd_putc,"%c",cur);
 }

quiero evitar el definir

funciona correcto..muy bien, va correcto,  gracias. Otro pasito.


A ver si soluciono el problemilla de los pulsadores...tambien tengo que mirar lo de las pulsaciones y el sonido
pulso y pita, ¿alguna función?


¿Como se puede hacer, para ver en el proteus el codigo fuente, sin que te muestre las librerias incluidas, por ejemplo la del LCD,
solo quiero ver el codigo fuente, no el lincado ya con las librerias de cabecera..



un saludo.
« Última modificación: 22 de Abril de 2009, 18:02:20 por pajaro »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Menu desplegable - LCD20x4 - PIC16F877A
« Respuesta #14 en: 22 de Abril de 2009, 19:37:26 »
estuve viendo el programa del pic001, y hay un error en la lógica del programa. pero aparte de eso esta los pulsadores, es que el simbolo plomo significa estado indeterminado, fijate en tu diagrama, estas dejando los pines de entrada Px al aire. no estan a tierra estan al aire, recien cuando le pulsas entra un 1, pero solo en ese caso. por eso te fallan.

saludos  :-/ :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com


 

anything