⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc522.lst

📁 详细介绍射频卡设计方法及其使用方法的介绍
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   RC522                                                                 12/15/2005 16:36:52 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE RC522
OBJECT MODULE PLACED IN RC522.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RC522.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <intrins.h>
   2          #include "lpcreg.h"
   3          #include "main.h"
   4          #include "mfrc522.h"
   5          #define MAXRLEN 18
   6                                        
   7          /////////////////////////////////////////////////////////////////////
   8          //功    能:寻卡
   9          //参数说明: req_code[IN]:寻卡方式
  10          //                0x52 = 寻感应区内所有符合14443A标准的卡
  11          //                0x26 = 寻未进入休眠状态的卡
  12          //          pTagType[OUT]:卡片类型代码
  13          //                0x4400 = Mifare_UltraLight
  14          //                0x0400 = Mifare_One(S50)
  15          //                0x0200 = Mifare_One(S70)
  16          //                0x0800 = Mifare_Pro(X)
  17          //                0x4403 = Mifare_DESFire
  18          //返    回: 成功返回MI_OK
  19          /////////////////////////////////////////////////////////////////////
  20          char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  21          {
  22   1         char status;  
  23   1         unsigned int  unLen;
  24   1         unsigned char ucComMF522Buf[MAXRLEN]; 
  25   1      
  26   1         ClearBitMask(Status2Reg,0x08);
  27   1         WriteRawRC(BitFramingReg,0x07);
  28   1         SetBitMask(TxControlReg,0x03);
  29   1       
  30   1         ucComMF522Buf[0] = req_code;
  31   1      
  32   1         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  33   1         
  34   1         if ((status == MI_OK) && (unLen == 0x10))
  35   1         {    
  36   2             *pTagType     = ucComMF522Buf[0];
  37   2             *(pTagType+1) = ucComMF522Buf[1];
  38   2         }
  39   1         else
  40   1         {   status = MI_ERR;   }
  41   1         
  42   1         return status;
  43   1      }
  44          
  45          /////////////////////////////////////////////////////////////////////
  46          //功    能:防冲撞
  47          //参数说明: pSnr[OUT]:卡片序列号,4字节
  48          //返    回: 成功返回MI_OK
  49          /////////////////////////////////////////////////////////////////////  
  50          char PcdAnticoll(unsigned char *pSnr)
  51          {
  52   1          char status;
  53   1          unsigned char i,snr_check=0;
  54   1          unsigned int  unLen;
  55   1          unsigned char ucComMF522Buf[MAXRLEN]; 
C51 COMPILER V7.20   RC522                                                                 12/15/2005 16:36:52 PAGE 2   

  56   1          
  57   1      
  58   1          ClearBitMask(Status2Reg,0x08);
  59   1          WriteRawRC(BitFramingReg,0x00);
  60   1          ClearBitMask(CollReg,0x80);
  61   1       
  62   1          ucComMF522Buf[0] = PICC_ANTICOLL1;
  63   1          ucComMF522Buf[1] = 0x20;
  64   1      
  65   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
  66   1      
  67   1          if (status == MI_OK)
  68   1          {
  69   2               for (i=0; i<4; i++)
  70   2               {   
  71   3                   *(pSnr+i)  = ucComMF522Buf[i];
  72   3                   snr_check ^= ucComMF522Buf[i];
  73   3               }
  74   2               if (snr_check != ucComMF522Buf[i])
  75   2               {   status = MI_ERR;    }
  76   2          }
  77   1          
  78   1          SetBitMask(CollReg,0x80);
  79   1          return status;
  80   1      }
  81          
  82          /////////////////////////////////////////////////////////////////////
  83          //功    能:选定卡片
  84          //参数说明: pSnr[IN]:卡片序列号,4字节
  85          //返    回: 成功返回MI_OK
  86          /////////////////////////////////////////////////////////////////////
  87          char PcdSelect(unsigned char *pSnr)
  88          {
  89   1          char status;
  90   1          unsigned char i;
  91   1          unsigned int  unLen;
  92   1          unsigned char ucComMF522Buf[MAXRLEN]; 
  93   1          
  94   1          ucComMF522Buf[0] = PICC_ANTICOLL1;
  95   1          ucComMF522Buf[1] = 0x70;
  96   1          ucComMF522Buf[6] = 0;
  97   1          for (i=0; i<4; i++)
  98   1          {
  99   2              ucComMF522Buf[i+2] = *(pSnr+i);
 100   2              ucComMF522Buf[6]  ^= *(pSnr+i);
 101   2          }
 102   1          CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
 103   1        
 104   1          ClearBitMask(Status2Reg,0x08);
 105   1      
 106   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
 107   1          
 108   1          if ((status == MI_OK) && (unLen == 0x18))
 109   1          {   status = MI_OK;  }
 110   1          else
 111   1          {   status = MI_ERR;    }
 112   1      
 113   1          return status;
 114   1      }
 115          
 116          /////////////////////////////////////////////////////////////////////
 117          //功    能:验证卡片密码
C51 COMPILER V7.20   RC522                                                                 12/15/2005 16:36:52 PAGE 3   

 118          //参数说明: auth_mode[IN]: 密码验证模式
 119          //                 0x60 = 验证A密钥
 120          //                 0x61 = 验证B密钥 
 121          //          addr[IN]:块地址
 122          //          pKey[IN]:密码
 123          //          pSnr[IN]:卡片序列号,4字节
 124          //返    回: 成功返回MI_OK
 125          /////////////////////////////////////////////////////////////////////               
 126          char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
 127          {
 128   1          char status;
 129   1          unsigned int  unLen;
 130   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 131   1      
 132   1          ucComMF522Buf[0] = auth_mode;
 133   1          ucComMF522Buf[1] = addr;
 134   1          for (i=0; i<6; i++)
 135   1          {    ucComMF522Buf[i+2] = *(pKey+i);   }
 136   1          for (i=0; i<6; i++)
 137   1          {    ucComMF522Buf[i+8] = *(pSnr+i);   }
 138   1       //   memcpy(&ucComMF522Buf[2], pKey, 6); 
 139   1       //   memcpy(&ucComMF522Buf[8], pSnr, 4); 
 140   1          
 141   1          status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
 142   1          if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
 143   1          {   status = MI_ERR;   }
 144   1          
 145   1          return status;
 146   1      }
 147          
 148          /////////////////////////////////////////////////////////////////////
 149          //功    能:读取M1卡一块数据
 150          //参数说明: addr[IN]:块地址
 151          //          pData[OUT]:读出的数据,16字节
 152          //返    回: 成功返回MI_OK
 153          ///////////////////////////////////////////////////////////////////// 
 154          char PcdRead(unsigned char addr,unsigned char *pData)
 155          {
 156   1          char status;
 157   1          unsigned int  unLen;
 158   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 159   1      
 160   1          ucComMF522Buf[0] = PICC_READ;
 161   1          ucComMF522Buf[1] = addr;
 162   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 163   1         
 164   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 165   1          if ((status == MI_OK) && (unLen == 0x90))
 166   1       //   {   memcpy(pData, ucComMF522Buf, 16);   }
 167   1          {
 168   2              for (i=0; i<16; i++)
 169   2              {    *(pData+i) = ucComMF522Buf[i];   }
 170   2          }
 171   1          else
 172   1          {   status = MI_ERR;   }
 173   1          
 174   1          return status;
 175   1      }
 176          
 177          /////////////////////////////////////////////////////////////////////
 178          //功    能:写数据到M1卡一块
 179          //参数说明: addr[IN]:块地址
C51 COMPILER V7.20   RC522                                                                 12/15/2005 16:36:52 PAGE 4   

 180          //          pData[IN]:写入的数据,16字节
 181          //返    回: 成功返回MI_OK
 182          /////////////////////////////////////////////////////////////////////                  
 183          char PcdWrite(unsigned char addr,unsigned char *pData)
 184          {
 185   1          char status;
 186   1          unsigned int  unLen;
 187   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 188   1          
 189   1          ucComMF522Buf[0] = PICC_WRITE;
 190   1          ucComMF522Buf[1] = addr;
 191   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 192   1       
 193   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 194   1      
 195   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 196   1          {   status = MI_ERR;   }
 197   1              
 198   1          if (status == MI_OK)
 199   1          {
 200   2              //memcpy(ucComMF522Buf, pData, 16);
 201   2              for (i=0; i<16; i++)
 202   2              {    ucComMF522Buf[i] = *(pData+i);   }
 203   2              CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
 204   2      
 205   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
 206   2              if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 207   2              {   status = MI_ERR;   }
 208   2          }
 209   1          
 210   1          return status;
 211   1      }
 212          
 213          /////////////////////////////////////////////////////////////////////
 214          //功    能:扣款和充值
 215          //参数说明: dd_mode[IN]:命令字
 216          //               0xC0 = 扣款
 217          //               0xC1 = 充值
 218          //          addr[IN]:钱包地址
 219          //          pValue[IN]:4字节增(减)值,低位在前
 220          //返    回: 成功返回MI_OK
 221          /////////////////////////////////////////////////////////////////////                 
 222          char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
 223          {
 224   1          char status;
 225   1          unsigned int  unLen;
 226   1          unsigned char i,ucComMF522Buf[MAXRLEN]; 
 227   1          
 228   1          ucComMF522Buf[0] = dd_mode;
 229   1          ucComMF522Buf[1] = addr;
 230   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 231   1       
 232   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 233   1      
 234   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 235   1          {   status = MI_ERR;   }
 236   1              
 237   1          if (status == MI_OK)
 238   1          {
 239   2             // memcpy(ucComMF522Buf, pValue, 4);
 240   2              for (i=0; i<16; i++)
 241   2              {    ucComMF522Buf[i] = *(pValue+i);   }
C51 COMPILER V7.20   RC522                                                                 12/15/2005 16:36:52 PAGE 5   

 242   2              CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
 243   2              unLen = 0;
 244   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
 245   2              if (status != MI_ERR)
 246   2              {    status = MI_OK;    }
 247   2          }
 248   1          
 249   1          if (status == MI_OK)
 250   1          {
 251   2              ucComMF522Buf[0] = PICC_TRANSFER;
 252   2              ucComMF522Buf[1] = addr;
 253   2              CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); 
 254   2         
 255   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 256   2      
 257   2              if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 258   2              {   status = MI_ERR;   }
 259   2          }
 260   1          return status;
 261   1      }
 262          
 263          /////////////////////////////////////////////////////////////////////
 264          //功    能:备份钱包
 265          //参数说明: sourceaddr[IN]:源地址
 266          //          goaladdr[IN]:目标地址
 267          //返    回: 成功返回MI_OK
 268          /////////////////////////////////////////////////////////////////////
 269          char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
 270          {
 271   1          char status;
 272   1          unsigned int  unLen;
 273   1          unsigned char ucComMF522Buf[MAXRLEN]; 
 274   1      
 275   1          ucComMF522Buf[0] = PICC_RESTORE;
 276   1          ucComMF522Buf[1] = sourceaddr;
 277   1          CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 278   1       
 279   1          status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
 280   1      
 281   1          if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
 282   1          {   status = MI_ERR;   }
 283   1          
 284   1          if (status == MI_OK)
 285   1          {
 286   2              ucComMF522Buf[0] = 0;
 287   2              ucComMF522Buf[1] = 0;
 288   2              ucComMF522Buf[2] = 0;
 289   2              ucComMF522Buf[3] = 0;
 290   2              CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
 291   2       
 292   2              status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
 293   2              if (status != MI_ERR)
 294   2              {    status = MI_OK;    }
 295   2          }
 296   1          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -