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

* 55322: mifare 读写程序

   yejianguocom 
yejianguocom发表的帖子 

 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

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:请问上面这个程序在处理字符串收发时会不会有什么问题?
[下一篇帖子]:mifare 读写程序//--------------------------------