mifare 读写程序
//-------------------------------------
#define IN_ROUTINE_C
#include "mifare.h"
//-------------------------------------
code uchar rc500_pin_table[] =
{ 0x01,0x00,0x00,
// 0x19,0x66,0x02,0x25,0x18,0x00};
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };
//-------------------------------------
void process_password(void);
void rc500_count_address(void);
//-------------------------------------
void feed_dog(void)
{
wdt = 0;
nop; nop; nop;
nop; nop; nop;
nop; nop; nop;
wdt = 1;
}
//-------------------------------------
void delay_ms(uint cnt) // 1ms
{
uint i;
uchar j;
for(i=0; i <cnt; i++)
{
for(j=0; j <241; j++)
{
nop; nop;
}
}
}
//--------------------------------------
void init_cpu(void)
{
EA = 0;
EX0 = 1; IT0 = 1;
TMOD = 0X01;
TH0 = CONST_TH0;
TL0 = CONST_TL0;
ET0 = 1; TR0 = 1;
IP = 0X01;
EA = 1;
}
//--------------------------------------
void init_cpu_io(void)
{
buzzer = 1;
}
//--------------------------------------
void buzzer_dc_on(void)
{
buzzer = 0;
}
//--------------------------------------
void buzzer_dc_off(void)
{
buzzer = 1;
}
//-------------------------------------
void init_var(void)
{
g_task1 = 0x01;
g_task2 = 0x00;
g_card_left = 0x00;
g_state_rc500 = 0x00;
g_buzzer_on_time = 0x00;
//memcpy(rc500_serial_no,rc500_data_block_bak,5);
}
//--------------------------------------
void soft_reset_rc500(void)
{
rc500_rst = 0;
rc500_a0 = 1;
rc500_a1 = 1;
rc500_a2 = 0;
delay_ms(300);
cs_rc500 = 0;
do {
nop;
} while (command!=0X00);
cs_rc500 = 1;
}
//--------------------------------------
void init_rc500(void)
{
cs_rc500 = 0;
page = 0x00;
clockqcontrol = 0x40;
clockqcontrol &= 0xbf;
bitphase = 0xad;
rxthreshold = 0xff;
rxcontrol2 = 0x01;
fifolevel = 0x1a;
timercontrol = 0x02;
irqpinconfig = 0x03;
txcontrol &= 0xfc;
delay_ms(1);
txcontrol |= 0x03;
cs_rc500 = 1;
}
//--------------------------------------
void set_rc500_timer(uchar parement)
{
switch(parement)
{
case 1: // 1.176ms
timerreload = 0x6a;
timerclock = 0x07;
break;
case 2: // 1.677ms
timerreload = 0xa0;
timerclock = 0x07;
break;
case 3: // 6.218ms
timerreload = 0xa0;
timerclock = 0x09;
break;
case 4: // 9.801ms @14,7456Mhz
timerreload = 0xff;
timerclock = 0x09;
break;
case 5: // 38.678ms
timerreload = 0xff;
timerclock = 0x0b;
break;
case 6: // 78.678ms ok (2)
timerreload = 0xff;
timerclock = 0x0c;
break;
case 7: // 154.214ms ok (3) perfect!!!!
timerreload = 0xff;
timerclock = 0x0d;
break;
case 8: // 310.214ms (4)not perfect
timerreload = 0xff;
timerclock = 0x0e;
break;
default:
timerreload = 0xff;
timerclock = 0x0d;
break;
}
}
//--------------------------------------
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;
}
//--------------------------------------------------
发表时间:2004年5月25日17:02:53