TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Lord_Duran en 12 de Septiembre de 2010, 22:26:18

Título: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 12 de Septiembre de 2010, 22:26:18
Saludos cordiales.

Tengo dudas de cómo hacer menu en CCS. Bueno, estoy haciendo un pequeño proyecto sobre control de temepratura y humedad de suelo en un invernadero, inicialmente solo trabaja con plantacion de claveles, en temperaturas de 20 a 28 ºC, y humedad de suelo de 75 a 77 %, pero, ahora me pidieron que el sistema permita la selección del tipo de plantación que esta manejando el invernadero y obviamente el rango de temperatura y humedad cambiaria para cada plantación. Por ejemplo, se puede seleccionar la plantacion de rábanos, o de espárragos, u otro y el sistema controlaria los rangos de temperatura y humedad.

El menu tiene que mostrarse en el LCD 4x20 obviamente, debe ser algo asi:

primera vista en la pantalla LCD:
    Seleccione
  la plantacion
  que maneja
segunda vista en la pantalla LCD:
1. Rabanos
2. Pepinos
3. Lechugas
    Opcion: ____
eso se mostraria en las 4 lineas del LCD, pero mediante dos teclas me tiene que permitir subir y bajar entre las opciones del menu el cual es más largo
4. Esparragos
5. Tomate
6. Lechuga
7. ..................

Dependiendo de lo que se seleccione, los rangos seran distintos para diferentes plantaciones.

Bueno, pongo el código de control para una sola plantacion.
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)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>
#bit Fin_carrera = 7.4
void sube(void);
void baja(void);
void para(void);
void main()
{
   short control, control1, controlh; // VARIABLES DE CONTROL
   int16 hum1, hum2, hum3, temp1, temp2;
   float tempt1, tempt2, humt1, humt2, humt3, humS, tempS, RH;
   
   set_tris_c(0xB0);
   set_tris_d(0xC0);   
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   
   control = 0;
   control1 = 0;
   controlh = 0;

   while(true)
   {
      set_adc_channel(0);  //CANAL 0
      delay_us(20);
      temp1 = (read_adc() * 100);
      set_adc_channel(1);  //CANAL 1
      delay_us(20);
      temp2 = (read_adc() *100);
      tempt1 = temp1 * 0.0049;
      tempt2 = temp2 * 0.0049;
      tempS = (tempt1 + tempt2) / 2.0;   //TEMPERATURA A MANEJAR
      //*********** RUTINA DE CONTROL DE TEMPERATURA ****************
      if (tempS >= 28.0)
      {
         if (control == 0)  //AQUI TESTEAR EL RC3
         {
            output_high(PIN_C1);
            // ir a sube y luego regresar
            sube();
            delay_ms(3000);
            // ir a paraA y luego regresar
            para();
            output_low(PIN_C1);
            control = 1;  //aqui ver el RC3
         }
      }
      if (tempS <= 20.0)
      {
         if (control == 1)
         {
            output_high(PIN_C3);
            //ir a baja y regresar
            baja();
            delay_ms(3000);
            //ir a paraB y regresar
            para();
            output_low(PIN_C3);
            control = 0;
         }
         output_high(PIN_C2); //AIRE CALIENTE
         control1 = 1;
      }
      if (control1 == 1)
      {
         if (tempS <= 25.0)
         {
            output_high(PIN_C2);  //AIRE CALIENTE
         } else
           {
              output_low(PIN_C2);  //APAGA AIRE CALIENTE
              control1 = 0;
           }
      }
      //************ FIN RUTINA CONTROL TEMPERATURA *****************
      set_adc_channel(2);  //CANAL 2
      delay_us(20);
      hum1 = read_adc();
      set_adc_channel(3);  //CANAL 3
      delay_us(20);
      hum2 = read_adc();
      set_adc_channel(4);  //CANAL 4
      delay_us(20);
      hum3 = read_adc();
      //hum1t = (5.0 * hum1) / 1024.0;
      humt1 = hum1 * 0.0049;
      humt2 = hum2 * 0.0049;
      humt3 = hum3 * 0.0049;
      humS = (humt1 + humt2 + humt3) / 3;
      RH = (humS - 0.958) / 0.0307;   // HUMEDAD HA MANEJAR
      //******* RUTINA CONTROL DE HUMEDAD ****************
      if (RH >= 80.0)
      {
         output_low(PIN_C0);
      }
      if (RH <= 75.0)
      {
         output_high(PIN_C0);
         controlh = 1;
      }
      if (controlh == 1)
      {
         if (RH <= 77.0)
         {
            output_high(PIN_C0);
         }else
         {
            output_low(PIN_C0);
            controlh = 0;
         }
      }
      //*********** FIN RUTINA CONTROL HUMEDAD **************
      //printf(lcd_putc, "\fADC = %4ld", q);
      //printf(lcd_putc, "\nVoltage = %01.2fV", p);
      printf(lcd_putc, "\f   TEMPERATURA    ");
      printf(lcd_putc, "\n     %01.2f C", tempS);
      printf(lcd_putc, "\n HUMEDAD   ");
      printf(lcd_putc, "\n%01.2f PHS", RH);
      //TRANSMISION SERIAL
      printf("ADC = %4ld", tempt1);
      printf(" Temperatura = %01.2f C\r", tempS);  // El \r permite cambiar de línea
      printf("ADC = %4ld", hum3);
      printf(" humedad = %01.2f RH\r", RH);
      delay_ms(100);
   }
}
void sube(void)
{
   output_high(PIN_D4);  // EN1
   output_high(PIN_D5);  // EN2
   output_low(PIN_D0);   // IN1
   output_low(PIN_D2);   // IN3
   output_high(PIN_D1);  // IN2
   output_high(PIN_D3);  // IN4
}
void baja(void)
{
   output_high(PIN_D4);   // EN1
   output_high(PIN_D5);   // EN2
   output_high(PIN_D0);   // IN1
   output_high(PIN_D2);   // IN3
   output_low(PIN_D1);    // IN2
   output_low(PIN_D3);    // IN4
}
void para(void)
{
   output_high(PIN_D4);   // EN1
   output_high(PIN_D5);   // EN2
   output_low(PIN_D0);    // IN1
   output_low(PIN_D2);    // IN3
   output_low(PIN_D1);    // IN2
   output_low(PIN_D3);    // IN4
}

este código es solo para la platacion de claveles, lo que no se es cómo voy a hacer el menu, en que lugar del codigo lo pondria, parece uqe tengo que utilizar interrupciones???

Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky en 12 de Septiembre de 2010, 22:37:00
Una de las opciones es realizar una función que reciba una variable como parámetro, y dependiendo de esa variable mediante un switch dibujar en la pantalla. Ésta variable indica que submenú se necesita visualizar.
En otra función, o en el main, dependiendo de las teclas que se pulsen y el valor actual de la variable que controla el menú, cambiar el valor y llamar a la función que dibuja el menú.


Saludos!
Título: Re: Ayuda, realizar menu en CCS
Publicado por: jhozate en 12 de Septiembre de 2010, 22:54:46
eso!, asi como dice suky es muy sencillo de hacerlo
Código: [Seleccionar]
switch(menu){
case 1: ....
           break;
case 2: ...
           break;
}         

ya tu segun lo que necesite haces el control de la variable menu
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 12 de Septiembre de 2010, 23:13:11
Muchas gracias por sus respuestas.

Bueno, lo que entendi, es que por ejemplo si tengo 7 opciones en mi plantación, voy a tener algo asi:

Código: [Seleccionar]
switch(menu){
case 1: ....
           break;
case 2: ...
           break;
case 3: ..

.
.
.
case 7:...
           break;
}

pues....., tiene sentido, perooo...., no se cómo hacer rotar el menu, osea, queme muestre las 3 primeras opciones, luego las otras 3 y luego la ultima, segun cuantas veces se precione el boton "abajo" y que baya subiendo, con un boton "arriba". Y segun las opciones que salgan seleccionadas con las teclas "arriba" y "abajo", un tercer boton de "enter" me permita hacer efectiva la seleccion y que el sistema empiece a funcionar.

Eso me tiene muy confudido, ahora, voy a hacer lo que me indican, haber que tal me va.

Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky en 12 de Septiembre de 2010, 23:51:16
Todo lo controlas con tu variable, o sea, si el Menu Principal es 0x01, al pulsar entrar cargas otro valor, cuando pulsas abajo lo incrementas, cuando pulsas arriba lo decrementas, y cuando llegaste al final mediante if restableces el valor que necesites a esa variable.

Se entiende?


Saludos!
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 13 de Septiembre de 2010, 07:36:09
Saludos Suky, muchas gracias por tu respuesta.

No comprendo a que te refieres con eso de que el menu principal tenga que tener algun valor, o es que se refiere a esto:

Código: [Seleccionar]
switch(menu){
case 0x01: ....
           break;
case 0x02: ...
           break;
case 0x03: ..

.
.
.
case 0x07:...
           break;
}

pues bueno, si fuese asi, entonces lo del if para reestablecer el valor quedaria flotando    :roll: :roll: :roll: :roll:

Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: jhozate en 13 de Septiembre de 2010, 08:15:48
por ejemplo, en el ultimo case debe saber hacia donde dirigir de nuevo el menú, lo q se trata es que debes identificar si aumentas o decrementas tu variable de menú
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 13 de Septiembre de 2010, 20:54:30
Saludos.

lo del switch() si lo entiendo, el codigo queda algo asi:
Código: [Seleccionar]
switch(menu){
case 1: tempA = 20.0;
           tempB = 28.0;
           hum1 = 75.0;
           hum2 = 77.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 2: tempA = 22.0;
           tempB = 26.0;
           hum1 = 73.0;
           hum2 = 76.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
           break;
case 3:tempA = 19.0;
           tempB = 25.0;
           hum1 = 72.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 4:tempA = 18.0;
           tempB = 24.0;
           hum1 = 75.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 5:tempA = 26.0;
           tempB = 30.0;
           hum1 = 75.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 6:tempA = 19.0;
           tempB = 25.0;
           hum1 = 72.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 7:tempA = 22.0;
           tempB = 27.0;
           hum1 = 75.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
}

y eso va a ser manejado por la variable "menu", esa variable va a tomar el valor que los botones "sube", "baja" y "ok" le van a dar??? y cómo va a tomar ese valor??

Cómo le hago para hacer rotar el menu, ya que primero se va a mostrar las primeras tres opciones, luego tendra que mostrarse las opciones 4 a la 6, luego la ultima.

Me estoy liando mucho con esto.

Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: jhozate en 13 de Septiembre de 2010, 21:25:04
mira, algo muy por encima por ejemplo, por polling puedes preguntar el estado de arriba,abajo, ok, obviamente acomodas su correspondiente antirrebotes, dentro del if incrementas o decrementas menu.Para este ejemplo entonces fijate que menú viene inicialmente con 1, entonces entra a su case correspondiente. De esta forma tu programa basicamente estara siempre en algun case (y sus correspondientes rutinas) y preguntando por los estados arriba,abajo, ok. Tambien hay que asegurarse de hacer control de la variable menu para que no sobrepase los case.
Código: [Seleccionar]
int menu=1;
if(arriba==1)
  {
  }
if(abajo==1)
  {
  }
if(ok==1)
  {
  }

switch(menu)
{
case 1: printf(.....);
           printf(......);
           break;
case 2: printf(....);
           printf(....);
           break;
case 3: printf(....);
           printf(....);
           break;
}
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Cryn en 14 de Septiembre de 2010, 09:57:26
y eso va a ser manejado por la variable "menu", esa variable va a tomar el valor que los botones "sube", "baja" y "ok" le van a dar??? y cómo va a tomar ese valor??

