Autor Tema: Ayuda, realizar menu en CCS  (Leído 21399 veces)

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

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #15 en: 14 de Septiembre de 2010, 21:16:34 »
Saludos.

Citar
Si el menu es muy largo, el 16F877 no va a ser suficiente, porque el printf utiliza bastante memoria

pues ya estoy fregado, no se que otro podria ser ¿talves un 18F?, si fuese ese, pues......., las rutinas de control de ADC y demás son las mismas???

Aparte:

tengo unas lineas de código de un ejemplo que encontre (J1M), hay cosas que no entiendo

Código: [Seleccionar]
#byte pb       =0xF81
#bit t_ok      =pb.0      // RB0, pin21
#bit t_mas       =pb.1      // RB1, pin22
#bit t_mns       =pb.2      // RB2, pin23

Código: [Seleccionar]
#byte intcon   =0xFF2
#bit  intf     =intcon.1

qué hacen esas lineas???
0xF81 ???? 0xFF2 ????? por que hace eso???

si yo quisiera poner los botones de "bit t_ok" en RB0, "bit t_mas" en RD6 y "bit t_mns" en RD7 cómo modificaria esas líneas de código????

Muchas gracias

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #16 en: 15 de Septiembre de 2010, 13:10:46 »
jejeje, me respondo ami mismo

0xF81 es la direccion del puerto B en el PIC 2520
0xFF2 es la direccion del registro intcon en el mismo PIC

saludos.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #17 en: 16 de Septiembre de 2010, 12:20:08 »
Saludos

hice segun indico Suky en su código de ejemplo, pues..........., no me da tan buen resultado, seguramente algo estoy haciendo mal, solamente me aparece el texto "PRINCIPAL" en lapantalla LCD, no dibuja todo el menu, ni aun cuando presiono las teclas "arriba" y "abajo".

Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
//#byte PORTD = 0x06
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

char cTestPulsadores();
void vDibujaMenu(char Menu);
#zero_ram
int8 NINGUNO = 1;
void main()
{
   
    char Evento;
    char VarMenu = 0;
    set_tris_b(0x01);
    set_tris_d(0xC0);
    lcd_init();
   
    vDibujaMenu(VarMenu);
    while(1)
    {
      Evento = cTestPulsadores();
      if (Evento != NINGUNO)
      {
         switch(VarMenu)
         {
            case 0:
               VarMenu = 0x10;
               break;
            case 0x10:
            case 0x11:
            case 0x12:
               if (Evento == ABAJO)
               {
                  if (++VarMenu == 0x13)  // PARA CONTROLAR EL DESBORDE
                  {
                     VarMenu = 0x10;
                  }
               }
               if (Evento == ARRIBA)
               {
                  if (--VarMenu == 0x09)  //PARA CONTROLAR EL DESBORDE
                  {
                     VarMenu = 0x12;
                  }
               }
               if (Evento == ENTER)
               {
                  // ejecuto
                  VarMenu = 0x00;
               }
               break;
         }
         vDibujaMenu(VarMenu);  //Dibujar el menu.
      }
    }
}

char cTestPulsadores()
{
   if(arriba == 1)
   {
      delay_ms(20);
      if (arriba == 1)
      {
         return(ARRIBA);
      }
   }
   if (abajo == 1)
   {
      delay_ms(20);
      if (abajo == 1)
      {
         return(ABAJO);
      }
   }
   if (enter == 1)
   {
      delay_ms(20);
      if (enter == 1)
      {
         return(ENTER);
      }
   }
   return(NINGUNO);
}

void vDibujaMenu(char Menu)
{
   switch(Menu)
   {
      case 0x00:
         printf(lcd_putc, "\fPRINCIPAL");
         break;
      case 0x10:
         printf(lcd_putc, "-> 1 opcion uno");
         printf(lcd_putc, "   2 opcion dos");
         break;
      case 0x11:
         printf(lcd_putc, "-> 2 opcion dos");
         printf(lcd_putc, "   3 opcion tres");
         break;
      case 0x12:
         printf(lcd_putc, "-> 3 opcion tres");
         printf(lcd_putc, "   1 opcion uno");
         break;
   }
}

Tambien tengo la duda de cómo voy a manejar la cuestion esta de cuando va a ser presionado la tecla "ok" o "ENTER" (código),

Estas lineas de codigo, seguramente va algo ahí, pero no me ubico que es lo que va:
Código: [Seleccionar]
            case 0x10:
            case 0x11:
            case 0x12:

