Autor Tema: Problema con boton de seleccion PIC18F4550  (Leído 2442 veces)

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

Desconectado Alfredo_Gutna

  • PIC10
  • *
  • Mensajes: 6
Problema con boton de seleccion PIC18F4550
« en: 10 de Junio de 2020, 04:28:39 »
Hola, tengo un problema, estoy realizando un sistema de seguridad que de acceso a un menu de seleccion, lo estoy haciendo con un pic18f4550, un lcd 20x4 con i2c, y un keypad 4x4 lo estoy haciendo en PIC C Compiler, el problema esta en que mi sistema de seguridad esta correcto y la parte del menu es el problema utilizo las mismas teclas del sistema de seguridad para el menu mas una extra que requiero para acceder a la opcion del menu que deseo, las teclas de arriba y abajo funcionan bien pero la seleccion no ,ya cheque cambiar depines de puerto, la conexion fisica esta bien pero no logro acceder a la opcion de que deseo, pienso que es en mi codigo pero no tengo errores ni warnings, ya estuve checando varios temas y eh probado varias opciones y nada funciona, les pongo mi codigo, espero me puedan ayudar.

De antemano muchas gracias.

Desconectado Alfredo_Gutna

  • PIC10
  • *
  • Mensajes: 6
Re:Problema con boton de seleccion PIC18F4550
« Respuesta #1 en: 10 de Junio de 2020, 04:43:02 »
Hola, tengo un problema, estoy realizando un sistema de seguridad que de acceso a un menu de seleccion, lo estoy haciendo con un pic18f4550, un lcd 20x4 con i2c, y un keypad 4x4 lo estoy haciendo en PIC C Compiler, el problema esta en que mi sistema de seguridad esta correcto y la parte del menu es el problema utilizo las mismas teclas del sistema de seguridad para el menu mas una extra que requiero para acceder a la opcion del menu que deseo, las teclas de arriba y abajo funcionan bien pero la seleccion no ,ya cheque cambiar de pines, de puerto, la conexion fisica esta bien pero no logro acceder a la opcion de que deseo, pienso que el error esta en mi codigo pero no tengo errores ni warnings, ya estuve checando varios temas y eh probado varias opciones y nada funciona, les pongo mi codigo, espero me puedan ayudar.

De antemano muchas gracias.

Código: [Seleccionar]
#include <18f4550.h>
#fuses HS
#DEVICE ADC=10                                                                                                                                                         
#use delay (crystal = 20MHz)
#use i2c(Master,Fast=100000, sda=PIN_D0, scl=PIN_D1,force_sw)
#include <i2c_Flex_LCD.c> 
#define use_portb_kbd TRUE
#include <KBD2.c>
#rom int8 0xF00000 = {'1','2','3','4'}


int A = 1;
void menu(void);

void main(void)
{
   set_tris_A(0xFF);
   int item;
   int n;
   char k;
   int i;
   char data[4], clave[4];
   lcd_init(0x4E,20,4);
   kbd_init();
   port_b_pullups(TRUE);
   while(true)
   {
     
      if(input(PIN_A0)==0)
      {
         item++;
         delay_ms(300);
      }
      switch(item)
      {
         case 0: 
          lcd_gotoxy(1,1);
          lcd_putc("Elija una opcion y");
          lcd_gotoxy(1,2);
          lcd_putc("presione enter");     
          break;

        case 1: 
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 1        ");
         lcd_gotoxy(1,2);
         lcd_putc("Ingresar Contra");
         if(input(PIN_A1)==0) 
       {
         lcd_putc("\f"); 
         i=0;             
         lcd_putc("Ingresar clave"); 
         while(i<=3) 
           {
            k=kbd_getc();
           
             if (k!=0) 
               {
                data[i]=k;
                           
                i++;           
                lcd_gotoxy(i,2);
                lcd_putc('*');
                lcd_gotoxy(3,4);
                printf(lcd_putc, "%c", k);
               }
           }
         for (i=0;i<=3;i++)
         {
          clave[i]=read_eeprom(0xF00000);
                                 
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))
                                                                                               
         {
         printf(lcd_putc,"\fACCESO CONCEDIDO");
         output_high(PIN_D2);                 
         delay_ms(1000);                     
         output_low(PIN_D2);                 
         lcd_putc("\f");
         menu();

       
         }
         else printf(lcd_putc,"\fACCESO DENEGADO");
         delay_ms(1000);                       
         item=0;               
         break;
         }
         break;
         
        case 2: 
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 2          ");
         lcd_gotoxy(1,2);
         lcd_putc("Cambiar Contrase;a");
         if(input(PIN_A1)==0)
         {
         lcd_putc("\f");
         i=0;
         lcd_putc("Ingrese clave");
         while(i<=3)
           {
            k=kbd_getc();
             if (k!=0)
               {
                data[i]=k;
                i++;
                lcd_gotoxy(i,2);
                lcd_putc('*');
               }
           }
         for (i=0;i<=3;i++)
         {
          clave[i]=read_eeprom(i);
                                 
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))
                                                                                               
         {
         printf(lcd_putc,"\fContrasena nueva");
            while(n<=0)
            {
               k=kbd_getc();
               if (k!=0)
               { 
                  data[n]=k;     
                  write_eeprom(0xF00000,k);       
                  n++;       
                  lcd_gotoxy(n,2);
                  lcd_putc('*');
                  delay_ms(20);
               }
            }
            while(n<=1)
            {
               k=kbd_getc();
               if (k!=0)
               {
                  data[n]=k;     
                  write_eeprom(0xF00001,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);         
               }
            }
            while(n<=2)
            {
               k=kbd_getc();
               if (k!=0)
               {
                  data[n]=k;     
                  write_eeprom(0xF00002,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);         
               }
            }
            while(n<=3)
            {
               k=kbd_getc(); 
               if (k!=0)
               {   
                  data[n]=k;   
                  write_eeprom(0xF00003,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);   
               }
            }
            printf(lcd_putc,"\fContrasena cambiada");
         }
         else printf(lcd_putc,"\fContrasena incorrecta");
         delay_ms(1000);
         item=0;               
         break;
         }
         break;

         default:
         item = 0;
         break;
      }
   }   
}

void menu(void)
{
//do
while(true){
   if(!input(pin_A2)==0)
   {
   A--;
   delay_ms(10);
   }
   
   if(!input(pin_A0)==0)
   {
   A++;
   delay_ms(10);
   }
   
   if(A>4)
   {
   A = 1;
   }
   
   if(A<1)
   {
   A=4;
   }
   
   if(A==1)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "-> Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "   Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "   Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "   Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==0)
      {
         printf(lcd_putc, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   ESCANEO1");
      }
   }
   
   if(A==2)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "-> Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "   Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "   Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==0)
      {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   ESCANEO2");
      }
   }
   
   if(A==3)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "   Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "-> Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "   Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==0)
      {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   ESCANEO3");
      }
   }
   
   if(A==4)
   {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   Opcion 1");
   lcd_gotoxy(1,2);
   printf(lcd_putc, "   Opcion 2");
   lcd_gotoxy(1,3);
   printf(lcd_putc, "   Opcion 3");
   lcd_gotoxy(1,4);
   printf(lcd_putc, "-> Opcion 4");
   delay_ms(200);
   
      if(!input(pin_A3)==1)
      {
   printf(lcd_putc, "\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc, "   ESCANEO4");
      }
   }
}while(true);
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con boton de seleccion PIC18F4550
« Respuesta #2 en: 10 de Junio de 2020, 12:07:20 »
Hola, tengo un problema, estoy realizando un sistema de seguridad que de acceso a un menu de seleccion, lo estoy haciendo con un pic18f4550, un lcd 20x4 con i2c, y un keypad 4x4 lo estoy haciendo en PIC C Compiler, el problema esta en que mi sistema de seguridad esta correcto y la parte del menu es el problema utilizo las mismas teclas del sistema de seguridad para el menu mas una extra que requiero para acceder a la opcion del menu que deseo, las teclas de arriba y abajo funcionan bien pero la seleccion no ,ya cheque cambiar depines de puerto, la conexion fisica esta bien pero no logro acceder a la opcion de que deseo, pienso que es en mi codigo pero no tengo errores ni warnings, ya estuve checando varios temas y eh probado varias opciones y nada funciona, les pongo mi codigo, espero me puedan ayudar.