Cómo le hago para hacer rotar el menu, ya que primero se va a mostrar las primeras tres opciones, luego tendra que mostrarse las opciones 4 a la 6, luego la ultima.
Supongo que tendrás un teclado matricial, o al menos algunos pulsadores para poder desplazarse dentro de todas las opciones de tu menú e ingreso de datos. Esos pulsadores o teclado matricial, te va ayudar a subir y bajar los valores de tu variable menú, pongo el caso de pulsadores:

if(input(pin_a0)){  //suponiendo que mi pulsador está en el pin A0
  menu++;
  if(menu>3)
     menu=1;
}
if(input(pin_a1)){  //suponiendo que se tiene otro pulsador en A1
   menu--;
      if(menu<1)
         menu=3;
}// en este mi ejemplo solo tengo 3 opciones en el menú, como puedes ver se puede tener para muchas opciones más.

y después vendría el switch:
switch(menu){
   case 1:...
      break;
   case 2:...
      break;
   case 3:...
      break;
}

Ahora, entendí que pretendes mostrar primero el case 1 y seguidamente (sin que se presione ninguna tecla) se muestre el case 2 y después el 3, o me equivoco?

Veo dos formas, que te olvides de esa idea, y bien juntes todo para un solo case y utilices retardos para poder ver las tres opciones:

case 1:opción 1;
     delay_ms(4000);
     opción 2;
     delay_ms(4000);
     opción 3;
     delay_ms(4000);
   break;

u otra forma, cambiando en el case el valor de menú:

case 1: opción 1;
      menu++;
case 2: opción 2;
      menu++;
case 3: opción3;
      menu=1;
      break;

y si es necesario le agregas el delay, pero como ves no hay break en el case 1 y 2, por tanto de hacer el case 1 se pasaría al case 2, y después al 3, y recién saldría de los cases. Y en con tus pulsadores tendrías que incrementar la variable menú de 3 en 3

if(input(pin_a0)){  //suponiendo que mi pulsador está en el pin A0
  menu+=3;
  ...
}

Espero te sirva

saludos!
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 14 de Septiembre de 2010, 16:22:28
Saludos Cryn, muchas gracias por tu respuesta.
Citar
Ahora, entendí que pretendes mostrar primero el case 1 y seguidamente (sin que se presione ninguna tecla) se muestre el case 2 y después el 3, o me equivoco?

en cuanto a eso, pues, lo que quiero es que pulsando uno de los botones (en total son 3), por ejemplo boton "abajo", en la ultima linea del LCD de 4x20 aparesca:

  Opcion: 1  (eso para el primer pulso)
  opcion: 2   (eso pulsado por segunda vez el mismo boton)
  opcion: 3  (eso pulsando por tercera vez)
  .
  .
  .
  opcion: 7  (pulsado por septima vez)

el boton "ok" servira para confirmar la selección y haga lo que tiene que hacer

en caso que se presione el boton "arriba", pues.... obviamente subira, y en la linea 4 del LCD se mostrara

 Opcion: 3   (para la primera vez de presionar el boton "arriba", suponiendo que antes estava en la opcion 4)
 opcion: 2   (para la segunda ves que se haya presionado el boton "arriba")

Bueno, eso es lo que quiero hacr el menu, haber que tal meva, estoy con código, pero aun no entiendo como hacerle rotar.

Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 14 de Septiembre de 2010, 16:59:05
Bueno Cryn.

Aqui algunos ejemplo que encontre en youtube, más valedero es el segundo, ya que esta como quiero además de que tiene rotación

Este va rotando por todo el menu


Este otro esta en una pantalla de 4 lineas:


Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky en 14 de Septiembre de 2010, 18:33:21
Me explico con un ejemplo cortito, el menú sería:

Menú Principal    -> VarMenu=0x00
               |_____  Opción 1 -> VarMenu=0x10
               |_____  Opción 2 -> VarMenu=0x11
               |_____  Opción 3 -> VarMenu=0x12