Saludos y muchas gracias, y mil perdones, pero no entiendo del todo esto de menus.

NOTA: me gustaria subir la simulacion del proteus y el .hex, pero no se como subir archivos al foro.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #18 en: 16 de Septiembre de 2010, 12:23:45 »
No veos que definas NINGUNO, ABAJO, ENTER, ARRIBA, ect (Los 4 tienen que ser de valores distintos). Para ejecutar tienes la opción de cuando se prende enter, allí preguntar en que submenu se está posicionado y trabajar con eso.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #19 en: 16 de Septiembre de 2010, 12:27:54 »
Muchas gracias por su respuesta Suky.

Citar
No veos que definas NINGUNO, ABAJO, ENTER, ARRIBA, ect (Los 4 tienen que ser de valores distintos). Para ejecutar tienes la opción de cuando se prende enter, allí preguntar en que submenu se está posicionado y trabajar con eso.

Los tengo definidos entre las siguientes líneas:



vi un posible error, pero nada, se me olvido poner "\n"

Código: [Seleccionar]
  switch(Menu)
   {
      case 0x00:
         printf(lcd_putc, "\fPRINCIPAL");
         break;
      case 0x10:
         printf(lcd_putc, "-> 1 opcion uno");
         printf(lcd_putc, "   2 opcion dos");
         break;
      case 0x11:
         printf(lcd_putc, "-> 2 opcion dos");
         printf(lcd_putc, "   3 opcion tres");
         break;
      case 0x12:
         printf(lcd_putc, "-> 3 opcion tres");
         printf(lcd_putc, "   1 opcion uno");
         break;
   }

lo corregi, pero nada de nada, sigue el mismo problema., en la LCD solamente me muestra el texto de "PRINCIPAL"

Código: [Seleccionar]
  switch(Menu)
   {
      case 0x00:
         printf(lcd_putc, "\fPRINCIPAL");
         break;
      case 0x10:
         printf(lcd_putc, "\n-> 1 opcion uno");
         printf(lcd_putc, "\n   2 opcion dos");
         break;
      case 0x11:
         printf(lcd_putc, "\n-> 2 opcion dos");
         printf(lcd_putc, "\n   3 opcion tres");
         break;
      case 0x12:
         printf(lcd_putc, "\n-> 3 opcion tres");
         printf(lcd_putc, "\n   1 opcion uno");
         break;
   }

Saludos

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #20 en: 16 de Septiembre de 2010, 12:29:53 »
Se me fue el mouse y no pude poner esas lineas que te comento, sobre la defincion de ARRIBA, ABAJO Y DEMAS

o es que son otras variables???

Código: [Seleccionar]
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

char cTestPulsadores();
void vDibujaMenu(char Menu);

tambien esta la definicion de las funciones.

Saludos y muchas gracias

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #21 en: 16 de Septiembre de 2010, 12:55:11 »
Citar
No veos que definas NINGUNO, ABAJO, ENTER, ARRIBA, ect (Los 4 tienen que ser de valores distintos)

hice lo siguiente:
Código: [Seleccionar]
int NINGUNO = 0;
int ENTER = 1;
int ABAJO = 3;
int ARRIBA = 4;

lo puse fuera del void main()
pero nada de nada, es más, nisiquiera compila. Si es que seria por el tipo de datos, pues, int maneja de 0 a 255.

Saludos.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda, realizar menu en CCS
« Respuesta #22 en: 16 de Septiembre de 2010, 12:59:21 »
Hola a todos, no quiero desviar el tema pero quisiera comentar como hago mis menus:

Utilizo una variable, ciclos while y funciones para las teclas y lo que el lcd muestra;

por ejemplo arranca el pic con el menu principal y para esto la variable tiene el valor 1, entonces el codigo queda asi:

Código: C
  1. void main ()
  2. {
  3. //configuraciones necesarias en el hard
  4. //sean modulos y pines
  5.  
  6. do{
  7. while(menu == 1)
  8.       {
  9.        //muestro en lcd lo que deseo mediante una funcion de muestra para cada menu
  10.        //y entro en el bucle
  11.        while(menu == 1)
  12.             {
  13.             teclas();  //voy hacia la funcion de leer la o las teclas pulsadas
  14.             if(tecla_up == 1)  ///ejecuto segun lo deseado para esta tecla
  15.             if(tecla_donw == 1)  ////ejecuto segun lo deseado para esta tecla
  16.             if(tecla_der == 1)  ///ejecuto segun lo deseado para esta tecla
  17.             if(tecla_izq == 1)  ////ejecuto segun lo deseado para esta tecla
  18.             if(tecla_enter == 1)  ///ejecuto segun lo deseado para esta tecla
  19.             if(tecla_esc == 1)  ////ejecuto segun lo deseado para esta tecla
  20.  
  21.             ///si hay que hacer alguna modificacion en el menu y mostrarlo
  22.             ///ejecuto la funcion mostrar_lcd segun el menu en el que se encuentre el programa
  23.  
  24.             /// si hay que salir de este menu simplemente cambio el valor de la variable MENU
  25.             /// ESTE ES EL CUERPO PRINCIPAL PARA TODOS LOS MENUS
  26.             /// YA LAS CARACTERISTICAS DE CADA MENU ESTARA DADA POR LAS IDEAS QUE TENGAS
  27.             }
  28.        }
  29. while(menu == 2)
  30.       {
  31.        //muestro en lcd lo que deseo mediante una funcion de muestra para cada menu
  32.        //y entro en el bucle
  33.        while(menu == 2)
  34.             {
  35.             teclas();  //voy hacia la funcion de leer la o las teclas pulsadas
  36.             if(tecla_up == 1)  ///ejecuto segun lo deseado para esta tecla
  37.             if(tecla_donw == 1)  ////ejecuto segun lo deseado para esta tecla
  38.             if(tecla_der == 1)  ///ejecuto segun lo deseado para esta tecla
  39.             if(tecla_izq == 1)  ////ejecuto segun lo deseado para esta tecla
  40.             if(tecla_enter == 1)  ///ejecuto segun lo deseado para esta tecla
  41.             if(tecla_esc == 1)  ////ejecuto segun lo deseado para esta tecla
  42.  
  43.             ///si hay que hacer alguna modificacion en el menu y mostrarlo
  44.             ///ejecuto la funcion mostrar_lcd segun el menu en el que se encuentre el programa
  45.  
  46.             /// si hay que salir de este menu simplemente cambio el valor de la variable MENU
  47.             /// ESTE ES EL CUERPO PRINCIPAL PARA TODOS LOS MENUS
  48.             /// YA LAS CARACTERISTICAS DE CADA MENU ESTARA DADA POR LAS IDEAS QUE TENGAS
  49.             }
  50.        }
  51. }while(true);   //bucle principal
  52. }

Espero sirva de algo y no te maree  :D.
Saludos  :)
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #23 en: 16 de Septiembre de 2010, 17:06:32 »
Espero sirva de algo y no te maree  :D.

Peor es mi manera, en C18 con punteros a funciones  :shock: Estoy en proceso de enseñarle a un amigo, y se hace complicado  :D
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #24 en: 16 de Septiembre de 2010, 18:38:57 »
Estoy aun más confundido con el código de KALLITOS, pero muchas gracias.

Suky, ya logre que me muestre lo siguiente en la pantalla LCD:

  PRINCIPAL
  -> 1 Opcion uno
      2 Opcion dos

bueno, solo eso, ya que al asignarle valores a las otras variables: ENTER, ABAJO, ARRIBA, pues nisiquiera compila, sale como 10 errores y más, asi que para compilarlo lo puse en comentario éstas, y obtengo el resultado mostrado arriba

Código: [Seleccionar]
char NINGUNO = 'a';
//char ENTER = 'b';
//char ABAJO = 'c';
//char ARRIBA = 'd';

Saludos y muchas gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #25 en: 16 de Septiembre de 2010, 18:52:39 »
NO! definirlos, no declararlos:

#define NINGUNO 0
#define ARRIBA 1
....
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda, realizar menu en CCS
« Respuesta #26 en: 16 de Septiembre de 2010, 18:58:55 »
DEFINE
--------------------------------------------------------------------------------
Syntax:
 #define id text
   or
#define id(x,y...)  text

 
Elements:
 id is a preprocessor identifier, text is any text, x,y and so on are local preprocessor identifiers, and in this form there may be one or more identifiers separated by commas.


Purpose:
Used to provide a simple string replacement of the ID with the given text from this point of the program and on.


In the second form (a C macro) the local identifiers are matched up with similar identifiers in the text and they are replaced with text passed to the macro where it is used.

If the text contains a string of the form #idx then the result upon evaluation will be the parameter id concatenated with the string x.

If the text contains a string of the form #idx#idy then parameter idx is concatenated with parameter idy forming a new identifier.

Examples:
 #define  BITS  8

a=a+BITS;   //same as   a=a+8;

#define hi(x)  (x<<4)

a=hi(a);    //same as   a=(a<<4); 

 
Lord_Duran dale una ojeada al manual de CCS.

Saludos
« Última modificación: 16 de Septiembre de 2010, 19:08:55 por KALLITOS »
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #27 en: 16 de Septiembre de 2010, 19:26:57 »
Saludos

ya defini ARRIBA, ABAJO, ENTER, NINGUNO, pero nada, no consigo nada, con seguridad que es algo que se oculta por ahí, estoy revisando el código paso a paso, haber que tal, miesntras, aqui esta como queda todo el código, para que me ayuden a darle la revisada:

Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

char cTestPulsadores();
void vDibujaMenu(char Menu);

#define NINGUNO 0
#define ENTER 1
#define ABAJO 2
#define ARRIBA 3
#zero_ram
void main()
{
   
    char Evento;
    char VarMenu = 0;
    set_tris_b(0x01);
    set_tris_d(0xC0);
    lcd_init();
   
    vDibujaMenu(VarMenu);
    while(true)
    {
      Evento = cTestPulsadores();
      if (Evento != NINGUNO)
      {
         switch(VarMenu)
         {
            case 0:
               VarMenu = 0x10;
               break;
            case 0x10:
            case 0x11:
            case 0x12:
               if (Evento == ABAJO)
               {
                  if (++VarMenu == 0x13)  // PARA CONTROLAR EL DESBORDE
                  {
                     VarMenu = 0x10;
                  }
               }
               if (Evento == ARRIBA)
               {
                  if (--VarMenu == 0x09)  //PARA CONTROLAR EL DESBORDE
                  {
                     VarMenu = 0x12;
                  }
               }
               if (Evento == ENTER)
               {
                  // ejecuto
                  //printf(lcd_putc, "\fOPCION ");
                  //printf(lcd_putc, "\nseleccionada ", VarMenu);
                  VarMenu = 0x00;
               }
               break;
         }
         vDibujaMenu(VarMenu);  //Dibujar el menu.
      }
    }
}

char cTestPulsadores()
{
   if(arriba == 1)
   {
      delay_ms(20);
      //if (arriba == 1)
      //{
         return(ARRIBA);
      //}
   }
   if (abajo == 1)
   {
      delay_ms(20);
      //if (abajo == 1)
      //{

         return(ABAJO);
      //}
   }
   if (enter == 1)
   {
      delay_ms(20);
      //if (enter == 1)
      //{
         return(ENTER);
      //}
   }
   return(NINGUNO);
}

void vDibujaMenu(char Menu)
{
   switch(Menu)
   {
      case 0x00:
         printf(lcd_putc, "\fPRINCIPAL");
         break;
      case 0x10:
         printf(lcd_putc, "\n-> 1 opcion uno");
         printf(lcd_putc, "\n   2 opcion dos");
         break;
      case 0x11:
         printf(lcd_putc, "\n-> 2 opcion dos");
         printf(lcd_putc, "\n   3 opcion tres");
         break;
      case 0x12:
         printf(lcd_putc, "\n-> 3 opcion tres");
         printf(lcd_putc, "\n   1 opcion uno");
         break;
   }
}

Muchas gracias.

NOTA: Esto ya es ........... vergonzoso   :oops: :oops: :oops:............  :5] :5] :5] :5] :5]

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda, realizar menu en CCS
« Respuesta #28 en: 16 de Septiembre de 2010, 19:29:38 »
NOTA: Esto ya es ........... vergonzoso   :oops: :oops: :oops:............  :5] :5] :5] :5] :5]

Estimado Lord_Duran, nadie nació sabiendo, estas intentando y eso es lo que cuenta, finalmente de los errores aprendes que no hacer, de los logros aprendes que si hacer. Sigue hermano.

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda, realizar menu en CCS
« Respuesta #29 en: 16 de Septiembre de 2010, 19:44:10 »
NOTA: me gustaria subir la simulacion del proteus y el .hex, pero no se como subir archivos al foro.
Cuando estas respondiendo al hilo con un mensaje, aparece debajo del cuadro de edición de texto la marca que dice "Opciones Adicionales...", haces click ahí y se abren las opciones siendo la última "Adjuntar" le das das click en examinar para buscar tu archivo a adjuntar. De preferencia un .rar donde se encuentre tu .c .hex .cof .dsn(proteus) y tus librerías .c de ser necesarias. Para poder ayudarte mejor.


pd. tranquilo lord_duran, es como dice kallitos, solo seguir y seguir intentando y aprendiendo...
.


 

anything