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