________________________
|                                        |   [ # ]  Arriba
|_______________________|   [ # ] Abajo
                                              [ # ] Enter


Código: C
  1. char cTestPulsadores(){
  2.    if(Arriba==1){
  3.       delay_ms(20);
  4.       if(Arriba==1){
  5.          return(ARRIBA);
  6.       }
  7.    }
  8.    if(Abajo==1){
  9.       delay_ms(20);
  10.       if(Abajo==1){
  11.          return(ABAJO);
  12.       }
  13.    }
  14.    if(Enter==1){
  15.       delay_ms(20);
  16.       if(Enter==1){
  17.          return(Enter);
  18.       }
  19.    }
  20.    return(NINGUNO);
  21. }
  22.  
  23.  
  24. void vDibujaMenu(char Menu){
  25.  
  26.    switch(Menu){
  27.       case 0x00:
  28.          printf(lcd_putc,"\fPrincipal");
  29.       break;
  30.       case 0x10:
  31.          printf(lcd_putc,"\fOpcion 1  <");
  32.          printf(lcd_putc,"\nOpcion 2");
  33.       break;
  34.       case 0x11:
  35.          printf(lcd_putc,"\fOpcion 2  <");
  36.          printf(lcd_putc,"\nOpcion 3");
  37.       break;
  38.       case 0x12:
  39.          printf(lcd_putc,"\fOpcion 3  <");
  40.          printf(lcd_putc,"\nOpcion 1");
  41.       break;
  42.    }
  43.  
  44.  
  45. }
  46.  
  47. void main(){
  48. char Evento;
  49. char VarMenu=0;
  50.  
  51.    vDibujaMenu(VarMenu);
  52.    while(1){
  53.       Evento=cTestPulsadores();
  54.       if(Evento!=NINGUNO){
  55.          switch(VarMenu){
  56.             case 0:
  57.                VarMenu=0x10;
  58.             break;
  59.             case 0x10:
  60.             case 0x11:
  61.             case 0x12:
  62.                if(Evento==ABAJO){
  63.                   if(++VarMenu==0x13){ // Si quiere ir a un menu no existente..
  64.                      VarMenu=0x10;     // ..comenzamos al principio.-
  65.                   }              
  66.                }
  67.                if(Evento==ARRIBA){
  68.                   if(--VarMenu==0x09){
  69.                      VarMenu=0x12;
  70.                   }
  71.                }
  72.                if(Evento==ENTER){
  73.                   // ejecuto
  74.                   VarMenu=0x00;
  75.                }
  76.             break;
  77.          
  78.          }  
  79.          vDibujaMenu(VarMenu); // Re - dibujo
  80.       }
  81.      
  82.    }
  83. }

Lo hice rápido, pero más o menos es la idea. Utiliza el buscador, seguro hay ejemplos en el foro.


Saludos!
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 14 de Septiembre de 2010, 18:58:11
Muchas gracias Suky.

ya va quedando claro, tons el código que estoy haciendo con switch y case no sirve, jejeje, ya que lo estava haciendo de otra manera.

Citar
Lo hice rápido, pero más o menos es la idea. Utiliza el buscador, seguro hay ejemplos en el foro.
Pues bueno, busque en el foro, y no encontre mucho, solo este ejmplo que pone el maestro J1M, es exactamente lo que quiero lograr a principio, luego le voy dando estética.
http://www.todopic.com.ar/foros/index.php?topic=5459.40

tambien puse un video de lo que hace el ejmplo de J1M, lo puse en mi canal, jejeje
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky en 14 de Septiembre de 2010, 19:11:59
Si el menu es muy largo, el 16F877 no va a ser suficiente, porque el printf utiliza bastante memoria  :?


Saludos!
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky 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!
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: KALLITOS 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  :)
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Suky en 16 de Septiembre de 2010, 18:52:39
NO! definirlos, no declararlos:

#define NINGUNO 0
#define ARRIBA 1
....
Título: Re: Ayuda, realizar menu en CCS
Publicado por: KALLITOS 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran 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]
Título: Re: Ayuda, realizar menu en CCS
Publicado por: KALLITOS 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
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Cryn 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.

(http://img196.imageshack.us/img196/7914/opadp.jpg)

pd. tranquilo lord_duran, es como dice kallitos, solo seguir y seguir intentando y aprendiendo...
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 16 de Septiembre de 2010, 20:35:01
Saludos Cryn

bueno, ahora si lo pongo todo lo necesario para la simulacion:

Título: Re: Ayuda, realizar menu en CCS
Publicado por: KALLITOS en 16 de Septiembre de 2010, 20:58:05
Hola, he simulado tu codigo y el lcd se refresca a cada momento, debes utilizar un flag o bandera o indicador, el cual te diga que existe modificacion de las variables a mostrar en lcd. Si es necesario refrescas, sino pues no lo hagas.

Saludos
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 17 de Septiembre de 2010, 18:22:53


Bueno, luego de tanto  :shock: :shock: :? :? , ahora me puse a hacer funcionar este cerebrito. :D :D :D

Realice una parte inicial del menu, podran ver en los videos que subo como funciona, en si, son dos códigos

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

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

#include <LCD4x20.C>

void vDibujaPuntero(int puntero);


#zero_ram
void main()
{
   int puntero = 0;
   lcd_init();
   
   while (true)
   {
     
      delay_ms(300);
      lcd_putc("\f");
      lcd_putc("Prueva menu");
      lcd_gotoxy(1,2);
      lcd_putc("Inicialmente solo");
      lcd_gotoxy(1,3);
      lcd_putc("control movimiento");
      lcd_gotoxy(1,4);
      lcd_putc("del puntero");
     
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         vDibujaPuntero(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

el video correspondiente:


el segundo código, con una pequeña variante: le quite la introduccion:


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

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

#include <LCD4x20.C>

void vDibujaPuntero(int puntero);


#zero_ram
void main()
{
   int puntero = 0;
   lcd_init();
   
   while (true)
   {
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         vDibujaPuntero(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

Bueno, como podran observar, en el primer video regresa automáticamente a la introduccion, pudiendo notarse por muy poco tiempo el cambio del puntero (->) que hace en el menu, supongo que ello tengo que controlarlo con una interrupcion, pues, estoy en ello, voy a controlar mediante el boton "ok" que va a estar conectado al pin de interrucion externa (rb0), bueno, que me vaya bien.

Tambien me falta controlar cuando el puntero(->) llega a los extremos del menu, además de aumentarle más opciones, por que necesito que sean como 7 opciones.

Bueno, es un avance, y haber que tal... :undecided: :undecided: :undecided:

Saludos y Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 17 de Septiembre de 2010, 22:15:24
Saludos.

Estoy queriendo hacer lo siguiente:

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

p1  p2  p3  p4 -->pantallas

pues bueno, lo hice con switch y sale un código muy largo, con varias funciones, tambien es largo.

Suky decia por ahí que tambien un menu se puede hacer con punteros, como se declara los punteros???

Muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 17 de Septiembre de 2010, 23:22:50
Saludos.

Ya logre hacer algo del menu, en si, hasta ahí funciona a la perfección, lo que no me doy cuenta es cómo hacer para la tecla "ok", se que tengo que manejar la variable "puntero", que ese valor va a tener que mandarse cada vez que se presione "ok", peroo....., no se cómo hacer eso.

Bueno, logre controlar los extremos del menu, pero solamente para 4 opciones, ya que tengo problemas cuando quiero 7 u 8 opciones, osea:

1 opcion
2 opcion
3 opcion
4 opcion

hasta ahi muestra bien, la flecha "->" se mueve bien, pero, cuando quiero mostrar

5 opcion
6 opcion
7 opcion
8 opcion

puess......., eso ya no se como hacerlo, le puse otra funcion que me dibuje todo eso, perooo nada.

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

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

#include <LCD4x20.C>

void vDibujaPuntero(int puntero);
void vDibujaPuntero2(int puntero);


#zero_ram
void main()
{
   int puntero = 0;
   lcd_init();
   
   while (true)
   {
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         if (puntero == 5)
         {
            puntero = 1;
         }
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         if (puntero == 0)
         {
            puntero = 4;
         }
         vDibujaPuntero(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

De todas formas, mando los archivos de simulacion.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Lord_Duran en 25 de Septiembre de 2010, 19:30:32
otraves yo... :) :) luego de algun tiempo.

ya tengo un poco avanzado el menu
El problema es que no se como hacerle para que luego de seleccionar alguna opcion, pues regrese al codigo principal, osea, si se selecciona por ejemplo la opcion 3, luego de un rato necesito que regrese a mostrar lo que estava al inicio del programa, osea, volver al programa principal.

Otro problema, es el momento de la simulacion, como podran ver en el esquematico en proteus, en el pin RB1 puse un LOGICSTATE, por que con el boton (pull down) que entra a ese pin, pues sale error, no se por que, no entiendo nada de ese problema, ya que lo revise y esta armado como los otros dos botones.

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

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.1
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

#use fast_io(B)
#use fast_io(D)

void vDibujaPuntero(int puntero);
void OpcionSelect(int puntero);
void testeo(void);

int puntero = 0;
#zero_ram
void main()
{
   //int puntero = 0;
   set_tris_b(0x03);
   set_tris_d(0xC0);
   lcd_init();
   
   while(true)
   {
      lcd_putc("\f");
      lcd_putc(" Este es una");
      lcd_gotoxy(1,2);
      lcd_putc("prueva del menu");
      lcd_gotoxy(1,3);
      lcd_putc("espero salga");
      lcd_gotoxy(1,4);
      lcd_putc("bien....!");
      if (enter == 1)
      {
         lcd_putc("\f");
         lcd_gotoxy(1,2);
         lcd_putc("SELECCIONE");
         lcd_gotoxy(1,3);
         lcd_putc("PLANTACION");
         delay_ms(2000);
         //lcd_putc("\f");
         testeo();
      }
      delay_ms(300);
   }
   //delay_ms(300);
}

void testeo()
{
   puntero = 1;
   vDibujaPuntero(puntero);
   while (true)
   {
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         if (puntero == 5)
         {
            puntero = 1;
         }
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         if (puntero == 0)
         {
            puntero = 4;
         }
         vDibujaPuntero(puntero);
      }
      if (enter == 1)
      {
         OpcionSelect(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

void OpcionSelect(int puntero)
{
   switch(puntero)
   {
      case 1:lcd_putc("\f");
             lcd_putc("opcion 1");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
      case 2:lcd_putc("\f");
             lcd_putc("opcion 2");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
      case 3:lcd_putc("\f");
             lcd_putc("opcion 3");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
      case 4:lcd_putc("\f");
             lcd_putc("opcion 4");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
   }
}


tambien pongo los archivos de proteus y la libreria del lcd 4x20

Saludos y muchas gracias.
Título: Re: Ayuda, realizar menu en CCS
Publicado por: Cryn en 28 de Septiembre de 2010, 19:46:22
Hola Lord_Duran,

El problema que tienes con el pulsador en RB1 es por tu librería del LCD, ya que ésta configura el TRISB a salidas, por más que hayas declarado bien tu TRIS al principio, cada vez que uses tu LCD se configura todo el puerto B como salida. La solución, puede ser que quites los tris de la librería, o busques otra librería si es que borrando los tris no funcione, o edites tu librería para que funcione adecuadamente.

Tu menu se queda colgado en tu función testeo:
void testeo(){
   puntero = 1;
   vDibujaPuntero(puntero);
   while (true){
      if (abajo == 1){
         delay_ms(300);
         puntero++;
         if (puntero == 5){
            puntero = 1;
         }
         vDibujaPuntero(puntero);
      }
      if (arriba == 1){
         delay_ms(300);
         puntero--;
         if (puntero == 0){
            puntero = 4;
         }
         vDibujaPuntero(puntero);
      }
      if (enter == 1){
         OpcionSelect(puntero);
      }
   }
}
Por eso no sale al programa principal, la solución quita el while(true) colocando una condición para que salga de este ciclo infinito. También podrías usar un if, preguntando por una condición que haga que salga:

while(true){
   ...
   ...
   if(condicion)
      break;
}

Espero que tengas buenos resultados, saludos.