De antemano muchas gracias.

Buenas tu explicacion es un poco pobre en el sentido de buscar en el codigo que esta mal. Debido a que:
- No sabemos como lo hiciste, que tenes conectado, etc, ni tampoco como lo programaste.

Al ver el archivo, tengo un switch case EXTRA gigante, lo cual lo hace ilegible o dificil de comprender.
Una identacion que tampoco es la correcta para que sea mas clara de ver
- Y tenes mas de un while(true), lo cual para ser un codigo de alguien que recien comienza llama a problemas. ( al menos son los que vi)

Veo que preguntas por RA0, RA2, ademas de eso tenes el teclado.

Entonces para poder intentar de ver cual es el problema, aunque ya uno te lo dije ( el while(true) de la funcion menu - nunca sale- ), deberias poder explicar que hace cada entrada. RA0 es subir, RA2 es bajar ? o lo tenes en el teclado 4x4 ? Estas usando otra entrada mas ? ¿Para que son esas entradas que usas? Listame las entradas de los botones en fin..
Luego explica como queres que funcione el menu.. distintas pantallas a mostrar, cuando entrar, que cosa se necesita para entrar al menu (boton a presionar, del teclado o aparte) etc.

Y si podes intenta explicar lo que quisiste hacer con ese super switch case..

No es que soy pesado, te lo pido por 2 motivos:
1- Es mas sencillo de diagnosticar el problema asi
2- Es util para hacerte ver a vos, tu propio error.


Varios puntos a tener en cuenta ademas en el trabajo con LCD:
- No es util enviar el mismo texto a cada rato al LCD si se mantiene con el mismo texto, es decir nada cambia.
- Lo mejor es cambiar la parte que se necesita cambiar en el caso que sea pequeño esa parte.

Trabajo con teclado ( switchs, etc ):
- Antirebotes.
- Codigos que no tomen en cuenta al tener presionado 2 botones juntos o mas.
- Antirepeticion, es decir un codigo que al mantenerse presionado el boton, sepa distinguir entre una presion corta, o larga del boton. Util para varias cosas, recorda que el microcontrolador es rapido, y el bucle tal ves sea de 10ms, lo cual si se mantiene presionado puede crear ese problema si no se tiene en cuenta.

Y usualmente terminas con algo asi:

Lectura de teclados + Filtros (los que nombre)
Actuo sobre las variables internas que me manejan el menu y todo lo demas.
Muestro en el LCD si es necesario cambiar algo.


----------------------------------------------

PD, si no sabes si te funciona el boton, crea un pequeño programa que lo lea, y cambie una salida... Asi sabes si esta funcionando o no, si lo podes leer o no.
« Última modificación: 10 de Junio de 2020, 12:16:07 por KILLERJC »

Desconectado Alfredo_Gutna

  • PIC10
  • *
  • Mensajes: 6
Re:Problema con boton de seleccion PIC18F4550
« Respuesta #3 en: 10 de Junio de 2020, 14:16:10 »
Hola KILLERJC muchas gracias por responder, bien estos son los detalles, las entradas son: el puerto B lo utilizo completo para el keypad 4x4, en el puerto A tengo 2 botones para el sistema de seguridad, A0 para cambiar de opcion y A1 para entrar en la opcion selecconada, esta parte no tengo problema todo esta correcto.

En la funcion menu, utilizo A0 baja la selección, A2 sube la selección y A3 en mi boton de acceso a la opción que deseo.

Con respecto al switch-case es para mi sistema de seguridad ya que tengo las opciones de ingresar contraseña donde si es correcta manda a llamar la funcion menu, la otra opcion me permite modficar la contraseña que tiene en la memoria, como digo el switch case no tiene problema funciona bien, ahora mas bien no se si al llamar la funcion como lo hago estabien o le faltaria algo(En el switch case marco en negritas como mando a llamar a mi funcion menu).

Gracias por la observacion de los filtros para el teclado, voy a checarlos para agregarselos.

Lo del while(true) repetido no lo note cuando puse mi codigo aqui, pero como lo estuve probando es como lo describo debajo,

Gracias por la observación de que no se debe estar mandando constantemente la misma información al LCD, voy a cambiar eso.

El menu deberia funcionar asi:

Cuando el sistema de seguridad me pasa al menu lo que aparece es:

-> Opcion 1
    Opcion 2
    Opcion 3
    Opcion 4

lo que dezplaza o hace el efecto de dezplazamineto es la flecha si oprimo el boton en A0, mi siguiente linea pantalla seria:
    Opcion 1
->Opcion 2
    Opcion 3
    Opcion 4
 y asi suecsivamente tambien se puede desplazar en ambos sentidos sin problema, cuando oprima el boton A3, de acuerdo que que opcion se encuentre debe acceder a esa opcion y realizar lo que tengo dentro de estaque se encuentran mediante if anidados.

El detalle esta en que accedo al menu cuando ingreso la conraseña correcta, y me aparece el menu puedo mover la flecha sin problema hacia arriba o hacia abajo, pero el enter no me da acceso a lo que tengo dentro de la opcion seleccionada, ya probe cambiarlo el A3 del enter del menu por las otras entradas que utilizo (las estuve cambiando para verificar que el pin A3 estuviera leyendo y si lo hace) y no accede al menu

Por lo que puedo concluir es que me falta algo o estoy haciendo algo mal en la funcion menu al momento de oprimir el boton A3 que no me permite acceder a la opcion que quiero.

De antemano gracias por la ayuda

Código: [Seleccionar]
#include <18f4550.h>
#fuses HS
#DEVICE ADC=10                                                                                                                                                         
#use delay (crystal = 20MHz)
#use i2c(Master,Fast=100000, sda=PIN_D0, scl=PIN_D1,force_sw)
#include <i2c_Flex_LCD.c> 
#define use_portb_kbd TRUE
#include <KBD2.c>
#rom int8 0xF00000 = {'1','2','3','4'}


int A = 1;
void menu(void);

void main(void)
{
   set_tris_A(0xFF);
   int item;
   int n;
   char k;
   int i;
   char data[4], clave[4];
   lcd_init(0x4E,20,4);
   kbd_init();
   port_b_pullups(TRUE);
   while(true)
   {
     
      if(input(PIN_A0)==0)
      {
         item++;
         delay_ms(300);
      }
      switch(item)
      {
         case 0: 
          lcd_gotoxy(1,1);
          lcd_putc("Elija una opcion y");
          lcd_gotoxy(1,2);
          lcd_putc("presione enter");     
          break;

        case 1: 
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 1        ");
         lcd_gotoxy(1,2);
         lcd_putc("Ingresar Contra");
         if(input(PIN_A1)==0) 
       {
         lcd_putc("\f"); 
         i=0;             
         lcd_putc("Ingresar clave"); 
         while(i<=3) 
           {
            k=kbd_getc();
           
             if (k!=0) 
               {
                data[i]=k;
                           
                i++;           
                lcd_gotoxy(i,2);
                lcd_putc('*');
                lcd_gotoxy(3,4);
                printf(lcd_putc, "%c", k);
               }
           }
         for (i=0;i<=3;i++)
         {
          clave[i]=read_eeprom(0xF00000);
                                 
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))
                                                                                               
         {
         printf(lcd_putc,"\fACCESO CONCEDIDO");
         output_high(PIN_D2);                 
         delay_ms(1000);                     
         output_low(PIN_D2);                 
         lcd_putc("\f");
        [b] menu();
[/b]
       
         }
         else printf(lcd_putc,"\fACCESO DENEGADO");
         delay_ms(1000);                       
         item=0;               
         break;
         }
         break;
         
        case 2: 
         lcd_gotoxy(1,1);
         lcd_putc("Opcion 2          ");
         lcd_gotoxy(1,2);
         lcd_putc("Cambiar Contrase;a");
         if(input(PIN_A1)==0)
         {
         lcd_putc("\f");
         i=0;
         lcd_putc("Ingrese clave");
         while(i<=3)
           {
            k=kbd_getc();
             if (k!=0)
               {
                data[i]=k;
                i++;
                lcd_gotoxy(i,2);
                lcd_putc('*');
               }
           }
         for (i=0;i<=3;i++)
         {
          clave[i]=read_eeprom(i);
                                 
         }
        if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))
                                                                                               
         {
         printf(lcd_putc,"\fContrasena nueva");
            while(n<=0)
            {
               k=kbd_getc();
               if (k!=0)
               { 
                  data[n]=k;     
                  write_eeprom(0xF00000,k);       
                  n++;       
                  lcd_gotoxy(n,2);
                  lcd_putc('*');
                  delay_ms(20);
               }
            }
            while(n<=1)
            {
               k=kbd_getc();
               if (k!=0)
               {
                  data[n]=k;     
                  write_eeprom(0xF00001,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);         
               }
            }
            while(n<=2)
            {
               k=kbd_getc();
               if (k!=0)
               {
                  data[n]=k;     
                  write_eeprom(0xF00002,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);         
               }
            }
            while(n<=3)
            {
               k=kbd_getc(); 
               if (k!=0)
               {   
                  data[n]=k;   
                  write_eeprom(0xF00003,k);
                  n++;             
                  lcd_gotoxy(n,2);
                  lcd_putc('*');   
                  delay_ms(20);   
               }
            }
            printf(lcd_putc,"\fContrasena cambiada");
         }
         else printf(lcd_putc,"\fContrasena incorrecta");
         delay_ms(1000);
         item=0;               
         break;
         }
         break;

         default:
         item = 0;
         break;
      }
   }   
}

void menu(void)
{
while(true){
   if(!input(pin_A2)==0)
   {
   A--;
   delay_ms(10);
   }
   
   if(!input(pin_A0)==0)
      {
      A++;
      delay_ms(10);
      }
   
   if(A>4)
      {
      A = 1;
      }
   
   if(A<1)
      {
      A=4;
      }
   
   if(A==1)
      {
      printf(lcd_putc, "\f");
      lcd_gotoxy(1,1);
      printf(lcd_putc, "-> Opcion 1");
      lcd_gotoxy(1,2);
      printf(lcd_putc, "   Opcion 2");
      lcd_gotoxy(1,3);
      printf(lcd_putc, "   Opcion 3");
      lcd_gotoxy(1,4);
      printf(lcd_putc, "   Opcion 4");
      delay_ms(200);
   
         if(!input(pin_A3)==0)
         {
            printf(lcd_putc, "\f");
            lcd_gotoxy(1,1);
            printf(lcd_putc, "   ESCANEO1");
         }
      }
   
   if(A==2)
      {
      printf(lcd_putc, "\f");
      lcd_gotoxy(1,1);
      printf(lcd_putc, "   Opcion 1");
      lcd_gotoxy(1,2);
      printf(lcd_putc, "-> Opcion 2");
      lcd_gotoxy(1,3);
      printf(lcd_putc, "   Opcion 3");
      lcd_gotoxy(1,4);
      printf(lcd_putc, "   Opcion 4");
      delay_ms(200);
   
         if(!input(pin_A3)==0)
         {
         printf(lcd_putc, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   ESCANEO2");
         }
       }
   
   if(A==3)
      {
      printf(lcd_putc, "\f");
      lcd_gotoxy(1,1);
      printf(lcd_putc, "   Opcion 1");
      lcd_gotoxy(1,2);
      printf(lcd_putc, "   Opcion 2");
      lcd_gotoxy(1,3);
      printf(lcd_putc, "-> Opcion 3");
      lcd_gotoxy(1,4);
      printf(lcd_putc, "   Opcion 4");
      delay_ms(200);
   
         if(!input(pin_A3)==0)
         {
         printf(lcd_putc, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   ESCANEO3");
         }
      }
   
   if(A==4)
      {
      printf(lcd_putc, "\f");
      lcd_gotoxy(1,1);
      printf(lcd_putc, "   Opcion 1");
      lcd_gotoxy(1,2);
      printf(lcd_putc, "   Opcion 2");
      lcd_gotoxy(1,3);
      printf(lcd_putc, "   Opcion 3");
      lcd_gotoxy(1,4);
      printf(lcd_putc, "-> Opcion 4");
      delay_ms(200);
   
         if(!input(pin_A3)==1)
         {
         printf(lcd_putc, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   ESCANEO4");
         }
      }
}
}

 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con boton de seleccion PIC18F4550
« Respuesta #4 en: 10 de Junio de 2020, 15:29:55 »
Bueno el problema claramente esta en la funcion menu,, asi que me dedique a este.

En tu codigo por 200 ms luego de mostrar todas las opciones, a pesar que entraste, ves el mensaje. Yo acomode un poquito el codigo para que funcione distinto.

Pero....
Mi codigo le falta la mayoria de las cosas que dije antes, es necesario crear funciones para manejar el teclado, los rebotes, etc. Ademas crear una funcion para mostrar las cosas en el LCD. Es decir separar las cosas, para que sea mas facil de debugear luego. Me refiero a crear una funcion que sea dedicada al tratamiento del menu, o a enviar al LCD, pero no todo junto. Tambien es mucho mas sencillo tener todo organizado en estructuras o arrays, pero que no lo hice... Tiene sus defectos y seguramente errores, tampoco lo compile, ya que no uso CSS

Código: C
  1. void menu(void)
  2. {
  3. while(true){
  4.  
  5.     int8 i,Aviejo=0,submenu=0,submenuviejo=0;
  6.     // Reemplazar por "leer_teclado"
  7.  
  8.     if(submenu == 0) {
  9.       if(!input(pin_A2)==0) A--;
  10.       if(!input(pin_A0)==0) A++;
  11.       if(!input(pin_A3)==0) submenu = 1;
  12.       // Correcion de menu
  13.       if(A>4) A = 1;
  14.       if(A<1) A = 4;
  15.     } else {
  16.       //Aca dentro del submenu, que queres que pase con A2, A0 y A3
  17.     }
  18.  
  19.     //En caso de que sea distinto, es decir, cambio, ya sea por cambiar la opcion, o por entrar al submenu... entonces
  20.     if(Aviejo!=A || submenuviejo!=submenu)
  21.     {
  22.       if(submenu) {
  23.         //Cada uno de los submenu
  24.         printf(lcd_putc, "\f");
  25.         lcd_gotoxy(1,1);
  26.         switch(A) {
  27.           case 1:
  28.             printf(lcd_putc, "   ESCANEO1");
  29.             delay_ms(1000);
  30.             return;
  31.           case 2:
  32.             printf(lcd_putc, "   ESCANEO2");
  33.             delay_ms(1000);
  34.             return;            
  35.           case 3:
  36.             printf(lcd_putc, "   ESCANEO3");
  37.             delay_ms(1000);
  38.             return;            
  39.           case 4:
  40.             printf(lcd_putc, "   ESCANEO4");
  41.             delay_ms(1000);
  42.             return;
  43.         }
  44.       } else {
  45.         // Menu general
  46.         printf(lcd_putc, "\f");
  47.         for(i=1;i<5;i++)
  48.         {
  49.           lcd_gotoxy(1,i);
  50.           if(A==i) printf(lcd_putc, "->");
  51.           else printf(lcd_putc, "  ");
  52.           printf(lcd_putc, " Opcion %u",i);
  53.         }
  54.       }
  55.     }
  56.   }
  57. }

Pero al menos ahora cuando presiones el boton, de acceder, verias ese mensaje por 1 segundo, y luego saldria de la funcion menu.
Algunos los hice con un for, otros con switch, el for lo simplifica si tuvieras un puntero a arrays por ejemplo. El switch si te complicas con los punteros, etc.
« Última modificación: 10 de Junio de 2020, 15:34:06 por KILLERJC »