#include <16f877a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT,NODEBUG //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<kbd.c> //libreria manejo keypad
#include<lcd.c> //libreria manejo lcd 8bits
#include<stdlib.h>
#use fixed_io(a_outputs=PIN_A3,PIN_A5,PIN_A1)
#use fast_io(B)
#byte port_d=8
#define use_portb_kbd TRUE
#include<internal_eeprom.c>
///DEFINICION DE FUNCIONES
void nueva_clave(void); //funcion que cambia clave
void comprueba_clave(void); //funcion que comprueba clave
void fabrica_clave(void); //comprobacion de fabrica
void clave_inicial(void); //clave inicial
void Password(void);//Password
///VARIABLES GLOBALES
char clave[16],q,s,y,limit;
int k=0;
int h=0;
int f=0;
int m=0;
int u=0;
int g=0;
int l=0;
int a=0;
int w=0;
int c=0;
int b=0x18;
int d=0;
int j=0;
signed char i;
boolean var=0;
boolean bar=0;
///PROGRAMA
void main(void) {
lcd_init(); //inicializa lcd
kbd_init(); //inicializa kbd
//port_b_pullups(TRUE);
delay_ms(50); //presentacion...
output_high(PIN_A3);
output_high(PIN_A5);
delay_ms(2000);
output_low(PIN_A3);
output_low(PIN_A5);
if(Read_Eeprom(0xFF)!=1){
clave_inicial();
write_eeprom(0xFF,1);
}
lcd_putc("\fLRZV \nSeguridad" );
delay_ms(2000); //...inicial
do{
Password();
}while(m==1);
while(1){
if(bar==1){
lcd_putc("\f0->Aceder\n1->Cambiar clave");
do{ //espera hasta...
q=kbd_getc();
}while(q==0); //...pulsar una tecla
if(q=='A'){ //ve a introducir nueva clave
h=0;
nueva_clave();
}
if(q=='H'){ //ve a comprobar clave
comprueba_clave();
}
}
}
}
/////////FUNCION CAMBIAR CLAVE /////////////////////////
void nueva_clave(void){
while(h==0){ //espera hasta...
fabrica_clave();
}
w=0;
write_eeprom(0xFC,w);
lcd_putc("\fNueva clave:\n" ); //presentacion
for(i=0; ;i++){
do{ //espera hasta...
q=kbd_getc();
}while(q==0); //...pulsar una tecla
if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion
if(i==0){ //no se sale...
lcd_putc("\nEscribe una!!!" );
delay_ms(2000);
lcd_putc("\fNueva clave:\n" );
lcd_gotoxy(1,2);
i=-1;
continue; //...hasta poner una clave valida
}
b=0x17;
j=i;
i=-1;
for(c=0;c<0x16;c++){
b=b+1;
i=i+1;
d=Read_Eeprom(b);
write_eeprom(i,d);
}
b=0x18;
l=Read_Eeprom(0xFC);
write_eeprom(0xFB,w);
write_eeprom(0xFE,w);
u=Read_Eeprom(0xFE);
break; //salir de funcion nueva_clave
}
lcd_putc("*" );
w=w+1; //longitud de la clave
clave[i]=q; //almacena clave(maximo 16 caracteres)
write_eeprom(b,q);
b=b+1;
}
}
////////////FUNCION COMPROBAR CLAVE ///////////////////////////////
void comprueba_clave(void){
lcd_putc("\fIntroduce clave:\n" );
l=0;
for(i=0; ;i++){ //bucle no sale...
do{ //espera hasta...
q=kbd_getc();
}while(q==0); //...pulsar una tecla
lcd_putc("*");
if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion
if(i==0){ //no se sale...
lcd_putc("\nEscribe una!!!" );
delay_ms(2000);
lcd_putc("\fIntroduce clave:\n" );
lcd_gotoxy(1,2);
i=-1;
continue;
} //...poner una clave valida
break; //salimos si se pulsa tecla * o #
}
l=l+1;
write_eeprom(0xFD,l);
if(q!=clave[i]){
var=1;
}
for(k=0;k<0xFB;k++){
if((Read_Eeprom(i)==q)){
var=0;
}
else{
var=1;
}
}
} //...hasta pulsar * o #
l=Read_Eeprom(0xFD);
f=Read_Eeprom(0xFB);
if((var>0)||(f!=l)){ //Clave incorrecta
lcd_putc("\fClave\nIncorrecta" );
output_high(PIN_A3);
delay_ms(2000);
output_low(PIN_A3);
}
if((var==0)&&(f==l)){ //Clave correcta
lcd_putc("\fClave\nCorrecta" );
output_high(PIN_A5);
output_high(PIN_A1);
delay_ms(2000);
output_low(PIN_A5);
output_low(PIN_A1);
bar=1;
}
var=0; //reset var
}
/////////////COMPROVACION DE FABRICA//////////////
void fabrica_clave(void){
lcd_putc("\fSu clave:\n" ); //presentacion
a=0;
for(i=0; ;i++){ //bucle no sale...
do{ //espera hasta...
q=kbd_getc();
}while(q==0); //...pulsar una tecla
lcd_putc("*");
write_eeprom(0xFE,a);
if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion
if(i==0){ //no se sale...
lcd_putc("\nEscribe una!!!" );
delay_ms(2000);
lcd_putc("\fSu clave:\n" );
lcd_gotoxy(1,2);
i=-1;
continue;
} //...poner una clave valida
break; //salimos si se pulsa tecla * o #
}
a=a+1;
for(k=0;k<0xFB;k++){
if((Read_Eeprom(i)==q)){
var=0;
}
else{
var=1;
}
}
} //...hasta pulsar * o #
a=Read_Eeprom(0xFE);
f=Read_Eeprom(0xFB);
if((var>0)||(f!=a)){ //Clave incorrecta
lcd_putc("\fClave\nIncorrecta" );
output_high(PIN_A3);
delay_ms(2000);
output_low(PIN_A3);
}
if((var==0)&&(f==a)){
lcd_putc("\fClave\nCorrecta" );
output_high(PIN_A5);
delay_ms(2000);
output_low(PIN_A5);
h=1;
}
var=0; //reset var
}
////////////CLAVE INICIAL////////////////
void clave_inicial(void){
lcd_putc("\fIntroduce clave:\n" );
for(i=0; ;i++){ //bucle no sale...
do{ //espera hasta...
y=kbd_getc();
}while(y==0); //...pulsar una tecla
lcd_putc("*");
if(y!='D'){
s=y;
}
write_eeprom(0xFE,u);
if(y=='D' || y=='L'){ //si se pulsa * o # se sale de la funcion
if(i==0){ //no se sale...
lcd_putc("\nEscribe una!!!" );
delay_ms(2000);
lcd_putc("\fIntroduce clave:\n" );
lcd_gotoxy(1,2);
i=-1;
continue;
}
break; //salimos si se pulsa tecla * o #
}
u=u+1;
clave[i]=s;
limit=i+1; //longitud de la clave
write_eeprom(i,y);
}
}
///////////////////////////////Password////////////////////////////////
void Password(void){
lcd_putc("\fPassword:\n" );
f=0;
for(i=0; ;i++){ //bucle no sale...
do{ //espera hasta...
q=kbd_getc();
}while(q==0); //...pulsar una tecla
lcd_putc("*");
if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion
if(i==0){ //no se sale...
lcd_putc("\nEscribe una!!!" );
delay_ms(2000);
lcd_putc("\fPassword:\n" );
lcd_gotoxy(1,2);
i=-1;
continue;
} //...poner una clave valida ;
break; //salimos si se pulsa tecla * o #
}
f=f+1;
for(k=0;k<0xFB;k++){
if((Read_Eeprom(i)==q)){
var=0;
}
else{
var=1;
}
}
} //...hasta pulsar * o#
u=Read_Eeprom(0xFE);
if((var>0)||(u!=f)){ //Clave incorrecta
lcd_putc("\fClave\nIncorrecta" );
output_high(PIN_A3);
delay_ms(2000);
output_low(PIN_A3);
if(g==0){
m=1;
}
g=1;
}
if((var==0)&&(u==f)){ //Clave correcta
lcd_putc("\fClave\nCorrecta" );
output_high(PIN_A5);
delay_ms(2000);
output_low(PIN_A5);
bar=1;
m=0;
}
var=0; //reset var
write_eeprom(0xFB,f);
}