uchar idata inside_pin[12]={0xdd,0xdd};
uchar idata rc500_serial_no[16]={0xaa,0xaa,0xaa,0xaa,0xaa};
uchar idata rc500_data_block_bak[16]={0xbb,0xbb,0xbb,0xbb,0xbb};
//--------------------------------------
void main(void)
{
r_led_on();
feed_dog();
init_cpu_io();
delay_ms(150);
init_cpu_io();
init_var();
buzzer_on_moment();
soft_reset_rc500();
feed_dog();
init_rc500();
init_cpu();
g_led_on();
while(1)
{
feed_dog();
if( (g_task1&0x01) == 0x01)
{
g_task1 &= ~0x01;
g_state_rc500 = 1;
config_rc500_request();
g_rc500_softdog = 2000; // 1s
}
if( (g_task1&0x02) == 0x02)
{
g_task1 &= ~0x02;
g_state_rc500 = 2;
config_rc500_anticollision();
}
if( (g_task1&0x04) == 0x04)
{
g_task1 &= ~0x04;
g_state_rc500 = 3;
get_rc500_card_serial();
config_rc500_select_card();
}
//--------------------------------------------------------
if( (g_task1&0x08) == 0x08)
{
g_task1 &= ~0x08;
g_state_rc500 = 4;
config_rc500_pcd_loadkey(); // ok
}
if( (g_task1&0x10) == 0x10)
{
g_task1 &= ~0x10;
g_state_rc500 = 5;
config_rc500_picc_authenticate1();
}
if( (g_task1&0x20) == 0x20)
{
g_task1 &= ~0x20;
g_state_rc500 = 6;
config_rc500_picc_authenticate2();
}
if( (g_task1&0x40) == 0x40)
{
g_task1 &= ~0x40;
g_state_rc500 = 7;
config_rc500_inc_value();
}
if( (g_task1&0x80) == 0x80)
{
g_task1 &= ~0x80;
g_state_rc500 = 8;
config_rc500_inc_data_1();
g_task2 |= 0x01;
}
if( (g_task2&0x01) == 0x01)
{
g_task2 &= ~0x01;
r_led_on();
buzzer_on_moment();
g_task1 |= 0x01;
}
}
}
//---------------------------------------------------------
void rc500_interrupt (void) interrupt 0 using 1
{
cs_rc500 = 0;
if( (interruptrq&0x20) == 0x20 ) // irq_timeout
{
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( g_state_rc500==4 )
{
if( (errorflag&0x17)==0x00 )
g_task1 |= 0x10;
else
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( g_state_rc500==5 )
{
if( (errorflag&0x17)==0x00 )
g_task1 |= 0x20;
else
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( g_state_rc500==6 )
{
if( (errorflag&0x17)==0x00 && (control&0x08)==0x08)
g_task1 |= 0x40;
else
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( g_state_rc500==7 )
{
if( (errorflag&0x17)==0x00 && (control&0x08)==0x08)
g_task1 |= 0x80;
else
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( g_state_rc500==8 )
{
buzzer_on_moment();
if( (errorflag&0x17)==0x00 && (control&0x08)==0x08)
g_task2 |= 0x01;
else
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( g_state_rc500==8 )
{
led_r = !led_r;
if( (errorflag&0x17)==0x00 && (control&0x08)==0x08)
g_task2 |= 0x01;
else
g_task1 |= 0x01;
command = PCD_IDLE;
}
else if( (interruptrq&0x08) == 0x08 ) // irq_rx
{
control |= 0x04;
switch( g_state_rc500 )
{
case 1:
if( (errorflag&0x17)==0x00 && fifolength==0x02 )
g_task1 |= 0x02;
else
g_task1 |= 0x01;
break;
case 2:
if( (errorflag&0X17)==0x00 && fifolength==0x05 )
g_task1 |= 0x04;
else
g_task1 |= 0x01;
break;
case 3:
if( (errorflag&0x17)==0x00 && fifolength==0x01 )
g_task1 |= 0x08;
else
g_task1 |= 0x01;
break;
default :
g_task1 |= 0x01;
break;
}
command = PCD_IDLE;
}
else
{
g_task1 |= 0x01;
command = PCD_IDLE;
}
cs_rc500 = 1;
}
//--------------------------------------------------------------------------
void timer0_int (void) interrupt 1 using 2 // 0.5 ms for ac_buzzer
{ // 1.0 ms for dc_buzzer
TR0 = 0;
TH0 = CONST_TH0;
TL0 = CONST_TL0;
TR0 = 1;
if( g_card_left!=0x00 && --g_card_left==0x00)
{
rc500_data_block_bak[0]=0x42;
rc500_data_block_bak[1]=0x38;
rc500_data_block_bak[2]=0x17;
rc500_data_block_bak[3]=0x14;
rc500_data_block_bak[4]=0x41;
}
if( g_buzzer_on_time!=0x00 )
{
#ifdef BUZZER_AC
buzzer = !buzzer; // (3) ac_dc buzzer
#endif
if( --g_buzzer_on_time==0x00 )
{
g_led_on();
buzzer_dc_off();
}
}
if( --g_rc500_softdog == 0)
{
g_task1 |= 0x01;
}
}
//---------------------------------------------------------------------------
qq: 157409062
}
}
//--------------------------------------
void rc500_fastcall(void)
{
interrupten = 0x7f;
interruptrq = 0x7f;
command = PCD_IDLE;
control |= 0x01;
}
//-------------------------------------
void get_rc500_card_serial(void)
{
uchar i;
cs_rc500 = 0;
for(i=0; i <5; i++)
{
rc500_serial_no[i] = fifodata;
}
cs_rc500 = 1;
}
/*----------------------------------------------------------------------------
Name : Process_Password
Description : The password of user will processed for a specific format.
Example : user key : A0 A1 A2 A3 A4 A5 turn into
inside key: 5AFO 5AE1 5AD2 5AC3 5AB4 5AA5
//---------------------------------------------------------------------------*/
void process_password(void)
{
uchar i;
uchar idata *pi1 = inside_pin;
uchar code *pc = &rc500_pin_table[3];
for(i=0; i <6; i++)
{
*pi1++ = (*pc> > 4) | ( ~(*pc)&0xf0 );
*pi1++ = (*pc&0x0f) | ( (~(*pc) < <4) );
pc++;
}
}
//--------------------------------------
void config_rc500_request(void)
{
cs_rc500 = 0;
set_rc500_timer(7);
channelredundancy = 0x03;
control &= 0xf7;
bitframing = 0x07;
rc500_fastcall();
fifodata = PICC_REQIDL;
interrupten = 0xAC;
command = PCD_TRANSCEIVE;
cs_rc500 = 1;
}
//-------------------------------------
void config_rc500_anticollision(void)
{
cs_rc500 = 0;
set_rc500_timer(1);
decodercontrol = 0x28;
control &= 0xf7;
channelredundancy = 0x03;
bitframing = 0x00;
rc500_fastcall();
fifodata = PICC_ANTICOLL1;
fifodata = 0x20;
interrupten = 0xAC;
command = PCD_TRANSCEIVE;
cs_rc500 = 1;
}
//-------------------------------------
void config_rc500_select_card(void)
{
uchar i;
cs_rc500 = 0;
set_rc500_timer(1);
channelredundancy = 0x0f;
control &= 0xf7;
bitframing = 0x00;
rc500_fastcall();
fifodata = PICC_SELECT;
fifodata = 0X70;
for(i=0; i <5; i++)
{
fifodata = rc500_serial_no[i];
}
interrupten = 0xAC;
command = PCD_TRANSCEIVE;
cs_rc500 = 1;
}
//---------------------------------------------------------------------------
void config_rc500_pcd_loadkey(void)
{
uchar i;
rc500_count_address();
process_password();
cs_rc500 = 0;
set_rc500_timer(1);
rc500_fastcall();
for(i=0; i <12; i++)
{
fifodata = inside_pin[i];
}
interrupten = 0xBF;
command = PCD_LOADKEY;
cs_rc500 = 1;
}
//-------------------------------------
void config_rc500_picc_authenticate1(void)
{
uchar i;
cs_rc500 = 0;
set_rc500_timer(1);
rc500_fastcall();
// if(g_rc500_key_kind==0x00)
// fifodata = PICC_AUTHENT1A; // key a
// else
fifodata = PICC_AUTHENT1B; // key b
fifodata = g_rc500_block;
for(i=0; i <4; i++) // serial_no
{
fifodata = rc500_serial_no[i];
}
interrupten = 0xAC;
command = PCD_AUTHENT1;
cs_rc500 = 1;
}
//-------------------------------------
void config_rc500_picc_authenticate2(void)
{
cs_rc500 = 0;
set_rc500_timer(3);
rc500_fastcall();
interrupten = 0xAC;
command = PCD_AUTHENT2;
cs_rc500 = 1;
}
//-------------------------------------
// 00000064 FFFFFF9B 00000064 16E916E9
void config_rc500_inc_value(void)
{
cs_rc500 = 0;
set_rc500_timer(5);
//channelredundancy = 0x0f;
channelredundancy = 0x07;
rc500_fastcall();
//fifodata = PICC_INCREMENT;
fifodata = PICC_RESTORE;
fifodata = 5;
interrupten = 0xAc;//0xAC;
command = PCD_TRANSCEIVE;
cs_rc500 = 1;
}
//-------------------------------------
void config_rc500_inc_data(void)
{
cs_rc500 = 0;
set_rc500_timer(8);
channelredundancy = 0x07;
rc500_fastcall();
fifodata = 0x01;
fifodata = 0;
fifodata = 0;
fifodata = 0;
interrupten = 0xac;
command = PCD_TRANSCEIVE;
cs_rc500 = 1;
}
//-------------------------------------
void config_rc500_inc_data_1(void)
{
cs_rc500 = 0;
set_rc500_timer(5);
channelredundancy = 0x0f;
rc500_fastcall();
fifodata = PICC_TRANSFER;
fifodata = 4;
interrupten = 0xAc;
command = PCD_TRANSCEIVE;
cs_rc500 = 1;
}
//-------------------------------------
// count acording to key|a
void rc500_count_address(void)
{
g_rc500_sector = rc500_pin_table[0];
g_rc500_block = rc500_pin_table[0]*4+rc500_pin_table[1];
g_rc500_key_kind = rc500_pin_table[2];
}
//-------------------------------------
void buzzer_on_moment(void)
{
buzzer_dc_on();
g_buzzer_on_time = CONST_BUZZER_ON;
}
//-------------------------------------
void r_led_on(void)
{
led_r = 0;
led_g = 1;
}
//--------------------------------------------------
void g_led_on(void)
{
led_r = 1;
led_g = 0;
}
//--------------------------------------------------