📄 main1.c
字号:
#include <iom16v.h>
#include <macros.h>
#include <stdio.h>
#include <eeprom.h>
#include "main.h"
#include "ds1302.h"
#include "lcd1.h"
#include "MfRc500.h"
#include "at45db161.h"
#include "keyboard.h"
unsigned char alarm_flag=0; // for 1 is alarm, for 0 is no alarm
unsigned char optionmode;
unsigned char cardcounter;
unsigned char key_pw[6];
unsigned char oldkey_pw[6];
unsigned char code_type;
unsigned char second_flag;
unsigned char ledcount;
unsigned char idil_time;
unsigned char mode;
unsigned char time_data[7];
unsigned char RxHead1;
unsigned char sio1_flag;
unsigned char head1;
unsigned char RxHead0;
unsigned char sio0_flag;
unsigned char head0;
unsigned char flash_ledflag;
unsigned char displaycount;
unsigned char old_snr[4];
unsigned char snr[4];
unsigned char size;
unsigned char passflag;
unsigned char password1;
void init_par(void)
{
// unsigned char ll;
// CLEAR_CLK();
// CLEAR_RST();
// ll=EEPROMread(DS1302_FLAG);
// if(ll==0xFF)
// {
// time_data[0]=0x48;
// time_data[1]=0x45;
// time_data[2]=0x17;
// time_data[3]=0x13;
// time_data[4]=0x12;
// time_data[5]=0x06;
// time_data[6]=0x03;
// Set_1302(time_data);
// EEPROMwrite(DS1302_FLAG,0x05);
// }
// else
W_1302(0x80,0x00);
Set_charge();
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x4C; //setup
TCNT1L = 0x01;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x8D; //set count
OCR0 = 0x73; //set compare
TCCR0 = 0x03; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x8D; //reload counter value 1ms
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x4C; //reload counter high value 50ms
TCNT1L = 0x01; //reload counter low value 50ms
displaycount++;
if(displaycount>5)
{
displaycount=0;
Get_1302(time_data);
display_time(time_data);
}
}
void beep11(void)
{
unsigned int i;
SET_BELL();
for(i=0;i<65000;i++);
CLEAR_BELL();
}
void delay(unsigned char count)
{
unsigned int i;
unsigned char j;
for(j=0;j<count;j++)
{
for(i=0;i<65000;i++);
}
}
unsigned char mifare_work(void)
{
unsigned char status1;
unsigned char tt[2];
unsigned char i;
UCSRB=0x00;
status1=Mf500PiccRequest(0x52,tt);
if(status1!=MI_OK)
{
UCSRB=0x98;
return 1;
}
status1=Mf500PiccAnticoll(0,snr);
if(status1!=MI_OK)
{
UCSRB=0x98;
return 1;
}
status1=Mf500PiccSelect(snr,&size);
if(status1!=MI_OK)
{
UCSRB=0x98;
return 1;
}
UCSRB=0x98;
return 0;
}
void init_val(void)
{
unsigned char i;
if(EEPROMread(OPTION_PW)==0xff)
{
for(i=0;i<8;i++)
EEPROMwrite(OPTION_PW+i,0x00);
}
if(EEPROMread(OPEN_PW)==0xff)
{
for(i=0;i<8;i++)
EEPROMwrite(OPEN_PW+i,0x01);
}
optionmode=EEPROMread(MODE);
if(optionmode==0xff)
{
optionmode=0x00;
EEPROMwrite(MODE,0x00);
}
cardcounter=EEPROMread(CARDNUMBER);
if(cardcounter==0xff)
{
cardcounter=0x00;
EEPROMwrite(CARDNUMBER,cardcounter);
}
SET_LOCK1();
SET_LOCK2();
SET_SPK();
}
unsigned char scan_mifare(void)
{
unsigned char j;
unsigned int i;
if(!mifare_work())
{
for(i=0;i<cardcounter;i++)
{
for(j=0;j<4;j++)
old_snr[j]=EEPROMread(CARDADDR+i*4+j);
if(CMP_STRING(old_snr,snr,4)==0)
{
open_lock();
// delay(40);
return 0;
}
}
return 1;
}
return 1;
}
void open_lock(void)
{
unsigned int i;
CLEAR_LOCK1(); //open first door
for(i=0;i<50000;i++);
SET_LOCK1();
for(i=0;i<65000;i++);
CLEAR_LOCK2(); //open second door
for(i=0;i<50000;i++);
SET_LOCK2();
delay(40);
}
unsigned char scan_setup(void)
{
unsigned int i;
unsigned char status9;
if(scankey()==0)
{
for(i=0;i<20000;i++);
status9=keyvalue();
switch(status9)
{
case 0x01:
delay1(8);
passflag=1;
update_pw();
break;
case 0x02:
delay(8);
set_openmode();
break;
case 0x03:
delay(8);
clear_allcard();
break;
case 0x04:
delay(8);
set_newcard();
break;
case 0x05:
delay1(8);
passflag=0;
update_pw();
break;
case 0x06:
scan_openpw();
break;
default:
break;
}
return 0;
}
return 1;
}
void update_pw(void)
{
unsigned char i;
clear_lcd();
display_7();
delay(8);
get_pw();
if(passflag==1)
password1=OPTION_PW;
else password1=OPEN_PW;
if(CMP_PW(password1)==0)
{
clear_lcd();
display_8();
delay(8);
// beep1();
get_pw();
for(i=0;i<6;i++)
EEPROMwrite(password1+i,key_pw[i]);
clear_lcd();
display_9();
delay(8);
// beep1();
}
}
void set_openmode(void)
{
clear_lcd();
display_10();
delay(12);
if(optionmode==0)
{
optionmode=1;
EEPROMwrite(MODE,optionmode);
}
else
{
optionmode=0;
EEPROMwrite(MODE,optionmode);
}
clear_lcd();
display_11();
delay(8);
}
void clear_allcard(void)
{
unsigned char i;
clear_lcd();
display_12();
delay(12);
for(i=0;i<cardcounter*4;i++)
EEPROMwrite(CARDADDR+i,0xff);
cardcounter=0x00;
EEPROMwrite(CARDNUMBER,cardcounter);
clear_lcd();
display_13();
delay(12);
}
void set_newcard(void)
{
unsigned char j,i,status8;
clear_lcd();
display_14();
delay(16);
while(1)
{
status8=mifare_work();
if(status8==0)
break;
}
// do{;}while(mifare_work());
if(cardcounter==0)
{
for(i=0;i<4;i++)
EEPROMwrite(CARDADDR+cardcounter*4+i,snr[i]);
cardcounter=0x01;
EEPROMwrite(CARDNUMBER,cardcounter);
clear_lcd();
display_15();
delay(12);
return;
// beep1();
}
else
{
for(i=0;i<cardcounter;i++)
{
for(j=0;j<4;j++)
old_snr[j]=EEPROMread(CARDADDR+i*4+j);
if(CMP_STRING(old_snr,snr,4)==0)
{goto tt;}
}
for(j=0;j<4;j++)
EEPROMwrite(CARDADDR+cardcounter*4+j,snr[j]);
cardcounter=cardcounter+1;
EEPROMwrite(CARDNUMBER,cardcounter);
clear_lcd();
display_15();
delay(12);
return;
tt:
clear_lcd();
display_16();
delay(12);
return;
// beep1();
}
}
unsigned char scan_openpw(void)
{
if(scankey()==0)
{
get_pw();
if(!CMP_PW(OPEN_PW))
{
// ledon();
open_lock();
return 0;
}
return 1;
}
return 1;
}
void main(void)
{
unsigned char status2,status3,status4;
unsigned int i;
CLI();
timer1_init();
timer0_init(); //timer0 init
SET_BELL();
MCUCR = 0x02;
TIMSK=0x05;
GICR=0x40;
CLEAR_RC500RST();
SET_RC500CS();
DDRA = PORTA = 0;
SEI();
displaycount=0;
CLEAR_LIGHT();
init_par(); //init ds1302
init_val(); //init var
lcd_init(); //lcd init
clear_lcd();
display_1();
delay(20);
CLEAR_BELL();
status2=Mf500PcdConfig();
if(status2==0)
{
clear_lcd();
display_4();
}
delay(20);
// clear_lcd();
// display_3();
while(1)
{
if(optionmode==1)
{
scan_mifare();
}
status4=scankey();
if(status4==0)
{
for(i=0;i<20000;i++);
status3=keyvalue();
if(status3==0x0b)
{
delay(8);
clear_lcd();
display_3();
delay(8);
get_pw();
if(!CMP_PW(OPTION_PW))
{
delay(8);
clear_lcd();
display_5();
delay(8);
while(1)
{
if(scan_setup()==0)
break;
}
}
else
{
delay(8);
clear_lcd();
display_6();
}
}
}
;
status2=mifare_work();
// if(status2==0)
// {
// clear_lcd();
// display_2();
// }
// delay(20);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -