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
#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");
}
}
}
}