TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gauchosuizo en 25 de Agosto de 2004, 01:47:00

Título: Menu con Submenus?
Publicado por: gauchosuizo en 25 de Agosto de 2004, 01:47:00
hola amigos

tengo una pregunta: quiero hacer un Menu con diversos Submenus para un 18F252 que debe ser mostrado en un LCD. Tambien tiene que tener la posibilidad de elegir los numeros de 0 a 9. Por lo que he leido por ahi, se podria utilizar un maquina de estado (statemachine). Puede explicarme alguien como se hace una maquina de estado en un PIC?, quizas algun ejemplo?

Gracias por toda la informacion que se pueda juntar de antemano.
Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 25 de Agosto de 2004, 07:09:00
Yo me anoto con las respuestas, me interesa el tema....
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 25 de Agosto de 2004, 09:32:00
hola

por lo que estuve averiguando, existen dos tipos basicos de programacion para teclados con Menus y Submenus:
1) con el tipico Switch()
2) con pointer to functions(punteros de/para funciones)
El 1) no es dificil, pero cuando existe un Menu muy grande necesita mucha memoria.
El 2) es mas dificil de programar(por los punteros), pero el codigo es mas elegante.

A mi personalmente me interesaria hacer un Menu con la opcion No 2. El problema es que casi no tengo experiencia en la programacion.

Seria lindo que alguien pueda ayudar.
Título: RE: Menu con Submenus?
Publicado por: Modulay en 25 de Agosto de 2004, 09:47:00
Si quieres usar CCS tendrás q optar por la opción primera,ya que éste no admite punteros a funciones.
Si explicas más o menos como van a ser concretamente esos menús se puede ir construyendo código.
Saludos
Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 25 de Agosto de 2004, 09:51:00
Yo creo que se puede utilizar una funcion que pase parametros a otra funcion.
No es lo mismo pero igual es elegante...
Título: RE: Menu con Submenus?
Publicado por: Modulay en 25 de Agosto de 2004, 10:05:00
Eso sí,pero siempre que los parámetros sean sólo de entrada.
Se me ocurre que quizá pueda implementarse con un procedimiento recursivo que gestionaría el solito todo el menú completo incluídos todos los submenús.
Un procedimiento recursivo es el que dentro de su implementación contiene una o varias llamadas a sí mismo
Título: RE: Menu con Submenus?
Publicado por: Modulay en 25 de Agosto de 2004, 10:52:00
Olviden la recursividad...
CCS tampoco admite llamadas recursivas
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 26 de Agosto de 2004, 02:26:00
hola gente

ante todo gracias por las respuestas. Bueno yo quiero hacer un menu como el que sigue:

- Range -->Auto/Manuell
- Fine Adjust --> 0...100%
- Integration Time --> 0...60s
- Limit --> 0...100%(Standard 50%)
- Compensation --> 0...100%
- 0/4...20mA --> 0...20/4...20mA
- Sensitivity --> ??
- Self Calibration --> Start

Yo pienso que se tiene que utilizar el switch-case statement para realizar el menu. En cuanto tenga algo lo posteo.
Lo que hay que pensar tambien es en no hacer un programa que se coma toda la memoria.

Mas infos: Tengo un teclado de cuatro teclas conectado al puerto B 4...7. He pensado utilizar una intrrupcion para detectar cuando se ha apretado una tecla. Despues va al programa principal y controla cual tecla ha sido apretada. Ahi mismo hago por soft un antirebote para las teclas y despues le asigno la funcion del menu. Que opinan de esto?

 
Título: RE: Menu con Submenus?
Publicado por: oshow en 26 de Agosto de 2004, 04:36:00
Yo hice uno hace tiempo con interrupciones, lo que pasa es que ahora no se si lo tengo, no se si lo habré perdido en algún formateo....

Consistía en lo siguiente:

4 pulsadores en RB4/7 una tecla era la de menú, otra era flecha arriba otra flecha abajo y por último la tecla de acepatción o enter.

Al menú solo se podía entrar con la tecla menú, al entrar mostraba en el lcd 2 opciones (submenús) que podían ser seleccionadas mediante las flechas, y con el menú aceptar se accedía al submenú seleccionado, si se pulsaba la tecla menú se retrocedía al menú anterior y así sucesivamente.

Creo que en el ejemplo que hice con proteus, hice algo parecido...

Saludos.

Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 26 de Agosto de 2004, 05:59:00
hola oshow

exactamente como lo hicistes vos, lo quiero hacer yo. Yo tambien tengo 4 Teclas: Enter, Up, Down y Menu.
La interrupcion del puerto B la uso para saber si se ha apretado una tecla, si es asi, en la subroutine de la interrupcion pongo un Flag = true, que despues lo chequeo en el bucle principal y veo cual es la tecla que se ha apretado.

Si tienes ese ejemplo que has dicho, no estaria nada mal echarle un vistazo.
Título: RE: Menu con Submenus?
Publicado por: Modulay en 26 de Agosto de 2004, 06:29:00
Para el manejo de los datos,una forma muy práctica puede ser usando esta estructura:
Codigo:

///////////////////////////////////// PREPROCESADO ///////////////////////////////////

#include <16F84.h>
#use delay(clock=10000000)
#fuses HS,NOWDT,NOPUT
#define use_portb_lcd TRUE
#include "lcd.c"

//////////////////////////////////////// TIPOS ///////////////////////////////////////

typedef enum Trango {manual,automatico};

typedef struct Tconfiguracion {
                    Trango rango;
                    int ajuste_fino;
                    int t_integracion;
                    int limite;
                    int compensacion;
                    int amperaje;
                    int sensibilidad;
                    boolean autocalibracion;
                    };

/////////////////////////////////////// GLOBALES /////////////////////////////////////

struct Tconfiguracion configuracion;

////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   lcd_init();
   configuracion.rango = manual;
   configuracion.ajuste_fino = 0;
   configuracion.autocalibracion = TRUE;
   // etc...
   for(;;) {}
   }


Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 26 de Agosto de 2004, 07:23:00
hola

antes de empezar con el menu se me ha presentado otro problema: como hago para identificar que tecla se esta apretando? Como yo tengo las teclas a la entrada del puerto B4...7 uso la interrupcion para saber si se apreto una tecla y pongo un flag. En el bucle principal controlo el bucle. Si este esta puesto, quiero eliminar los posibles rebotes de las teclas y clasificarlas. Como puedo hacer estas dos cosas de una manera sencilla?

Gracias
Título: RE: Menu con Submenus?
Publicado por: J1M en 26 de Agosto de 2004, 07:25:00
Algo parecido estoy tratando de hacer yo, pero la cosa no sale

La unica diferencia es que quiero usar 3 botones, flecha arriba, abajo, ok/menu, para este ultimo se distingue entre pulsacion larga y corta, a ver si encuentro el ejemplo que tenia yo.....

lo mismo de aqui sacas alguna idea:
http://www.vermontficks.org/datalogc.htm

aqui tb están construyendo algo muy interesante solo que eso... estan haciendolo :p
http://users.skynet.be/bk317494/012/012.htm

Salu2
Título: RE: Menu con Submenus?
Publicado por: Modulay en 26 de Agosto de 2004, 08:36:00
Para evitarte los rebotes,en tu rutina de interrupción puedes llamar a una rutina que tuviese esta forma:

Codigo:

// Estamos suponiendo que loa pulsadores van a ser activos a nivel alto.
void antirebote()
   {
   delay_ms(30);
   while(PORTB != 0) {}  // No progresamos hasta que ningún pulsador esté activo
   delay_ms(30);
   }




Título: RE: Menu con Submenus?
Publicado por: oshow en 26 de Agosto de 2004, 08:38:00
Pues no sabéis cuanto lo siento, pero he estado buscando el programa con los menús y no lo he encontrado, pero mira a ver el ejemplo que hice con proteus:

http://www.telecable.es/personales/trelles2/esquemas_proteus/ejemplo_a_enviar.rar

Creo recordar que aquí usé algo parecido, a lo mejor os puede servir de ayuda.


Saludos.
Título: RE: Menu con Submenus?
Publicado por: Modulay en 26 de Agosto de 2004, 10:42:00
Llevo un buen rato construyendo un menú basado en tu propósito,gaucho,y opino que sería mejor optar por hacer uso únicamente de la interrupción por RB0,que podría ir conectado a la tecla menú (para salir y entrar en el menú y no mantener al micro siempre pendiente de si se pulsó alguna tecla).La rutina de interrupción por RB0 gestionaría de una vez absolutamente todos los eventos,pulsaciones,cambios de parámetros,que se produjeran mientras estuviéramos dentro del menú...Y terminaría de ejecutarse en el momento en que saliésemos de él para que el micro pueda seguir con sus otras cositas...
Ya que para retroceder dentro del menú y tb para salir del mismo tendríamos que hacer uso de la tecla que provoca la interrupción mientras estamos dentro de la rutina que la atiende,hay que asegurarse de bajar el flag correspondiente antes de salir.Haciéndolo así resultaria viable ¿no? ¿qué opinan?
Todo esto viene a que si cada cada paso que damos en el menú viene por una interrupción,resulta un tanto complicado el salvar los datos a no ser que estos sean globales,además de hacerse más complicada la implementación.
Como lo ven?
Saludos
Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 26 de Agosto de 2004, 13:46:00
Yo utilizaria la interrupcion solo para detectar que tecla fue pulsada, y salgo, porqu despues estaras dentro de la interrupcion durante cuanto tiempo (sin hacer otra cosa) !!
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 26 de Agosto de 2004, 13:51:00
hola

Modulay creo que tu idea es muy buena. En pocas palabras en la rutina de la interrupcion RB0 se pondrian diversos Flags, los cuales controlarian el proceso del menu.
Mañana voy a cambiar el programa que hice hoy, que no funciono como yo queria por el problema del puerto B que puse en otro mensaje

@MGLSOFT
esa era mi idea, pero la idea de Modulay no esta mal, no?
Gracias por la vuestra ayuda.
Título: RE: Menu con Submenus?
Publicado por: Modulay en 26 de Agosto de 2004, 14:02:00
Pues ahora estoy dudando.Se trataba de eso,MGL,esa era la idea.Dependerá de qué otras cosas tenga que hacer el micro,aparte de gestionar el menú.Se puede usar el timer para salir del menú tras un tiempo determinado en el caso de inactividad de los pulsadores.
Se que es un método un poco tosco,pero creo que puede ahorrar bastante código
Título: RE: Menu con Submenus?
Publicado por: Modulay en 26 de Agosto de 2004, 14:22:00
Si sigues con el lcd en el puerto B lo tendrás complicado para solucionar el tema de las tensiones en las entradas donde tienes los pulsadores.
Con respecto al metodo para gestionar el menú,demasiado tiempo estará entretenido el pic usando sólo RB0 como fuente de interrupción,sip,mejor capturar tecla y salir.
Ya tengo casi terminado mi menú.Compilado para un F84 llena el 94% de la rom,y eso que no está acabado.
Eso sí,el manejo del lcd tiene la mitad de la culpa.
De todas formas,si vas a usar un 18F252 no hay problema.
Aparte,echo mano de la eeprom interna del pic para guardar la configuración de todos los parámetros del menú,con el fin de ahorrar ram y tb para poder recuperar los datos si se quita la alimentación.
Título: RE: Menu con Submenus?
Publicado por: Modulay en 27 de Agosto de 2004, 12:42:00
He implementado un menú básico con dos submenús siguiendo la dinámica de una máquina de estados.La máquina tiene tres estados.Tan solo cuenta con dos pulsadores,ya que a más pulsadores se complican bastante las tablas y los mapas de karnaugh al incrementarse el número de variables de entrada,pero la dinámica de diseño sería igual para un mayor número,tanto de estados como de entradas.No es que parezca ser mucha la diferencia,pero se consigue optimizar algo la memoria de programa.Echenle un ojo a ver que les parece.
http://miarroba.com/foros/ver.php?foroid=256746&temaid=2250837
Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 27 de Agosto de 2004, 13:10:00
Miren esto que encontre, buscando informacion sobre el CP23016...
Esta muy bien implementado el menu, y ni hablar del modo de programacion !!!

http://www.kd7lmo.net/ground_atv.html
Título: RE: Menu con Submenus?
Publicado por: Nocturno en 28 de Agosto de 2004, 00:27:00
Interesante aplicación de la máquina de estados Modulay, pero como bien dices, a medida que aumenta el número de opciones, la cosa se complica sobremanera. Tanto que dudo que alguien vaya a usarlo en serio.

Marcos, me he quedado pasmado con el link que has publicado. El acabado de la maquinita es estupendo, y cuando digo acabado, me refiero al hard interior, al exterior y por supuesto, al software.
Está claro que lo ha programado alguien que sabe bastante de estilo.

Lo que también me demuestra ese ejemplo, es que la mejor forma de hacer un menú, es utilizando el dichoso SWITCH.

Por cierto, Marcos, ¿te importaría postearlo en el subforo "Usos y aplicaciones de los pic"?. Creo que está bastante bien como para tenerlo allí catalogado.
Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 28 de Agosto de 2004, 06:35:00
Nocturno:
Lo que hay en la WEB publicado, es de libre uso, por lo tanto ni deberias consultarme para publicarlo.
Ya deberias haberlo posteado !!!!
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 28 de Agosto de 2004, 07:36:00
hola gente

@Modulay

me interesaria ver como has calculado el codigo con las tablas y los mapas de Karnaugh. Es posible?

Gracias
Título: RE: Menu con Submenus?
Publicado por: Modulay en 28 de Agosto de 2004, 07:42:00
Buscaré la manera de hacerlo pq no tengo escaner,gaucho.
Tienes alguna noción sobre máquinas de estados?
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 28 de Agosto de 2004, 08:23:00
hola modulay

he programado en labview statemachines. La maquina de estado tiene siempre un estado definido y se pasa de uno a otro, siempre y cuando se haya cumplido la funcion necesaria que permite el paso (aclarado maso).
A mi lo que mas me interesa saber la equacion que has utilizado con los mapas de Karnaugh. Y como lo has hecho.

Gracias
Título: RE: Menu con Submenus?
Publicado por: Modulay en 28 de Agosto de 2004, 09:28:00
Te explico.
La metodología que he seguido para hallar las funciones es la misma que se usa para diseñar máquinas de estados finitos con biestables,es decir con dispositivos físicos.
Partimos de la cantidad de estados que va a tener la máquina,en nuestro caso 3,por lo que podemos codificarlos con 2 bits:

MENU -> le damos la codificación 00 (q0,q1)
Submenu 1 -> 01 (q0,q1)
Submenu 2 -> 11 (q0,q1)

Bien,a partir de esto,tenemos las variables q0 y q1,que dependiendo del valor que tengan,estaremos en un estado u otro.
También tenemos las entradas,que son dos (me y av),correspondientes a cada uno de los pulsadores.
Pues ya tenemos las 4 variables que determinarán el funcionamiento de la máquina.La transición de un estado actual a un posible próximo estado no dependerá sólo de las variables de entrada,si no también de las variables q0 y q1,es decir,de cúal sea el estado actual.Esto se hace patente si imaginamos que la máquina se encuentra en el estado (q0=0,q1=0)->(MENU->00) y pulsamos la tecla "avanzar"(av=1).No ocurre nada(o mejor dicho,hace una transición al mismo estado).Pero si se da esa misma entrada en un momento en en el que la máquina se encuentra en el estado (q0=0,q1=1)->(Submenu 1->01),se producirá una transición al estado Submenu 2 (11).
Lo que hay que buscar son las funciones que modificarán los valores de las variables de estado (q0,q1,q2,q3,...qn),en función de ellas mismas y de las variables de entrada.
Lo primero sería hacer un diagrama de estados,con todos los estados,unidos entre sí por todas las posibles transiciones que se puedan dar(flechas) cada una de las cuales etiquetada con la entrada que provoca dicha transición.Después se pasa todo eso a una tabla:
Codigo:

                       MENU = 00
                   Submenu1 = 01
                   Submenu2 = 11
             ___________________________
            |ESTADO |  ENTRADAS(me,av)  |
            | q0,q1 | 00 | 01 | 11 | 10 |
            |_______|____|____|____|____|
            |       |    |    |    |    |
       MENU |  0 0  | -- | 01 | 00 | 00 |
            |_______|____|____|____|____|
            |       |    |    |    |    |
   Submenu1 |  0 1  | -- | 00 | 01 | 11 |  
            |_______|____|____|____|____|
            |       |    |    |    |    |
   Submenu2 |  1 1  | -- | 00 | 11 | 01 |
            |_______|____|____|____|____|




Las casillas de la izquierda representan el estado actual,y las demás representan el estado siguiente que se dará a partir de ese estado actual si se dan las entradas según la tabla.
A partir de aquí se construyen los mapas de karnaugh,uno para cada variable de estado,es decir,uno para q0 y otro para q1.Estos mapas se rellenan con el bit correspondiente a la función que estamos calculando,es decir,si estamos haciendo el mapa de q0,cogeremos de la tabla anterior los valores de q0:
Codigo:

           me,av
             00  01  11  10      
     q0,q1 \_________________
            |   |   |   |   |
         00 | X | 0 | 0 | 0 |
            |___|___|___|___|
            |   |   |   |   |
         01 | X | 0 | 0 | 1 |
            |___|___|___|___|
            |   |   |   |   |
         11 | X | 0 | 1 | 0 |  
            |___|___|___|___|
            |   |   |   |   |
         10 | X | X | X | X |
            |___|___|___|___|

q0 = ((!q0) & q1 & (!av)) | q0 & me & av;



Y lo mismo para q1:
Codigo:

           me,av
             00  01  11  10      
     q0,q1 \_________________
            |   |   |   |   |
         00 | X | 1 | 0 | 0 |
            |___|___|___|___|
            |   |   |   |   |
         01 | X | 0 | 1 | 1 |
            |___|___|___|___|
            |   |   |   |   |
         11 | X | 0 | 1 | 1 |  
            |___|___|___|___|
            |   |   |   |   |
         10 | X | X | X | X |
            |___|___|___|___|

q1 = ((!q1) | me | (!av)) & ((!me) | q1);

Título: RE: Menu con Submenus?
Publicado por: oshow en 28 de Agosto de 2004, 09:49:00
Modulay, mis felicitaciones más sinceras, como te "curras" las respuestas, increible. Dibujando las tablas en ascii, como sigas subiendo el nivel, no se donde vamos a llegar....

Por si os interesa tengo un pdf donde explican como pasar máquinas de estados a lenguaje C, no lo he mirado aún pero tiene buena pinta, si lo queréis, no tenéis más que pedirlo....

Saludos.
Título: RE: Menu con Submenus?
Publicado por: Modulay en 28 de Agosto de 2004, 09:52:00
No se a que esperas!!!!!!
Título: RE: Menu con Submenus?
Publicado por: Nocturno en 28 de Agosto de 2004, 09:57:00
Vaya explicación Modulay. ¡Vivan los días de niebla en Málaga!, porque Modulay se queda en casa.

Oshow, ¿y ese pdf?
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 29 de Agosto de 2004, 03:55:00
hola

Modulay gracias por tu muy buena explicacion, eres un Genio. La verdad nunca se me hubiera ocurrido  calcular asi el menu. tengo que probar aber como me sale, ya que mi menu es un poco mas grande. En cuanto tenga algo, lo posteo para que lo vean todos.

Aloha
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 29 de Agosto de 2004, 09:14:00
hola Modulay

He bajado el PCWH y el Proteus para poder simular el programa que tu has posteado mas arriba. Como es la primera vez que uso Proteus tuve que amodar algunas cosas. Ahora me falta el programa del LCD lcd.c. El que tengo yo es diferente al tuyo y me marca siempre error. Es posible que me lo pases?

Gracias de antemano
Título: RE: Menu con Submenus?
Publicado por: Modulay en 29 de Agosto de 2004, 09:23:00
Está aqui
Saludos
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 29 de Agosto de 2004, 10:41:00
hola

gracias Modulay. Lo voy a probar y despues te cuento.

Aloha
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 29 de Agosto de 2004, 11:13:00
hola Modulay

disculpa que te moleste, pero no puedo hacer funcionar el Proteus con el file que me distes. Me aparece el siguiente error:

Building circuit...
Instantiating SPICE models...
[U1] PIC16 model release 6.5 SP5 (IR1) simulating PIC16876 device.
[U1] Loaded 256 bytes of persistent EEPROM data.
ERROR: [U1] Unable to open HEX file "menu.HEX".
[U1] Loaded 0 program words and 0 data bytes.
[DSIM] BOOT Error.
Real Time Simulation failed to start

Real Time Simulation FAILED.

Que puede ser? Algun Path que no esta bien registrado?

Gracias por tu ayuda
Título: RE: Menu con Submenus?
Publicado por: cucaracha en 29 de Agosto de 2004, 11:21:00
No, es que modulay en el último momento debió cambiar el nombre al archivo. Verás que el hex que busca el proteus es menú.hex, sin embargo el que tú te has bajado es menu-estados.hex
Simplemente entra en el pic y cambia eso. O bien lo escribes o Examinar... como de costumbre.

Saludos!!

PD: si te fijas te lo indica en el ERROR
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 29 de Agosto de 2004, 11:29:00
hola cuca

gracias por la respuesta. Encontre el problema y funciona muy bien. Aloha
Título: RE: Menu con Submenus?
Publicado por: oshow en 04 de Septiembre de 2004, 07:25:00
Por si aún os sigue interesando, he vuelto a realizar el ejemplo con los menús que había hecho anteriormente. Bueno, no  está tan "currado" como el otro que tenía, pero ilustra muy bien, el funcionamiento que yo os había comentado.

Antes de nada, comentar que quizás no es la mejor forma de hacer un codigo muy optimizado (por el uso de globales, etc...) pero yo recuerdo haberlo hecho así por que se me imponía la codicion de usar las interrupciones en el portb. También se puede optimizar más escribiendo solo el asterisco en lugar de todas los strings, pero como ejemplo sirve....

No está muy comentado, pero creo que se entiende muy bien.
Otra cosilla, los menus no es que tengan mucho sentido (jejej) solo es un ejemplo.....

Está compilado con la version 3.206 y ocupa un 12%rom y 9%ram, para un 16f876a, creo que con un 18 apenas ocuparía....

 
Si queréis también tengo el fichero para simularlo en Proteus, aunque no lo subo al almacen porque no tengo nivel para subirlo, si queréis os lo paso, aunque es un esquema muy sencillo (lcd, pic y 4 pulsadores).

****************************************************
Codigo:

#include <16F876A.h>
#use delay(clock=4000000)
#include <lcd_modificado_trelles.c>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD

#byte port_b=6


static int tecla;

////////////////////////////////////////////////////////////////////////////////
// Prototipos de las funciones
//
////////////////////////////////////////////////////////////////////////////////
void submenu(void);
void configuracion(void);
void visualizacion(void);


///////////////////////////////////////////////////////////////////////////////
// RUTINA DE INTERRUPCION POR TECLADO EN PINES RB4 A RB7
// DETECTAMOS TECLA PULSADA
///////////////////////////////////////////////////////////////////////////////

#INT_RB
void tecla_pulsada(void)
{
   delay_ms(20);  //esperamos para evitar rebotes

   if(!(port_b^0xF0))
      return;           //si se produce al soltar la tecla salimos de la interrupcion

      //asignacion de tecla pulsada

      if((!input(PIN_B7)))
         {
            tecla=7;       //tecla enter asignamos un numero cualquiera p.e.=7
            return;
         }


      if((!input(PIN_B6)))
         {
            tecla=6;       //tecla flecha abajo
            return;
         }

     if((!input(PIN_B5)))
         {
            tecla=5;       //tecla flecha arriba
            return;
         }

     if((!input(PIN_B4)))
         {
            tecla=4;       //tecla menu
            return;
         }

}



////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//CUERPO PRINCIPAL DEL PROGRAMA:
//
////////////////////////////////////////////////////////////////////////////////


void main(void)
{
   //habilitar interrupciones
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
   
   port_b_pullups(TRUE);   //pull-ups activadas en puerto B
   lcd_init();             //inicializacion del lcd

   while(1)
   {


      if(tecla==4)         //si se pulsa la tecla 4, vamos a los menus
         submenu();


      lcd_putc("f");
      lcd_putc("Esperando...");     //sino se pulsa, seguimos esperando....
      delay_ms(800);

   }
}


////////////////////////////////////////////////////////////////////////////////
//    Tratamiento de los menus....
//    Hubiera sido preferible usar la funcion lcd_getc() para detectar
//    que opcion está seleccionada, pero ignoro porque no me funciono, en lugar
//    de eso uso una variable llamada flagi
////////////////////////////////////////////////////////////////////////////////
void submenu(void)
{
      int1 flagi=0;  
      tecla=0;


      //imprimimos la pantalla inicial
      lcd_gotoxy(1,1);
      lcd_putc("* Configuracion");
      lcd_gotoxy(1,2);
      lcd_putc("  Visualización");

      //escaneamos la pulsacion de las teclas...
      while(TRUE)
         {
            if(tecla==6)
               {
                  tecla=0;
                  flagi=1;

                  lcd_putc("f");
                  lcd_gotoxy(1,1);
                  lcd_putc("  Configuracion");
                  lcd_gotoxy(1,2);
                  lcd_putc("* Visualización");
               }
            if(tecla==5)
               {
                  tecla=0;
                  flagi=0;

                  lcd_putc("f");
                  lcd_gotoxy(1,1);
                  lcd_putc("* Configuracion");
                  lcd_gotoxy(1,2);
                  lcd_putc("  Visualización");
               }
            if(tecla==7)
               {
                  tecla=0;

                  if(flagi==0)
                     configuracion();     //segun la opcion seleccionada (flagi) accedemos a uno u otro submenu....
                  else
                     visualizacion();
               }
            if(tecla==4)
               {
                  tecla=0;          //si se pulsa de nuevo la tecla menu, se vuelve a la pantalla principal...
                  return;
               }
         };
}

////////////////////////////////////////////////////////////////////////////////
//    Submenu de configuracion
//
///////////////////////////////////////////////////////////////////////////////
void configuracion(void)
{
      tecla=0;

      lcd_putc("f");
      lcd_gotoxy(1,1);
      lcd_putc("* Reloj");
      lcd_gotoxy(1,2);
      lcd_putc("  Sensor");


      while(tecla!=4)
         {
            if(tecla==6)
               {
                  tecla=0;

                 
                  lcd_putc("f");
                  lcd_gotoxy(1,1);
                  lcd_putc("  Reloj");
                  lcd_gotoxy(1,2);
                  lcd_putc("* Sensor");
               }
            if(tecla==5)
               {
                  tecla=0;


                 
                  lcd_putc("f");
                  lcd_gotoxy(1,1);
                  lcd_putc("* Reloj");
                  lcd_gotoxy(1,2);
                  lcd_putc("  Sensor");
               }
         };
   tecla=5;    //tecla=5 se vuelve al menú superior.....
   return;
}


void visualizacion(void)
{
      tecla=0;

      lcd_putc("f");
      lcd_gotoxy(1,1);
      lcd_putc("* Weee");
      lcd_gotoxy(1,2);
      lcd_putc("  Wooo");


      while(tecla!=4)
         {
            if(tecla==6)
               {
                  tecla=0;

                  lcd_putc("f");
                  lcd_gotoxy(1,1);
                  lcd_putc("  Weee");
                  lcd_gotoxy(1,2);
                  lcd_putc("* Wooo");
               }
            if(tecla==5)
               {
                  tecla=0;


                  lcd_putc("f");
                  lcd_gotoxy(1,1);
                  lcd_putc("* Weee");
                  lcd_gotoxy(1,2);
                  lcd_putc("  Wooo");
               }
         };

   tecla=5;       //tecla=5 se vuelve al menú superior.....
   return;
}




Saludos.
Título: RE: Menu con Submenus?
Publicado por: J1M en 05 de Septiembre de 2004, 14:11:00
joooode!!!

Aunque ya te lo he dicho por correo, muchisimas gracias!!! esto me viene muy pero que muy bien para lo que estoy haciendo!

Gracias oshow te has ganao el cielo :P
Título: RE: Menu con Submenus?
Publicado por: gauchosuizo en 06 de Septiembre de 2004, 01:23:00
hola

oshow me podrias mandar los ficheros para el Proteus. Me gustaria simularlo. Gracias

Pablo
Título: RE: Menu con Submenus?
Publicado por: pacalaconcurso en 07 de Septiembre de 2004, 14:46:00
jo,jo tiene buena pinta...si me permites me gustaria colgarlo en mi web....

yo hize un menu usando un encoder y un pulsador, si quereis lo busco y lo cuelgo tambien..

saludos

por cierto cuca, la fresadora tiene tela de exito
Título: RE: Menu con Submenus?
Publicado por: cucaracha en 07 de Septiembre de 2004, 15:31:00
Jejeje, ya lo he notado. Me llegan preguntas a mi correo...
Ya tengo en mente la nueva versión, que espero empezar a diseñarla a finales de septiembre.
De momento, ideas, problemas y demás, pero todo en la cabeza...
Por supuesto, cuando esté lista ya sabes.

saludos!!
Título: RE: Menu con Submenus?
Publicado por: oshow en 07 de Septiembre de 2004, 15:44:00
Hola Pacala, por mi parte todo lo que pongo aqui lo puedes colgar tranquilamente , no tenéis ni que pedir permiso para publicarlo , ahora bien, en tu web tienes unos contenidos de muy alto nivel (entre ellos la fresadora de Cuca) y esto es solo es un ejemplillo que creo que no esta al nivel, pero bueno, si lo consideras suficentemente bueno, subelo tranquilamente, por mi parte no hay ningun problema.

Saludos.
Título: RE: Menu con Submenus?
Publicado por: pacalaconcurso en 08 de Septiembre de 2004, 13:55:00
bueno, pues colgado para disfrute de todos...
aqui os dejo el codigo que escribi para el control de uv1316, incluye un menu con un encoder.

espero que os sirva.
Título: RE: Menu con Submenus?
Publicado por: lovando en 08 de Septiembre de 2004, 15:35:00
Escrito originalmente por oshow
Pues no sabéis cuanto lo siento, pero he estado buscando el programa con los menús y no lo he encontrado, pero mira a ver el ejemplo que hice con proteus:

http://www.telecable.es/personales/trelles2/esquemas_proteus/ejemplo_a_enviar.rar

Creo recordar que aquí usé algo parecido, a lo mejor os puede servir de ayuda.


Saludos.



Me da error de libreria del MCF8583...de donde lo bajo??
Título: RE: Menu con Submenus?
Publicado por: oshow en 08 de Septiembre de 2004, 16:58:00
Hola pic-chi, ahora veo que en el zip se me olvido comentar como "instalar" las librerias del reloj pcf8583.

Lo comento aqui:

Existe un archivo llamado proteuspcf8583.zip que es donde vienen las librerias que te faltan, solo tienes que descomprimirlo y cortar y copiar los ficheros dll y models en los directorios donde estan los dll y models por defecto (que estaran dentro del directorio de instalacion del proteus, C:archivos de programalabcenter). Recuerda pegar cada archivo al directorio correspondiente, con eso debería funcionarte.

Otra cosa, en este ejemplo quizás no se ve muy bien la forma de hacer los menús, utiliza mejor el código de más arriba si te interesan solo los menús, en el ejemplo que has bajado se tratan las interrupciones en el portb de igual forma, pero no tiene unos menús tan claros....

Que vaya bien...

Saludos.

 
Título: RE: Menu con Submenus?
Publicado por: lovando en 08 de Septiembre de 2004, 19:47:00
Escrito originalmente por oshow
Hola pic-chi, ahora veo que en el zip se me olvido comentar como "instalar" las librerias del reloj pcf8583.

Lo comento aqui:

Existe un archivo llamado proteuspcf8583.zip que es donde vienen las librerias que te faltan, solo tienes que descomprimirlo y cortar y copiar los ficheros dll y models en los directorios donde estan los dll y models por defecto (que estaran dentro del directorio de instalacion del proteus, C:archivos de programalabcenter). Recuerda pegar cada archivo al directorio correspondiente, con eso debería funcionarte.

Otra cosa, en este ejemplo quizás no se ve muy bien la forma de hacer los menús, utiliza mejor el código de más arriba si te interesan solo los menús, en el ejemplo que has bajado se tratan las interrupciones en el portb de igual forma, pero no tiene unos menús tan claros....

Que vaya bien...

Saludos.

 




Gracias por tu respuesta OSHOW


DE paso, estaria bueno uncursillo sobre C para PIC...que parece que para cosas mas complejas, el asembler queda corto, por lo menos para el desarrollo, porque uno piensa como maquina, osea, nada...se complica bastante......se pierde la fluidez al requerir mucha concentracion....es un lio la verdad....


Bueno..eso....mne interesa hacer un menu en un LCD y setear valores con este menu.....no se cuantas teclas se necesitan....podrian orientarme....Necesito controlar T° , y que le menu me muestre el valo seteado y el valor medido...

El softawre para PICBASIC no lo entiendo, ademas que no manejo basic...seria genial un programa para CCS..


Bueno, un asaludo a todos

PIC-CHI
Título: RE: Menu con Submenus?
Publicado por: Nocturno en 14 de Septiembre de 2004, 02:41:00
Pic-chi, asómate por aquí, que está de lo más interesante...
Título: RE: Menu con Submenus?
Publicado por: J1M en 15 de Septiembre de 2004, 17:19:00
Apartir del modelo de oshow y con alguna que otra modificacion, por finnn!!! he conseguido un menú mas menos para lo que necesito, aquí os dejo la idea, aunq aún le falta un poco por hacer como vereis... :P

menu.h

Codigo:

void menu(void);

void op1(void);
void op2(void);

void menu_ajustar_rtc(void);
void menu_ajustar_temporizador(void);
void menu_ajustar_max_y_min(void);

static unsigned int testado;


void menu(void)
{
      testado=0;
      delay_ms(100);

      op1();
      op2();
}

void op1(void)
{
      lcd_gotoxy(1,1);
      lcd_putc("1  Ajustar RTC");
      lcd_gotoxy(1,2);
      lcd_putc("2  Ajustar T.ON T.OFF");
      lcd_gotoxy(1,3);
      lcd_putc("3  Ajustar Max y Min ");
      lcd_gotoxy(1,4);
      lcd_putc("OPCION :  ");
}

void op2(void)
{
   char i;
         for (i=0;i!=255;i++)
         {
            delay_ms(40);
            if (!t_mas){delay_ms(100); testado++; if (testado>3){testado=0;};}
            else if (!t_mns){delay_ms(100); testado--; if (testado<0|testado==255){testado=3;};}
            lcd_gotoxy(11,4);
            printf(lcd_putc,"%u",testado);
            if (!t_ok)
            {
               if (testado==0){return;}
               else if (testado==1){lcd_putc("f"); menu_ajustar_rtc();}
               else if (testado==2){lcd_putc("f"); menu_ajustar_temporizador();}
               else if (testado==3){lcd_putc("f"); menu_ajustar_max_y_min();}
            }
            if (!t_menu){delay_ms(300);return;}
         };
}


void menu_ajustar_rtc(void)
{
   testado=0;
   lcd_putc("f");
   lcd_gotoxy(1,1);
   lcd_putc("ajustar RTC");
   delay_ms(1000);
   op1();
}


void menu_ajustar_temporizador(void)
{
   testado=0;
   lcd_putc("f");
   lcd_gotoxy(1,1);
   lcd_putc("ajustar TEMPO");
   delay_ms(1000);
   op1();
}


void menu_ajustar_max_y_min(void)
{
   testado=0;
   lcd_putc("f");
   lcd_gotoxy(1,1);
   lcd_putc("ajustar MAx y Min");
   delay_ms(1000);
   op1();
}



programa principal

Codigo:

#include <16F876A.h>
#use delay(clock=4000000)
#include <lcd20x4.c>

#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD

#use fast_io(B)

#zero_ram

#byte pb       =0xF06

#bit t_menu    =pb.4      // RB4, pin25
#bit t_mas       =pb.5      // RB5, pin26
#bit t_mns       =pb.6      // RB6, pin27
#bit t_ok      =pb.7    // RB7, pin28

void tecla_sel(void);

#include <menu.h>

void main()
{

//   enable_interrupts(INT_RB);    //habilitar interrupciones
//   enable_interrupts(GLOBAL);

   port_b_pullups(TRUE);   //pull-ups activadas en puerto B


   lcd_init();             //inicializacion del lcd

   lcd_putc("f");
   lcd_gotoxy(1,1);
   lcd_putc("Prueba de MENU");
   lcd_gotoxy(1,2);
   lcd_putc("PFC Terrario");
   delay_ms(500);

   while(1)
   {
   lcd_putc("f");
   if(!t_menu)menu();
   }
}



Os pongo también una modificacion que he hecho de la libreria lcd.c bueno, la modificacion de trelles... para que funcione con un LCD de 20x4

Codigo:

////////////////////////////////////////////////////////////////////////////
////                             LCD_MOD.C                              ////
////                 Driver para módulos LCD microcontrolados           ////
////                                                                    ////
////  Inspirado en librería CCS                                          ////
////  Adaptado por Fernando Nuño García y Miguel Ángel José Prieto para ////
////  funcionamiento con el LCD integrado en la placa PICDEM-2-PLUS.    ////
////  Adaptado por Jaime Fernández-Caro para usar LCD de 20x4           ////
////                                                                    ////
////  Funciones definidas                                               ////
////                                                                    ////
////  lcd_init()   Inicialización,llamar antes de cualquier otra función////
////                                                                    ////
////  lcd_putc(c)  Muestra c en la posicion siguiente del LCD.          ////
////                  Caracteres de control:                            ////
////                   f  Borra display                                ////
////                  
  Sitúa cursor al comienzo de la línea 2       ////
////                     Retrocede el cursor una posición             ////
////                        Avanza el cursor una posición                ////
////                    Retrocede una posición la pantalla visible   ////
////                   v  Avanza una posición la pantalla visible      ////
////                                                                     ////
////                                                                    ////
////  lcd_gotoxy(x,y) Sitúa escritura en posición del LCD               ////
////    (posición 1,1: arriba a la izquierda)                              ////
////                                                                    ////
////  lcd_getc(x,y)   Devuelve carácter en posición x,y del LCD         ////
////                                                                    ////
////////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,1997 Custom Computer Services            ////
//// This source code may only be used by licensed users of the CCS C   ////
//// compiler.  This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler.  No other use, reproduction  ////
//// or distribution is permitted without written permission.           ////
//// Derivative programs created using this software in object code     ////
//// form are not restricted in any way.                                ////
////////////////////////////////////////////////////////////////////////////

// Conexión a 7 pines del MCU: 3 de control / interface de datos de 4 bits:
//
//    Líneas de control asignadas
//     RC0  enable
//     RC1  rw
//     RC2  rs
//
//    Líneas de Datos
//     RB0  D4
//     RB1  D5
//     RB2  D6
//     RB3  D7
//
//

struct lcd_pines_control {   // Estructura que se define para facilitar acceso

           boolean enable;   // y asociarlos a los 3 bits más bajos del PORTC
           boolean rw;      // asignamos luego a esta estructura el PORTC
           boolean rs;      // rs (1º) corresponde al menos significativo
           boolean nada;   // a los pines de control del LCD
           int     otros:4;
        } lcd_control;

struct lcd_pines_datos {   // Hacemos lo mismo con esta estructura para el PORTD
           int     datos:4;   // los 4 bits más bajos son los de datos
           int     no_usados:4;
       } lcd_datos;

#byte lcd_control = 7            // Ponemos la estructura entera en el PORTC (registro 7)
#byte trisc = 0x87               // Registro de dirección de datos

#byte lcd_datos = 6               // Lo mismo para los datos, en el PORTD (registro 6)
#byte trisb = 0x86               // Registro de dirección de datos


//Prototipos de las funciones posteriores

void lcd_init();
byte lcd_read_byte();
void lcd_send_nibble(byte n);
void lcd_send_byte(byte address, byte n);
void lcd_gotoxy(byte x, byte y);
void lcd_putc(char c);
char lcd_getc(byte x, byte y);
void lcd_clr_line(char fila);



///////////////////////////////////////////////////////////////////////////////////////////
/// Función que inicializa el LCD, se deberían cambiar bits para cambiar configuracion
///////////////////////////////////////////////////////////////////////////////////////////

void lcd_init() {
    byte i;

    trisc&=0b11111000; // Asignamos salidas en RC0, RC1 y RC2, resto puerto como estaba

    trisb&=0b11110000; // Lo mismo para RB0 a RB3

    lcd_control.rs = 0;
    lcd_control.rw = 0;
    lcd_control.enable = 0;
    delay_ms(15);

    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);

    lcd_send_byte(0,0b00101000); ///Se envía Function set   0 0 1 DL N F  -  -
    lcd_send_byte(0,0b00001100); ///Se envía Display on/off 0 0 0 0  1 D  C  B
    lcd_send_byte(0,0b00000001); //Se envía Clear Display
    lcd_send_byte(0,0b00000110); //Se envía Entry Mode set  0 0 0 0  0 1 I/D S//

// DL: datos 4 bits(0); 8 bits (1) / N: 2 líneas (1); 1 línea (0) / F: 5x10 (1); 5x8 (0)
// D: display on (1); off (0) / C: cursor on (1); off (0) / B: parpadeo pos.cursor (1); no (0)
// I/D: incremento en R/W (1) o decremento (0) / S: acompaña desplaz.display (1); no (0)
}



/////////////////////////////////////////////////////////////////////////////////////////////
// Lee el byte señalado por el puntero, 1º parte alta, 2º parte baja
// Si al llamar a esta función rs=0, devuelve busy flag (+signif.) y dirección actual
/////////////////////////////////////////////////////////////////////////////////////////////

byte lcd_read_byte()
{
      byte low,high;

      trisc&=0b11111000; //Las señales de control siguen siendo salidas, el resto lo que sean
      trisb|=0b00001111; //Las de datos pasan a ser entradas, las demas igual

      lcd_control.rw = 1;
      delay_cycles(1);
      lcd_control.enable = 1;
      delay_cycles(1);
      high = lcd_datos.datos;
      lcd_control.enable = 0;
      delay_cycles(1);
      lcd_control.enable = 1;
      delay_us(1);
      low = lcd_datos.datos;
      lcd_control.enable = 0;

      trisb&=0b11110000; // Dejamos RD0 a RD3 como salidas

      return( (high<<4) | low);
}



/////////////////////////////////////////////////////////////////////////////////////////////
// Envía medio byte, los 4 bits más bajos de n
// Necesario poner rs y rw de modo adecuado y entrar con enable=0
/////////////////////////////////////////////////////////////////////////////////////////////

void lcd_send_nibble( byte n )
{
      lcd_datos.datos = n;
      delay_cycles(1);
      lcd_control.enable = 1;
      delay_us(2);
      lcd_control.enable = 0;
}



