mifare 读写程序
//--------------------------------------
#define IN_MIFARE_C
#include "mifare.h"
//--------------------------------------
uchar g_task1;
uchar g_task2;
uint g_rc500_softdog;
uchar g_state_rc500;
uint g_card_left;
uint g_buzzer_on_time;
uchar g_rc500_sector;
uchar g_rc500_block;
uchar g_rc500_key_kind;
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
发表时间:2004年5月25日17:01:13