Hola compañeros, acabo de terminar una simulacion de una Cerradura Electronica con su respectivo codigo en CCS, la cerradura permite 6 usuarios donde cada uno tiene una contraseña diferente, la simulacion permite cambiar la contraseña de cada usuario siempre y cuando hallan ingresado su contraseña anterior. Mi duda es la siguiente: El sistema posee un menu de ingreso de contraseña y de cambio de contraseña, cuando un usuario accede a esas opciones no tiene retorno al menu principal, la unica manera para retornar es presionando el MCLR del microcontrolador, he aqui mi duda, es bueno usar el master clear como retorno?? si no es buena practica usarlo me podrian dar consejos de como hacer un retorno sin usar el master clear. Les agradeceria su apoyo, les dejo mi codigo a continucacion y en adjunto la simulacion.
#include <16f877a.h>
#fuses xt, nowdt
#use delay (clock=4M)
#include <lcd.c>
#include <kbd2.c>
#rom 0x2100={1,2,3,4}
#rom 0x2104={5,6,7,8}
#rom 0x2108={9,0,1,2}
#rom 0x210C={3,4,5,6}
#rom 0x2110={7,8,9,0}
#rom 0x2114={0,1,2,3}
void cambiar_cont(); //Funcion para cambiar contraseña
void ingreso_cont(); //Funcion para ingresar contraseña
void detectar_usuario(); //Funcion para detectar usuarios
char k,clave_key[4],memoria[4],press_key[4];
int usuario,i,j,l,pass;
void main()
{
usuario=0;
i=0;
k=0;
pass=0;
j=0;
l=0;
lcd_init();
kbd_init();
port_b_pullups(true);
uno:
lcd_gotoxy(1,1);
lcd_putc("Ingresa Cont-->A");
lcd_gotoxy(1,2);
lcd_putc("Cambiar Cont-->B");
while (true)
{
do{
k=kbd_getc();
}while(k=='\0');
if(k=='A') //Ingreso de Contraseña
{
detectar_usuario();
lcd_gotoxy(1,2);
printf(lcd_putc,"%u",usuario);
delay_ms(500);
lcd_putc("\f");
ingreso_cont();
if(pass==1) //Si en la funcion ingreso_cont() paso la comprobacion, entonces dara acceso total
{
lcd_putc("\f");
lcd_gotoxy(2,1);
printf(lcd_putc,"Puerta Abierta");
output_high(PIN_C0);
}
break;
}
if (k=='B') //Cambio de Contraseña
{
detectar_usuario();
lcd_gotoxy(1,2);
printf(lcd_putc,"%u",usuario);
delay_ms(500);
lcd_putc("\f");
cambiar_cont();
if(pass==0)
{
lcd_putc("\f");
lcd_gotoxy(2,1);
printf(lcd_putc,"Puerta Cerrada"); //Si en la funcion ingreso_cont() no paso la comprobacion, entonces denegara el acceso
delay_ms(1000);
}
break;
}
if(k!='A' && k!='B')
{
lcd_putc("\fTecla incorrecta\ncorrija x favor.");
delay_ms(2000);
goto uno;
}
}
}
void detectar_usuario() //Funcion para detectar el Numero de usuario antes de ingresar o cambiar contraseña
{
lcd_putc("\f");
lcd_gotoxy(3,1);
printf(lcd_putc,"N%c de Usuario",0xDF);
delay_ms(500);
do{
k=kbd_getc();
}while(k=='\0');
switch(k) //La variable i es utilizada en el arreglo de lectura de la memoria eeprom
{ //La variable l es utilizada en el arreglo para la escritura de la memoria eeprom
case '1':
lcd_putc("\f");
lcd_gotoxy(5,1);
lcd_putc("Usuario 1");
usuario=1;
i=0;
l=0;
break;
case '2':
lcd_putc("\f");
lcd_gotoxy(5,1);
lcd_putc("Usuario 2");
usuario=2;
i=4;
l=4;
break;
case '3':
lcd_putc("\f");
lcd_gotoxy(5,1);
lcd_putc("Usuario 3");
usuario=3;
i=8;
l=8;
break;
case '4':
lcd_putc("\f");
lcd_gotoxy(5,1);
lcd_putc("Usuario 4");
usuario=4;
i=12;
l=12;
break;
case '5':
lcd_putc("\f");
lcd_gotoxy(5,1);
lcd_putc("Usuario 5");
usuario=5;
i=16;
l=16;
break;
case '6':
lcd_putc("\f");
lcd_gotoxy(5,1);
lcd_putc("Usuario 6");
usuario=6;
i=20;
l=20;
break;
default:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Usuario Invalido");
}
}
void ingreso_cont()
{
lcd_gotoxy(4,1);
printf(lcd_putc,"Contrase%ca",0xEE);
j=0;
while(j<=3) //Ingreso de la Contraseña mediante el teclado 4x4
{
k=kbd_getc();
if(k!=0)
{
clave_key[j]=k-48;
j++;
lcd_gotoxy(j,2);
printf(lcd_putc,"%u",k-48);
delay_ms(500);
}
}
for (j=0;j<=3;j++) //Lectura de la eeprom
{
memoria[j]=read_eeprom(i);
i++;
}
if ((memoria[0]==clave_key[0])&&(memoria[1]==clave_key[1])&&(memoria[2]==clave_key[2])&&(memoria[3]==clave_key[3])) //Comprobacion de la contraseña ingresada por el usuario vs contraseña en la eeprom
{
pass=1;
}
else
{
pass=0;
}
}
void cambiar_cont()
{
ingreso_cont(); //Primero se comprueba la contraseña actual para poder cambiarla
j=0;
if(pass==1)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
printf(lcd_putc,"Puede Cambiar");
while(j<=3) //Una vez comprada la contraseña se permite escribir en la eeprom la nueva contraseña
{
k=kbd_getc();
if(k!=0)
{
press_key[j]=k-48;
write_eeprom(l,press_key[j]);
j++;
lcd_gotoxy(j,2);
printf(lcd_putc,"%u",k-48);
delay_ms(200);
l++;
}
}
lcd_putc("\fGuardando.");
delay_ms(500);
lcd_putc("\fGuardando..");
delay_ms(500);
lcd_putc("\fGuardando...");
delay_ms(500);
lcd_putc("\fListo :-)");
}
else
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fCont no Valida"); //En caso de que no pase la contraseña actual
}
}