/////////////////////////////////////////////////////////////////////////////////////////////
// Envía un byte (n) al registro de instrucciones (si address=0) o reg. de datos (address=1)
// Utiliza lcd_send_nibble(n) enviando primero nibble alto del byte
/////////////////////////////////////////////////////////////////////////////////////////////

void lcd_send_byte( byte address, byte n )
{
      lcd_control.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ; //Mientras esté ocupado el LCD, espera
      lcd_control.rs = address;
      delay_cycles(1);
      lcd_control.rw = 0;
      delay_cycles(1);
      lcd_control.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0x0F);
}



/////////////////////////////////////////////////////////////////////////////////////////////
// Sitúa el contador de direcciones en la DDRAM (para lectura o escritura posterior)
// x puede ir de 1 a 40, posición dentro de una línea (16 visibles)
// y puede ser 1 (línea 1) o 2 (línea 2)
/////////////////////////////////////////////////////////////////////////////////////////////

void lcd_gotoxy( byte x, byte y)
{
   byte posicion;

   switch(y)
   {
     case 1 : posicion=0x80;break;
     case 2 : posicion=0xc0;break;
     case 3 : posicion=0x94;break;
     case 4 : posicion=0xd4;break;
   }
   posicion+=x-1;
   lcd_send_byte(0,0x80|posicion); //Las direcciones de la DDRAM empiezan por 1xxxxxxx
}



////////////////////////////////////////////////////////////////////////////////////////////
// Envía un carácter c a la DDRAM del LCD, también algunos caracteres de control
////////////////////////////////////////////////////////////////////////////////////////////

void lcd_putc( char c)
{
   switch (c)
   {
     case "f"   : lcd_send_byte(0,1);    //Limpia la pantalla
                   delay_ms(2);
                   break;
     case "
"   : lcd_gotoxy(1,2);       //Coloca puntero en 1ª posicion de la 2ª línea
                   break;
     case ""   : lcd_send_byte(0,0x10); //Retrocede una posición el cursor
                   break;
     case "   "   : lcd_send_byte(0,0x14); //Avanza una posición el cursor
                   break;
     case ""   : lcd_send_byte(0,0x18); //Retrocede una posición la pantalla visible
                   break;
     case "v"   : lcd_send_byte(0,0x1C); //Avanza una posición la pantalla visible
                   break;
     default     : lcd_send_byte(1,c);    //Envía caracter a DDRAM,
                   break;                 //Si es una tira, los envía todos uno a uno
   }
}



///////////////////////////////////////////////////////////////////////////////////////////
// Devuelve el carácter situado en la posición x,y de la DDRAM
///////////////////////////////////////////////////////////////////////////////////////////

char lcd_getc( byte x, byte y) {
   char value;

    lcd_gotoxy(x,y);
    lcd_control.rs=1;
    value = lcd_read_byte();
    lcd_control.rs=0;
    return(value);
}



////////////////////////////////////////////////////////////////////////////////////
// Limpia la linea correspondiente y se situa al principio de la misma            //
////////////////////////////////////////////////////////////////////////////////////

void lcd_clr_line(char fila)
{
   int j;

   lcd_gotoxy(1,fila);
    for (j=0;j<40;j++) lcd_putc(" ");

    lcd_gotoxy(1,fila);
}




Salu2!!:s)
Título: RE: Menu con Submenus?
Publicado por: oshow en 15 de Septiembre de 2004, 18:24:00
Hola Venum, veo que el terrario comienza a despegar... me alegro.... de veras.

Sólo quiero hacer un comentario. La librería del lcd que acabas de modificar a pesar de que le hubiera puesto mi apellido, no es mía, sólo puse mi apellido porque había modificado los pines (originalmente traía otros) y para diferenciarlas de otras librerías que tengo pues la renombré con el apellido. Todo el mérito es de los creadores que salen en los comentarios Fernando Nuño García y Miguel Ángel José Prieto dos profesores de la universidad de Oviedo que además conozco personalmente y de los que solo puedo hablar muy bien.

Solo eso, comentar y darle todo el mérito a ellos que son los verdaderos "currantes" y los que han adaptado la librería. Creo que estaba bastante claro quien la había creado/adaptado pero por si acaso,me he quedado mucho más tranquilo aclarando esto.

Un saludo.

Título: RE: Menu con Submenus?
Publicado por: lovando en 15 de Septiembre de 2004, 22:49:00
Tanto codigo que no entiendo ke casi se asemeja a petro/geroglifos..jajajajaja

Bueno, ´taria bueno una explicacion de la filosofia/logica de operacion del codigo, el que se aprecia espectacular.....ya quiero probarlo, no sin antes entender algo.....

Aviso, a los que como yo recien empiezan en esto de C, baje de edaboard un libro de C para PIC, pero no se como subirlo a este foro....pesa 2,7 MB en pdf, comprimido quiza baje un poco....

saludos
Título: RE: Menu con Submenus?
Publicado por: Nocturno en 16 de Septiembre de 2004, 01:07:00
Pic-chi, ¿puedes publicar el link al sitio donde bajaste el libro?
Título: RE: Menu con Submenus?
Publicado por: J1M en 16 de Septiembre de 2004, 03:07:00
ok oshow... aklarado keda :D ;)

pic-chi, te explico la parte que creo q es mas "filosofica" del programa :P

Codigo:

void menu(void)
{
      testado=0;
      delay_ms(100); // evitamos revotes

      op1();
      op2();
}

void op1(void) // función encargada de mostrar el menú
{
      lcd_gotoxy(1,1);
      lcd_putc("1  Ajustar RTC");
      lcd_gotoxy(1,2);
      lcd_putc("2  Ajustar T.ON T.OFF");
      lcd_gotoxy(1,3);
      lcd_putc("3  Ajustar Max y Min ");
      lcd_gotoxy(1,4);
      lcd_putc("OPCION :  ");
}

void op2(void) // funcion encargada de detectar y seleccionar opcion
{
   char i;
         for (i=0;i!=255;i++)  // solo estaremos un tiempo X dentro del menú
         {
            delay_ms(40); // X será: 255·0,04 = 10seg
            if (!t_mas){delay_ms(100); testado++; if (testado>3){testado=0;};} // si se pulsa la tecla mas, y testado es mayor que 3, este vuelve a ser 0, esto es para que el menu solo avance entre 0 y 3
            else if (!t_mns){delay_ms(100); testado--; if (testado<0|testado==255){testado=3;};} // lo mismo para la tecla menos, solo que se añade tambien la condicion de que el número sea 255, ya que si estamos en cero y retrocedemos no vamos al -1 sino a 255 ;)
            lcd_gotoxy(11,4);
            printf(lcd_putc,"%u",testado);
            if (!t_ok) // al pulsar la tecla OK...
            {
               if (testado==0){return;} // Comrobamos lo que vale testado y vamos a ese submenú
               else if (testado==1){lcd_putc("f"); menu_ajustar_rtc();}
               else if (testado==2){lcd_putc("f"); menu_ajustar_temporizador();}
               else if (testado==3){lcd_putc("f"); menu_ajustar_max_y_min();}
            }
            if (!t_menu){delay_ms(300);return;} // estando dentro del menu si se pulsa la tecla menu se sale de el
         };
}



Así a grandes rasgos:

