导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→mifare 读写程序[yejianguocom]

 *第22297篇: mifare 读写程序

  
楼 主:yejianguocom 2004年5月25日17:01
 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

  
2楼:yejianguocom 2004年5月25日17:02
 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;
}
//--------------------------------------------------


>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:一个按键的多次击键不同意义用汇编怎么编?

[下一篇主题]:真诚的希望我能帮到您!!!