char i = 0 , m = 0 , error = 0 ;
const int number[ ]={'y','y',3,2,1,'x',6,5,4,'x',9,8,7,'x','x',0 ,'y'} ;
char temp[6] ;
char temp2[6] ;
char attempts = 0 ;
unsigned cnt ;
void interrupt()
{
cnt++;
INTCON = 0x20;
}
// subroutines
void tone1()
{
sound_play ( 659, 250 ) ;
}
void tone2()
{
sound_play ( 698, 250 ) ;
}
void Tone3()
{
sound_play ( 784, 250 ) ;
}
void melody()
{
cnt = 0 ; tmr0 = 0 ;
while( cnt < 36621 && keypad_read()!= 16 ) // 5-minute alarm until long press on *
{
tone1(); tone2(); tone3(); tone3();
tone1(); tone2(); tone3(); tone3();
tone1(); tone2(); tone3();
tone1(); tone2(); tone3(); tone3();
tone1(); tone2(); tone3();
tone3(); tone3(); tone2(); tone2(); tone1();
}
stop_alarm : portc.f3 = 0 ;
}
void set_new_pass()
{
lcd_cmd(lcd_clear) ;
lcd_out(1,1,"ENTER NEW PASS:") ;
lcd_cmd(lcd_second_row) ;
i = 0 ;
while(portc.f2==0) {}
get_new_pass :
m = 0 ; error = 0 ;
m = keypad_released() ;
while(m==0 || m==14) goto get_new_pass ;
if(m==16) // if CANCEL button is pressed
{
if(i!=0)
{
while(portc.f2==0) {}
lcd_out(2,i," ") ;
lcd_cmd(lcd_move_cursor_left);
i-- ;
goto get_new_pass ;
}
else goto end_sub ;
}
lcd_chr_cp('*') ;
temp[i] = number[m] ;
i++ ;
if(i==6) goto confirm_new_pass ;
goto get_new_pass ;
confirm_new_pass:
while(keypad_released() !=14 && portc.f2==1) {}
if(portc.f2==0) goto get_new_pass ;
for(i=0;i<6;i++)
{
eeprom_write(i,temp[i]) ;
delay_ms(20) ;
}
lcd_cmd(lcd_clear) ;
lcd_out(1,3,"NEW PASS HAS" ) ;
lcd_out(2,4,"BEEN ADDED") ;
delay_ms(2000) ;
end_sub :
lcd_cmd(lcd_clear) ;
}
void check_old_pass()
{
start2:
m = 0 ; i = 0 ; error = 0 ;
lcd_cmd(lcd_clear) ;
lcd_out(1,1,"ENTER OLD PASS:") ;
lcd_cmd(lcd_second_row) ;
while(keypad_released()==16) {}
wait2 :
m = keypad_released() ;
while(m==0 || m==14) goto wait2 ;
edit2 :
if(m==16)
{
if(i!=0)
{
while(portc.f2==0) {}
if(eeprom_read(i-1)!=temp2[i-1] && error>0 ) error-- ;
lcd_out(2,i," ") ;
lcd_cmd(lcd_move_cursor_left);
i-- ;
goto wait2 ;
}
else goto end_sub ;
}
lcd_chr_cp('*') ;
temp2[i] = number[m] ;
if(eeprom_read(i)!=temp2[i]) error++ ;
i++ ;
if(i==6)
{
wait4 :
m = 0 ;
m = keypad_released() ;
if(m!=16 && m!=14)goto wait4 ;
if(m==16) goto edit2 ;
goto compare2 ;
}
goto wait2 ;
compare2:
if(error!=0)
{
lcd_cmd(lcd_clear) ;
lcd_out(1,4,"INVALID!!") ;
while(keypad_released()==0) {}
goto start2 ;
}
else set_new_pass() ;
end_sub:
lcd_cmd(lcd_clear) ;
}
// main program
void main()
{
trisb = 0 ; portb = 0 ;
trisd = 0 ; portd = 0 ;
trisc.f0 = trisc.f1 = 0 ; portc = 0 ;
trisc.f2 =1 ;
trisc.f3 = 0 ;
OPTION_REG = 0x84; // Assign prescaler to TMR0
INTCON = 0xA0; // Enable TMRO interrupt
// lcd initialization
lcd_init(&portb) ;
lcd_cmd(lcd_cursor_off) ;
// keypad initialization
keypad_init(&portd) ;
// sound play initialization
sound_init(&portc,0) ;
while(1)
{
start :
if(eeprom_read(0) != 0xff) goto get_current_pass ;
set_new_pass() ;
get_current_pass :
i = 0 ;
error = 0 ;
lcd_cmd(lcd_clear) ;
lcd_out(1,4,"ENTER PASS:") ;
lcd_cmd(lcd_second_row) ;
wait :
if(portc.f2==0) // if emergency button is pressed
{
while(portc.f2==0)
set_new_pass() ;
goto start ;
}
m = keypad_read() ;
while(m==0 || m==14 ) goto wait ;
cancel_or_set :
if(m==16)
{
cnt = 0 ;
tmr0 = 0 ;
while(keypad_read() == 16)
{
if( cnt>= 367 )
{
check_old_pass() ;
goto get_current_pass ;
}
}
if(i!=0)
{
while(keypad_released()==16) {}
if(eeprom_read(i-1)!=temp2[i-1] && error>0 ) error-- ;
lcd_out(2,i," ") ;
lcd_cmd(lcd_move_cursor_left);
i-- ;
goto wait ;
}
}
m = 0 ;
m = keypad_released() ;
while(m==0 || m==14) goto wait ;
if(m==16) goto cancel_or_set ;
lcd_chr_cp('*') ;
temp2[i] = number[m] ;
if(eeprom_read(i)!=temp2[i]) error++ ;
i++ ;
if(i==6)
{
wait4 :
m = 0 ;
m = keypad_released() ;
while(m!=14 && m!=16 && portc.f2==1) goto wait4 ;
if(m == 16) goto cancel_or_set ;
if(portc.f2==0) goto wait ;
goto compare ;
}
goto wait ;
compare :
for(i=0;i<6;i++)
{
if(temp2[i]!=eeprom_read(i)) error++ ;
}
if(error!=0)
{
lcd_cmd(lcd_clear) ;
lcd_out(1,3,"INVALID PASS") ;
error = 0 ;
attempts++ ;
if(attempts>=3)
{
lcd_out( 2,6,"ALARM" ) ;
portc.f3 = 1 ;
melody() ;
goto get_current_pass ;
}
while(keypad_released()==0) {}
goto get_current_pass ;
}
else
{
lcd_cmd(lcd_clear) ;
lcd_out(1,7,"OPEN") ;
portc.f1 = 1 ; delay_ms(5000) ;
portc.f1 = 0 ;
attempts = 0 ;
}
}
}
|