TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pajaro en 16 de Abril de 2009, 23:05:18

Título: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro 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.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: mariano_pic 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)
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver 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  :?
(http://img201.imageshack.us/img201/3769/kiko.jpg)

Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro 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?.. ¿? :?
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver 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:
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: MLO__ 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
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro 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..




Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: MLO__ 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
-----------------------------
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro 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
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver en 21 de Abril de 2009, 19:40:56
es el mismo hardware de la vez pasada?
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro 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
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: MLO__ en 21 de Abril de 2009, 23:53:45
printf(lcd_putc, "%c",Direccion del caracter especial)
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver 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.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro 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.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver 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  :-/ :-/
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 22 de Abril de 2009, 20:50:39
hola Micro_cadaver

puedes indicarme en que línea y de que se trata?

En proteus tengo conectado los pulsadores del puerto A a Vcc despues esta el boton y depues hay una resistencia 220 ohmios
en el ccs lo configure con "#use fast_io(A)"  y depues le puse     "set_tris_a(0x3F);" todo el puerto a como entrada.

pero siguen en gris que sucede..
microcadaver puedes adjuntos los ficheros con tu rectificacion.

un saludo.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver en 23 de Abril de 2009, 11:36:41
me referia a esto, comparalo con lo que has puesto tu:
(http://img141.imageshack.us/img141/9668/111jxm.jpg)

corrige eso y luego te explico el otro error jijijijijiji
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 23 de Abril de 2009, 12:53:49
Hola Amigos


Micro_Caaver

Error 1 corregido, no lograba ver que estaba al aire si no estaba pulsado el boton, que error.
El pic, ¿cuanta corriente soporta?, por poner un valor de resistencia que no me coma, les puse una de 220 ohmios.

no me avanza el menu, voy  a ver..

Un saludo.

Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver en 23 de Abril de 2009, 14:31:56
el siguiente error es que en tu programa no tienes definido de donde a donde debe de circular el flujo del programa, pues cuando llega a la ultima linea del codigo se pasa denuevo a la primera linea, donde esta el LCD_INI. te fijastes en eso?
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 23 de Abril de 2009, 19:49:45
hola Amigos. (modificado)

Micro_Cadaver mire el programa, y le he actualizado, funcionaba a media,
me subian y me bajaban el cursor pero no me refrescaba las pantallas, asi que lo he vuelto a replantear.

He reorientado la forma de mostrar el menu, lo pense de otra forma,
como si fuera una matiz.que sobrescribe las columnas sobre si mismas

tenemos el vector de 8 elemtos y queremos mostrarlos en filas de 4.

v[8]={1,2,3,4,5,6,7,8};

y queremos mostrarlos asi

1    2    3    4    5
2    3    4    5    6
3    4    5    6    7
4    5    6    7    8

p1  p2  p3  p4  p5-->pantallas


mostrara la pantalla 1 mientras el cursor este en la linea 1 o 2 o 3 o 4 cuando pase a la linea 5 el cursor se mantendra en linea 4 pero la pantalla sera la 2 .

intento hacer una funcion, que sea independiente del numero de lineas a mostrar,
y del numero de elemetos a mostrar, y de la posición que la quiero mostrar.

estoy trabajando sobre el pic_002.En realidad el proximo sera pic_003.

estoy teniendo problemas con la situacion del cursor si lo situao antes del for, no me respeta la posicon indicada antes del for,

Código: C
  1. lcd_gotoxy(posA,posB);                        ///situao cursor
  2.         for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  3.           {
  4.            printf(lcd_putc,"%s\n",menup1[pos-1]);       ///muestra dato
  5.           }

Código: C
  1. //lcd_gotoxy(posA,posB);                        ///situao cursor
  2.         for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  3.           {lcd_gotoxy(posA,posB);
  4.            printf(lcd_putc,"%s\n",menup1[pos-1]);       ///muestra dato
  5.           }

¿Como se hace en proteus, para que que alver el fuente solo te muestres el que ves en el ccs, no quiero que me muestre cuando semete el include del LCD?

Un saludo.


Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver en 23 de Abril de 2009, 20:51:03
hay un boton de salto, otro paso, y el otro de que corra.

El de salto es este:
(http://img264.imageshack.us/img264/873/4444q.jpg)


sube tu codigo con tu diagrama en proteus para darle una chekeada (revisarlo).
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 23 de Abril de 2009, 21:28:46
hola Amigos.  (modificado)

Micro_Cadaver

Pongo el de la version PIC_003 en ella solo se ven las 4 primeras lineas (pantalla 1)
los cursores si que se mueven, pero funciona a medias.

Pongo el de la version pic_004 es el que he reorientado basandome en dos for, la matriz que sobrepone las columnas.

Estoy teniendo algunos problemillas el buzzer antes no me daba problemas cuando arrancaba la simulacion,
me dice
"Error en Active Model BUZ1"
Failed to inicialize audio drivers

fallo de inicializacion, no me dio en veces anteriores esto.

Otra cosa que me hace, es: cuando inicio la simulacion desde los botones de animacion me salta el modo debug
 y tengo que entrar en menu y pulsar alt+F12, pero entonces me muestra las lineas 1  y 3 en "alameo".

No se que he tocado pero sin tener puntos de restauración puestos en el fuente, no deberia de saltarme la simulacion en modo debug.

Tengo algunos problemillas...


un saludo..
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 24 de Abril de 2009, 08:56:06
Hola Amigos

Necesito una ayudita teórica, no recuerdo como se pasaba un vector por función.

me explico, tengo un cachito de programita el cual quiero usar en varias ocasiones, asi que la solución en convertirlo en función.

Código: C
  1. ...
  2. const char menup1[8][10]={"1.Menu1A","2.Menu2A","3.Menu3A","4.Menu4A","5.Menu5A","6.Menu6A","7.Menu7A","8.Atras"};
  3. ...
  4.  
  5.  for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  6.           {
  7.            lcd_gotoxy(posA,posB);
  8.            printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra dato
  9.            posB=posB+1;
  10.           }
  11.  
  12. ...
  13. ...

El problema llega cuando tengo un vector, más bien un array, que no se como definirlo en cabecera de función.



Código: C
  1. ...
  2. ...
  3. void pantalla(int col,int lin,int posA,int posB,char menup1[8])        //no se como definirlo, le quite const (modificado)
  4. {
  5. int pos;
  6.  for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  7.    {
  8.     lcd_gotoxy(posA,posB);
  9.     printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra dato
  10.     posB=posB+1;
  11.    }
  12. }
  13.  
  14. ...
  15. ...


EL compilador de me una de errores...

Solucionado

Solucione los errores cambiado la cabecera de "const char vector" por "char vector"

Pero en programa me sigue sin funcionar...

un saludo
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 24 de Abril de 2009, 09:12:45
Hola Amigos

Parece que funciona el menu, pero aun no consegui meterlo en una función.
Me tira el error, de que no se puede convertir un puntero en una constante.

Alguien puede decirme lo que ocurre.

Un saludo

*nota: el archivo adjunto fue modificado.*
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 27 de Abril de 2009, 20:33:39
hola amigos

Quiero dar una vuelta  de tuerca más, ha esto del menu.

se quiere implementar una funcin que sea capaz de mostar en pantalla los valores de un vector, y se muestre como en el post anterior.
Péro con la salvedad que cuando se pulse P3 se selecione el menu, lo que es lo mismo se introduzca dentro de esa opcion.

no se como hacerlo, si implementar un vector para cada menu sub anidado, o utilizar matrices, no se.

menu 1
-> 1a.-aaaa
        1a.1b
            1a.2b.1c
            1a.3b.1c

        1a.2b
        1a.3b
     2a.-aaaa
     3a.-aaaa


es decir el menu 1 es un vector[8]={ 1a,2a,3a,...}
para el sub menu de 1a otro vectory asi sucesivamente.

o que si tengo claro:


switch(op) //menu principal
{
case 1: sub menu 1
case 2: sub menu 2
...
...
case 8: sub menu 8 sal del menu
}

switch(op) //submenu1  principal
{
case 1: sub menu 1
case 2: sub menu 2
case 3: sub menu 3
case 4: sub menu 4  //vuelve al menu anterior

}

switch(op) //submenu de sub menu1  principal
{
case 1: sub menu 1
case 2: sub menu 2
case 3: sub menu 3
case 4: sub menu 4  //vuelve al menu anterior

}

switch(op) //submenu2  principal
{
case 1: sub menu 1
case 2: sub menu 2
case 3: sub menu 3
case 4: sub menu 4  //vuelve al menu anterior

}


switch(op) //submenu4  principal
{
case 1: sub menu 1
case 2: sub menu 2
case 3: sub menu 3
case 4: sub menu 4  //vuelve al menu anterior

}

pero no se muy bien si hacer esto en funciones, separadas o anidadas.


que me recomiendan ustedes

Un sludo
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: micro_cadaver en 29 de Abril de 2009, 11:16:47
como vas amigo, en que punto siguen habiendo problemas  :o
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 29 de Abril de 2009, 18:45:47
hola Micro_cadaver

Me alegro de verte de nuevo,
me atasque  llevas razón, he intentanto pasar  mi trocito de programa, que me muestra el vector del menu en el lcd, a una función
para poderla usar posteriormente, con más vectores (sub menus del menu principal).

intente imprementar esta función

Código: C
  1. void pantalla(int col,int lin,int posA,int posB,char menup1[8])
  2. {
  3. int pos;
  4.  for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  5.    {
  6.     lcd_gotoxy(posA,posB);
  7.     printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra dato
  8.     posB=posB+1;                                       ///incrementa posicionaminto
  9.    }
  10. }

pero no se como declarar en  la entrada el vector.

en ejercicios anteriores.... con p1 y p2, nos moviamos por el menu.


Ahora con p3 quiero ir o "meterme" dentro de una opción del menu principal, mostrandome en pantalla el submenu de este, que será otro vector, "

pero el tema se vuelve un poco peliagudo, ya que no todos los vectores o menus tendran la misma longitud.

Pan=E-L

esto es el numero de pantallas (pan) ha mostrar, esta demarcado por el número de líneas a mostrar "L" y el número de opciones o elementos del
del menu "E" seleccionado, a esto se suma el control del cursor dentro del mismo rango, ya que el cursor nunca puede marcar un menu que no se puede mostar, pero para más rematar, esta el tema de vuelta atras y la recuperacion de la posición del menu.

asi que aqui estoy, entre la espada y la pared, una ayudita me vendria muy bien.

he intendado aplicar la teoria de "divide y venceras.."

primero primordial será, como pasar diferentes vectores de igual tamaño por la funcion, que después ya le cambiare el tamaño.

he leido por ahi que las const char no se guardan en  ram sino en rom y su acceso se hace con una argucia
que aun no tengo muy clara...en un post de este foro.

por cierto con uno de esos errores del "Up error de base de.." tengo que volver a encontrar ese post..

ya lo encontre de nuevo ...este es:

http://www.todopic.com.ar/foros/index.php?topic=19790.0


Un saludo.



Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 03 de Mayo de 2009, 14:31:32
hola Amigos

aqui pongo el programa:
me da un error y tengo algunas otras dudillas:

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. const char menup1[8][10]={"1.Menu1A\0","2.Menu2A\0","3.Menu3A\0","4.Menu4A\0","5.Menu5A\0","6.Menu6A\0","7.Menu7A\0","8.Atras\0"};
  24. //const char menup2[8][10]={"1.Menu1B\0","2.Menu2B\0","3.Menu3B\0","4.Menu4B\0","5.Menu5B\0","6.Menu6B\0","7.Menu7B\0","8.Atras\0"};
  25. //const char menup3[8][10]={"1.Menu1C\0","2.Menu2C\0","3.Menu3C\0","4.Menu4C\0","5.Menu5C\0","6.Menu6C\0","7.Menu7C\0","8.Atras\0"};
  26. //const char menup4[8][10]={"1.Menu1D\0","2.Menu2D\0","3.Menu3D\0","4.Menu4D\0","5.Menu5D\0","6.Menu6D\0","7.Menu7D\0","8.Atras\0"};
  27. int pulsado[8]="0";
  28. int y,n=0;
  29. int posA=3,posB=1;      //posiciones del cursor
  30. int col,pos,pan;
  31. int lini,lin,E;
  32.  
  33. ///////////////////  Definicion de funciones  ////////////////////////////
  34. void sm1(int y);void sm1a();
  35. void menu1(int y);
  36.  
  37. void cursor1(int y);
  38. void cursor0(int y);
  39. void pantalla(int col,int lin,int posA,int posB,char menup1[]);
  40.  
  41.  
  42. /////////////////////////////////////////////////////////////////////
  43.  
  44. ///////////////////////////////////////////////////////////////////////////////////
  45. //////////////////////Comienzo de la funcion principal/////////////////////////////
  46. ///////////////////////////////////////////////////////////////////////////////////
  47. void main()
  48. {
  49. set_tris_a(0x3F);
  50. //set_tris_b(0x37);
  51. //set_tris_c(0x37);
  52. set_tris_d(0x00);
  53. //set_tris_e(0x00);
  54.  
  55.   lcd_init();     /// inicializamos lcd
  56.   //////////////////////////////////////////////////////////////////////////////////////////////////////
  57.   // inicio de valores para el menu,por defecto
  58.   // menu1       ------- menu principal
  59.   // E=8;        ------- elementos del vector
  60.   // lin=4       ------- 4 lineas por defecto
  61.   // pan=E-lin   ------- número (pan) pantallas a mostrar
  62.   // lini=pan-1  ------- ajusta inicio de pantalla a mostrar, con respeto y, en nuestro caso 3
  63.   // y=1;        ------- posicion por fecto del cursor de secion de menu
  64.   //////////////////////////////////////////////////////////////////////////////////////////////////////
  65.   E=8;
  66.   lin=4;
  67.   pan=E-lin;      /// numero de pantallas
  68.   lini=pan-1;     ///
  69.   y=1;            ///posicion por defecto del cursor
  70.   col=y;          ///columna a mostrar
  71. cursor1(y);       ///situa cursor en linea 1
  72.  while(true)
  73.  {
  74.  /////////////////////////pulsadores//////////////////////////////////////////
  75.     if(input(PIN_A0))                        ///verifico si esta pulsado P1
  76.      {
  77.       delay_ms(300);
  78.       cursor0(y);                            ///limpia cursor
  79.       y=y+1;                                 ///incremento cursor (bajo cursor)
  80.       ////pregunta longitud menu
  81.       if(y>E){y=E;}                          //linito avance del cursor ***cambiar a funcion
  82.       cursor1(y);                            ///imprimo cursor
  83.      }
  84.    
  85.     if(input(PIN_A1))                        ///verifico si esta pulsado P2
  86.      {
  87.       delay_ms(300);
  88.       cursor0(y);                            /// Limpia cursor
  89.       y=y-1;                                 ///decremento cursor(subo cursor)
  90.       if(y<1){y=1;}                          //***cambiar a funcion
  91.       cursor1(y);                            ///imprimo cursor
  92.      }
  93.          
  94.    
  95.     if(input(PIN_A2))                        ///verifico si esta pulsado P3
  96.      {
  97.       delay_ms(300);
  98.       n=n+1;
  99.       pulsado[n-1]=y;            //guardo selecion del menu para cuando vuelva atras
  100.       //****selecion menu
  101.       y=1;
  102.       menu1(y);
  103.      }
  104.  ///////////////////////////////////////////////////////////////////////////////    
  105.      
  106.  //////////////////FUNCION-Elementos del vector ////////////////limita cursor
  107. /*   if(y>E){y=E;}
  108.      if(y<1){y=1;}
  109.      cursor1(y);
  110. */    
  111. /////////////////segun CURSOR , muestra la pantalla correspondiente////////////
  112.        if(y>0&&y<lin+1)                    /// >0 y <nº linas+1 (4)
  113.         {
  114.          col=1;                             ///muestra pantalla 1
  115.         }
  116.        if(y>lin&&y<E+1)                    /// >4 y <9 las lineas
  117.         {
  118.          col=y-(lini);                     ///avanza pantalla segun pulso
  119.         //      4-1 ->3
  120.         }
  121.  /////////////////////////////////////////////////////////////      
  122.          
  123.          
  124. pantalla(col,lin,posA,posB,menup1[]);
  125.  /*
  126.         for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  127.           {
  128.            lcd_gotoxy(posA,posB);                     /// Situa menu 3,posb(1,2,3,4)
  129.            printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra mirecion de menu
  130.            posB=posB+1;                               ///inc. linea
  131.            if(posB>lin){posB=1;}                      ///limita linea
  132.           }
  133. */
  134.  }    
  135.  //fin de main      
  136.  }
  137.  
  138.  
  139.  
  140. /////////////////funciones ///////////////////
  141. void cursor1(int y)
  142.  {
  143.   Lcd_gotoxy(1,y);
  144.   printf(lcd_putc,"%c",126);                 ///para sacar "->" en el lcd
  145.  }
  146. void cursor0(int y)
  147. {
  148.   Lcd_gotoxy(1,y);
  149.   printf(lcd_putc," ");
  150. }
  151.  
  152. //////////////////preparando funcion/////////////////////7
  153.  
  154. void pantalla(int col,int lin,int posA,int posB,char menup1[])
  155. {
  156. int pos;
  157.  for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  158.    {
  159.     lcd_gotoxy(posA,posB);
  160.     printf(lcd_putc,"%s",menup1[pos-1]);       ///muestra dato
  161.     posB=posB+1;
  162.      if(posB>lin){posB=1;}
  163.    }
  164. }
  165. ////////////////////
  166.  
  167. /*void pantalla(int col,int lin,int posA,int posB,char* posy, char menup1[])
  168. {
  169. int pos;
  170.  for(pos=col;pos<col+lin;pos++)                ///limita las lineas a mostrar
  171.    {
  172.     lcd_gotoxy(posA,posB);
  173.     sprintf(posy,"%s",menup1[pos-1]);       ///muestra dato
  174.     posB=posB+1;
  175.    }
  176. }*/
  177.  
  178.  
  179. /*
  180. void ds1307_get_day_of_week(char* ptr){
  181.  
  182.    byte lday;
  183.    byte lmonth;
  184.    byte lyr;
  185.    byte ldow;
  186.    ds1307_get_date(lday,lmonth,lyr,ldow);
  187.    sprintf(ptr,"%s",days_of_week[ldow]);
  188. }
  189. */
  190.  
  191. ///////////////hacer segun opcion//////////////
  192.  
  193. void menu1(int y)  ///menu principal
  194.  {
  195.  switch(y)
  196.      {
  197.  case 1:sm1(y);break;
  198. /* case 2:sm2();break;
  199.  case 3:sm3();break;
  200.  case 4:sm4();break;
  201.  case 5:sm5();break;
  202.  case 6:sm6();break;
  203.  case 7:sm7();break;*/
  204.  case 8:break;                   //Salir del menu
  205.      }
  206.  }    
  207.      
  208. //////////////////submenu 1 ///////////////////////    
  209.      
  210. void sm1(int y)
  211. {
  212.  switch(y)
  213.      {
  214.  case 1:sm1a();break;
  215. /* case 2:sm1a();break;
  216.  case 3:sm1a();break;
  217.  case 4:sm1a();break;
  218.  case 5:atras();break;*/              //volver al a menu anterior
  219.  case 6:break;                        //salir del menu
  220.  
  221.      }
  222. }
  223.  /////////////////////funciones del Submenu/////////////////////
  224.  
  225. void sm1a()             //submenu del submenu 1
  226. {
  227.  output_high(PIN_D4);   //pita zumbador 1 seg.
  228.  delay_ms(1000);
  229.  output_low(PIN_D4);
  230. }
  231.  
  232.  
  233. /*
  234. void atras()            //volver al menu anterior
  235. {
  236. //llamada a menu anterior
  237. //llamada a ultima posicion selecionada en el salto
  238. //llamada a mostrar menu
  239. }
  240. */


me tira el error:
Error 90"00_09.c" line 124[36,37]: A numeric expression must appear here


dice asi como que debe aparecer una expresion numeroca u algo asi
pero que quiere decir.

Un Saludo
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: Nocturno en 03 de Mayo de 2009, 15:23:21
¿No será que te falta el índice del array?
pantalla(col,lin,posA,posB,menup1[0]);
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 03 de Mayo de 2009, 15:31:42
Hola Nocturno

Si le pongo numero me dice que no se puede pasar de puntero a contante (me lo dice ne ingles)
pero me sigue dando error.

no se que hacer, tu como ves el programita..

Un saludo.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: migsantiago en 03 de Mayo de 2009, 16:42:00
Código: [Seleccionar]
void pantalla(int col,int lin,int posA,int posB,char menup1[]);
Ya te mencioné en múltiples ocasiones que debes usar apuntador a char.

Código: [Seleccionar]
void pantalla(int col,int lin,int posA,int posB,char *menup1);
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: Nocturno en 03 de Mayo de 2009, 17:00:35
Joe, no me había fijado que estás intentando pasar un string por valor, y eso en CCS no se puede.
Como te dice Migsantiago, hay que pasarlo por referencia utilizando el puntero.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: MLO__ en 03 de Mayo de 2009, 17:15:25
Hola.

Otra opcion es crear un bufer temporal para hacer la copia del char guardado en la ROM.
Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 03 de Mayo de 2009, 18:56:32
Hola a todos,

Cambie el codigo : y puse como dice el gran amigo MigSantiago,

void pantalla(int col,int lin,int posA,int posB,char *menup1);

con *menup1 le estoy pasando el contenido de menup1?

Pero la funcion no me hace caso, me muestra en el lcd cosas muy raras, simbolos en chino,

que es lo que le esta pasando en realidad .

un saludo


Título: Re: Menu desplegable - LCD20x4 - PIC16F877A
Publicado por: pajaro en 06 de Mayo de 2009, 17:32:33
Hola Amigos
EL CCS no me da ningun error pero, en la simulacion con el isis, parece que el valor del os vectores
no pasan.

Alguna idea?

Un saludo.