Pulsamos la tecla menu estando en la pantalla inicial, y nos muesta el menú, la variable testado estará a 0, si pulsamos OK saldremos del menú, también podremos salir del menú pulsando la tecla menu para cualquier valor de testado. Dentro del menú solo tendremos 10 segundos para seleccionar una opcion, pasado ese tiempo volvemos a la pantalla inicial. Una vez configurados los distintos submenus volveremos a la pantalla inicial, por eso acaban por op1();

Bueno creo que mas o menos se entiende no?

Por cierto usa un 11% de rom y un 4% de ram


Salu2! ;)
Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 16 de Septiembre de 2004, 06:21:00
Escrito originalmente por pic-chi
Tanto codigo que no entiendo ke casi se asemeja a petro/geroglifos..jajajajaja

Bueno, ´taria bueno una explicacion de la filosofia/logica de operacion del codigo, el que se aprecia espectacular.....ya quiero probarlo, no sin antes entender algo.....

Aviso, a los que como yo recien empiezan en esto de C, baje de edaboard un libro de C para PIC, pero no se como subirlo a este foro....pesa 2,7 MB en pdf, comprimido quiza baje un poco....

saludos


Puedes compactarlo y dividirlo con WinRAR, por ejemplo, en archivos de 256 Kb y subirlo al foro de almacen.
Tambien puedes enviarmelo y yo me encargo de hacer eso, si no puedes subirlo...
El foro esta en:
http://todopic2.foro.st/

Suerte!!
Título: RE: Menu con Submenus?
Publicado por: lovando en 16 de Septiembre de 2004, 08:17:00
No tengo permisos para el almacen...

Bueno, tengo el emule corriendo en mi PC....les dejo el link

ed2k://|file|PICmcu_C.rar|2276874|8AF6BD8C2F2AE6CEBA5A07033488364A|h=4SMNX4F5LGPULEJEZZIMTSBXT6WCHQFL|/


Gracias por la explicacion del programa...mas bien me gustaria pudieras explicar como operan los comandos...por ejemplo lcd_gotoxy...que significa eso??


Chao
Título: RE: Menu con Submenus?
Publicado por: pocher en 16 de Septiembre de 2004, 09:07:00
La explicación de las diversas funciones incluidas en la librería para el control de la LCD, la tienes al principio de esta:

Codigo:
lcd_init()   Inicialización,llamar antes de cualquier otra función////
////                                                                    ////
////  lcd_putc(c)  Muestra c en la posicion siguiente del LCD.          ////
////                  Caracteres de control:                            ////
////                   f  Borra display                                ////
////                  
  Sitúa cursor al comienzo de la línea 2       ////
////                     Retrocede el cursor una posición             ////
////                        Avanza el cursor una posición                ////
////                    Retrocede una posición la pantalla visible   ////
////                   v  Avanza una posición la pantalla visible      ////
////                                                                     ////
////                                                                    ////
////  lcd_gotoxy(x,y) Sitúa escritura en posición del LCD               ////
////    (posición 1,1: arriba a la izquierda)                              ////
////                                                                    ////
////  lcd_getc(x,y)   Devuelve carácter en posición x,y del LCD        


Te explico lcd_gotoxy(x,y) con un ejemplo:

Quieres escribir Pepe en la línea primera de la LCD (y), posición 10 (x):

lcd_gotoxy(10,1);
lcd_putc("Pepe";

El librito ese, ¿está en inglés?
Título: RE: Menu con Submenus?
Publicado por: lovando en 16 de Septiembre de 2004, 13:43:00
Escrito originalmente por pocher
La explicación de las diversas funciones incluidas en la librería para el control de la LCD, la tienes al principio de esta:

Codigo:
lcd_init()   Inicialización,llamar antes de cualquier otra función////
////                                                                    ////
////  lcd_putc(c)  Muestra c en la posicion siguiente del LCD.          ////
////                  Caracteres de control:                            ////
////                   f  Borra display                                ////
////                  
  Sitúa cursor al comienzo de la línea 2       ////
////                     Retrocede el cursor una posición             ////
////                        Avanza el cursor una posición                ////
////                    Retrocede una posición la pantalla visible   ////
////                   v  Avanza una posición la pantalla visible      ////
////                                                                     ////
////                                                                    ////
////  lcd_gotoxy(x,y) Sitúa escritura en posición del LCD               ////
////    (posición 1,1: arriba a la izquierda)                              ////
////                                                                    ////
////  lcd_getc(x,y)   Devuelve carácter en posición x,y del LCD        


Te explico lcd_gotoxy(x,y) con un ejemplo:

Quieres escribir Pepe en la línea primera de la LCD (y), posición 10 (x):

lcd_gotoxy(10,1);
lcd_putc("Pepe";

El librito ese, ¿está en inglés?





Gracias por la explicacion, eso era lo que buscaba......excelente...muy bueno esto...el C da mas ventaja que asembler....se nota, y bastante....cuando se trata de cosas complejas como esta donde la logica humana va mejor que pensar en asembler (es un "cacho"  - problema menudo).

Bueno, el libro esta en ingles.....asi que habra que interpretarlo...

Adios. y ya no hago mas preguntas para no molestar....

Título: RE: Menu con Submenus?
Publicado por: lovando en 02 de Diciembre de 2004, 06:13:00
Escrito originalmente por Modulay
Si quieres usar CCS tendrás q optar por la opción primera,ya que éste no admite punteros a funciones.
Si explicas más o menos como van a ser concretamente esos menús se puede ir construyendo código.
Saludos



Hola Modulay, segun el libro Nigel Gardner, PICmicro MCU C®, An introduction to programming The Microchip PIC in CCS C, en la pagina 87, se comenta que CCS soporta punteros.

Podrias especificar tu punto, soy novato en C

Gracias
Título: RE: Menu con Submenus?
Publicado por: Nocturno en 02 de Diciembre de 2004, 06:49:00
Yo también soy muy novato en C, y si me equivoco que me corrijan, pero los punteros de CCS sólo pueden apuntar a variables, no a funciones.
Por eso creo que Modulay tiene razón y el libro también Giño
Título: RE: Menu con Submenus?
Publicado por: pocher en 02 de Diciembre de 2004, 07:00:00
Sacado del manual de CCS:

Reference Parameters

The compiler has limited support for reference parameters. This increases the
readability of code and the efficiency of some inline procedures. The following
two procedures are the same. The one with reference parameters will be
implemented with greater efficiency when it is inline.

funct_a(int*x,int*y){
 /*Traditional*/
 if(*x!=5)
     *y=*x+3;
}
funct_a(&a,&b);




funct_b(int&x,int&y){
 /*Reference params*/
 if(x!=5)
     y=x+3;
}
funct_b(a,b);

Título: RE: Menu con Submenus?
Publicado por: MGLSOFT en 03 de Diciembre de 2004, 05:29:00
En varios de los ejemplos y librerias del CCS se utilizan los punteros como parametros de funciones.
Una muy clara es la del manejo de los expander I/O para el 74HC595 y el 74HC165, que estan disponibles para ver en la carpeta de librerias....

Pero lo cierto es que lo que no se puede hacer es apuntar a una funcion directamente, solo esta puede llamar o utilizar los parametros como punteros...Sonrisa Gigante
Título: Re:Menu con Submenus?
Publicado por: Severus77 en 02 de Mayo de 2016, 23:52:32
hola alguien podría apoyarme con el diagrama en proyteus o como realizar un menu.