Podrian decirme porque no me acepta la sentencia?

Hola. Tengo un problema con un código de menús.
Puedo hacer que pase de rutina en rutina oprimiendo un pulsador, pero no que regrese al anterior.
En el único que funcionó es en el primer menú que pude pasar directamente al último. (el cinco)

Acá dejo un pedazo del código para que vean lo que quiero:

PHP:
void menu_uno(void)
{
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("menu uno");
   lcd_gotoxy(1,2);
   lcd_putc("_");  
  while(true)
  {
output_high(PIN_A0); 
delay_ms(300); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(300); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(300); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(300); 
output_low(PIN_A3);
 
    if (!t_up){delay_ms(200); 
    menu_dos();
    }
    if (!t_down){ delay_ms(200); 
    menu_cinco();
    }
   intf=0;
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_EXT);
   
    
}
}
////////////////////////////////////////////////////////////////////////////////
//    Submenu 2
//
///////////////////////////////////////////////////////////////////////////////
void menu_dos(void)
{
  
   lcd_putc("\f");
   lcd_gotoxy(1,1);
   lcd_putc("menu dos");
   
   while(TRUE){  
 
  output_high(PIN_A0);
delay_ms(100); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(100); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(100); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(100); 
output_low(PIN_A3);
 

if (!t_up)delay_ms(200); 
    menu_tres();
    
// if (!t_down) delay_ms(200); 
 
   //menu_uno();

   intf=0;
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_EXT);
  
}
}

Al compilar me tira "recursion not permitted (menu_uno)
Obviamente sacando las //.
Muchas gracias por su ayuda.
 
Última edición por un moderador:
Gracias por tu ayuda.
El problema con return es que me queda en el lcd menu dos aunque con la rutina del menu uno; y si selecciono directamente en menu dos y presiono t_down, no va al menu uno sino a la seleccion de los menus.
No hay otra forma?
 
Gracias por tu ayuda.
El problema con return es que me queda en el lcd menu dos aunque con la rutina del menu uno; y si selecciono directamente en menu dos y presiono t_down, no va al menu uno sino a la seleccion de los menus.
No hay otra forma?

En lo que escribiste estas llamando a las subrutinas como si fuera un goto (error de concepto grosso).

Una forma de manejar los menues puede ser asi:
Código:
void main(){
  
  int k = 1 ;
  ............
  
    while(TRUE){           
        
        ...........         
        
        delay_ms(200) ;
        switch(k){
            case 1: 
                k = menu_uno() ;
                break ;
            case 2: 
                k = menu_dos() ;
                break ;
            case 3: 
                k = menu_tres() ;
                break ;
            case 4: 
                k = menu_cuatro() ;
                break ;
            case 5: 
                k = menu_cinco() ;
                break ;
            default:
                .......... // no good    
        }

        intf=0;
        enable_interrupts(GLOBAL);
        enable_interrupts(INT_EXT);   

        ...........         
    }


.........................................

int menu_uno(void){
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc("menu uno");
    lcd_gotoxy(1,2);
    lcd_putc("_");
    while(true)
    {
        output_high(PIN_A0);
        delay_ms(300);
        output_low(PIN_A0);
        output_high(PIN_A1);
        delay_ms(300);
        output_low(PIN_A1);
        output_high(PIN_A2);
        delay_ms(300);
        output_low(PIN_A2);
        output_high(PIN_A3);
        delay_ms(300);
        output_low(PIN_A3);
        
        if (!t_up)   return 2 ;  //menu dos

        if (!t_down) return 5 ; //menu cinco
   
    }
}
/////////////////////
// Submenu 2
//
/////////////////////
int menu_dos(void)
{
    
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc("menu dos");
    
    while(TRUE){
    
        output_high(PIN_A0);
        delay_ms(100);
        output_low(PIN_A0);
        output_high(PIN_A1);
        delay_ms(100);
        output_low(PIN_A1);
        output_high(PIN_A2);
        delay_ms(100);
        output_low(PIN_A2);
        output_high(PIN_A3);
        delay_ms(100);
        output_low(PIN_A3);
                     
        if(!t_up)     return 3 ;  //menu tres

        if (!t_down)  return 1 ;  //menu uno
        
    }
}
El menu siguiente va a parar a la variable k, el switch llama a quien corresponde y nos queda un stack ebrio de gozo.


Ojo! Esto es un ejemplo de como manejar los menues, pero te moví instrucciones de lugar que ni se como las estas usando.
 
Creo que implemento algo mal, no me funciona, al presionar el pulsador me sale al "menu".
Dejo el código completo:
PHP:
#use delay(clock=4000000) // Frecuencia máxima de trabajo.
// Definición de pines utilizados.
#byte pb =0xF81
#bit t_ok =pb.0 // RB0, pin21 (Tecla OK/MENU).
#bit t_up =pb.1 // RB1, pin22 (Tecla UP).
#bit t_down =pb.2 // RB2, pin23 (Tecla DOWN).
//#INT_EXT 
//#int_rb 
#byte intcon =0xFF2
#bit intf =intcon.1
#include <LCD2.c>
#include <menu_lcd3.h>
 
 
 
void main()
{
set_tris_a(0b0000000);
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
output_low(PIN_A4);
output_low(PIN_A5);
output_low(PIN_A6);
 
 
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
 
lcd_init();
intf=0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(true)
{
 
 
lcd_gotoxy(2,1);
printf(lcd_putc,"PRESIONE MENU");
 
switch(k){
case 1: 
k = menu_uno() ;
break ;
case 2: 
k = menu_dos() ;
break ;
case 3: 
k = menu_tres() ;
break ;
case 4: 
k = menu_cuatro() ;
break ;
case 5: 
k = menu_cinco() ;
break ;
default:
// .......... // no good 
}
 
}
}
 
 
MENU LCD3
 
int menu_uno(void);
int menu_dos(void);
int menu_tres(void);
int menu_cuatro(void);
int menu_cinco(void);
void induc(void);
void piezo(void);
void menu_uno1(void);
void menu_dos1(void);
void menu_tres1(void);
void menu_cuatro1(void);
void menu_cinco1(void);
 
static unsigned int8 testeado;
int16 i,y; // Variables utiizadas.
int k = 0 ;
 
#INT_EXT
void menu()
{
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
output_low(PIN_A4);
output_low(PIN_A5);
output_low(PIN_A6);
lcd_putc("\f");
 
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
testeado=1;
 
for(i=0;i!=255;i++) // 5 segundos para pulsar alguna tecla.
{
delay_ms(20);
 
lcd_gotoxy(1,1);
lcd_putc("1 induc-2 piezo");
lcd_gotoxy(4,2);
printf(lcd_putc,"sistema:%U\n\r",testeado);
if (!t_ok){delay_ms(300); break;}
else if (!t_up){i=0; delay_ms(300); testeado++; if(testeado>2){testeado=2;};}
else if (!t_down){i=0; delay_ms(300); testeado--; if(testeado==255){testeado=0;};}
}
if(testeado==0) // si la opcion seleccionada es la 0, salimos del menú
{
 
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
break;
}
else if(testeado==1){induc(); lcd_putc("\f");}
else if(testeado==2){piezo(); lcd_putc("\f");}
}
 
 
void induc(void)
{
 
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
testeado=1;
for(y=0; y!=1; y++) {
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1-menu uno");
delay_ms(500);
lcd_gotoxy(1,2);
lcd_putc("2-menu dos");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);//************* 
lcd_putc("3-menu tres");
delay_ms(500);
lcd_gotoxy(1,2);//*-************** 
lcd_putc("4-menu cuatro");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);//****************
lcd_putc("5-menu cinco");
delay_ms(500);
lcd_putc("\f");
}
 
 
 
while(true) 
{
delay_ms(20);
 
lcd_gotoxy(4,1);
lcd_putc("seleccione");
lcd_gotoxy(5,2);
printf(lcd_putc,"OPCION:%U\n\r",testeado);
if (!t_ok){delay_ms(300); break;}
else if (!t_up){i=0; delay_ms(200); testeado++; if(testeado>5){testeado=0;};}
else if (!t_down){i=0; delay_ms(200); testeado--; ; if(testeado==255){testeado=5;};}
 
}
if(testeado==0) // si la opcion seleccionada es la 0, salimos del menú
{
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
 
break;
}
else if(testeado==1){menu_uno(); lcd_putc("\f");}
else if(testeado==2){menu_dos(); lcd_putc("\f");}
else if(testeado==3){menu_tres(); lcd_putc("\f");}
else if(testeado==4){menu_cuatro(); lcd_putc("\f");}
else if(testeado==5){menu_cinco(); lcd_putc("\f");}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 1
//
///////////////////////////////////////////////////////////////////////////////
int menu_uno(void)
{
// restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu uno");
lcd_gotoxy(1,2);
lcd_putc(""); 
while(true)
{
output_high(PIN_A0); 
delay_ms(300); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(300); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(300); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(300); 
output_low(PIN_A3);
 
 
if (!t_up) return 5 ; //
if (!t_down) return 2 ; //
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
 
 
}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 2
//
///////////////////////////////////////////////////////////////////////////////
int menu_dos(void)
{
// restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu dos");
 
while(TRUE){ 
 
output_high(PIN_A0);
delay_ms(100); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(100); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(100); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(100); 
output_low(PIN_A3);
if (!t_up) return 3 ; //
if (!t_down) return 1 ; //
 
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
 
}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 3
//
///////////////////////////////////////////////////////////////////////////////
int menu_tres(void)
{
//restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu tres");
 
 
 
while(TRUE){ 
 
output_high(PIN_A0); 
delay_ms(50); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(50); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(50); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(50); 
output_low(PIN_A3); 
if (!t_up) return 4 ; //
if (!t_down) return 2 ; //
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); 
}}
 
///////////////////////////////////////////////////////////////////////////////////
int menu_cuatro(void)
{
//restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu cuatro");
 
 
 
while(TRUE){ 
 
output_high(PIN_A0); 
delay_ms(50); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(50); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(50); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(50); 
output_low(PIN_A3); 
if (!t_up) return 3 ; //
if (!t_down) return 5 ; //
 
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); 
}}
///////////////////////////////////////////////////////////////////////////////////
int menu_cinco(void)
{
// restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu cinco");
 
 
 
while(TRUE){ 
 
output_high(PIN_A0); 
delay_ms(50); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(50); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(50); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(50); 
output_low(PIN_A3); 
if (!t_up) return 4 ; //
if (!t_down) return 1 ; //
 
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); 
}}
 
Última edición por un moderador:
Atrás
Arriba