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

📄 iso14443a.lst

📁 RC500可用的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 295   1          MfComData.MfCommand = PCD_LOADKEY;
 296   1          MfComData.MfLength  = 12;
 297   1          memcpy(&MfComData.MfData[0], pKeys, 12);    
 298   1      
 299   1          status = PcdComTransceive(pi);
 300   1      
 301   1          return status;
 302   1      }
 303          
C51 COMPILER V7.06   ISO14443A                                                             05/01/2009 01:52:11 PAGE 6   

 304          /////////////////////////////////////////////////////////////////////
 305          //功能:用存放RC500的FIFO中的密钥和卡上的密钥进行验证
 306          //input:auth_mode=验证方式,0x60:验证A密钥,0x61:验证B密钥
 307          //      block=要验证的绝对块号
 308          //      g_cSNR=序列号首地址
 309          /////////////////////////////////////////////////////////////////////
 310          char PcdAuthState(unsigned char auth_mode,unsigned char block,unsigned char *pSnr)
 311          {
 312   1          char status;
 313   1          struct TranSciveBuffer MfComData;
 314   1          struct TranSciveBuffer *pi;
 315   1          pi = &MfComData;
 316   1      
 317   1          WriteRawRC(RegChannelRedundancy,0x0F);
 318   1          PcdSetTmo(4);
 319   1          MfComData.MfCommand = PCD_AUTHENT1;
 320   1          MfComData.MfLength  = 6;
 321   1          MfComData.MfData[0] = auth_mode;
 322   1          MfComData.MfData[1] = block;
 323   1          memcpy(&MfComData.MfData[2], pSnr, 4);    
 324   1            
 325   1          status = PcdComTransceive(pi);
 326   1          if (status == MI_OK)
 327   1          {
 328   2              if (ReadRawRC(RegSecondaryStatus) & 0x07) 
 329   2              {   status = MI_BITCOUNTERR;    }
 330   2              else
 331   2              {
 332   3                   MfComData.MfCommand = PCD_AUTHENT2;
 333   3                   MfComData.MfLength  = 0;
 334   3                   status = PcdComTransceive(pi);
 335   3                   if (status == MI_OK)
 336   3                   {
 337   4                       if (ReadRawRC(RegControl) & 0x08)
 338   4                       {   status = MI_OK;   }
 339   4                       else
 340   4                       {   status = MI_AUTHERR;   }
 341   4                      
 342   4                   }
 343   3               }
 344   2          }
 345   1          return status;
 346   1      }
 347          
 348          /////////////////////////////////////////////////////////////////////
 349          //读mifare_one卡上一块(block)数据(16字节)
 350          //input: addr = 要读的绝对块号
 351          //output:readdata = 读出的数据
 352          /////////////////////////////////////////////////////////////////////
 353          char PcdRead(unsigned char addr,unsigned char *pReaddata)
 354          {
 355   1          char status;
 356   1          struct TranSciveBuffer MfComData;
 357   1          struct TranSciveBuffer *pi;
 358   1          pi = &MfComData;
 359   1      
 360   1          PcdSetTmo(4);
 361   1          WriteRawRC(RegChannelRedundancy,0x0F);
 362   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 363   1          MfComData.MfLength  = 2;
 364   1          MfComData.MfData[0] = PICC_READ;
 365   1          MfComData.MfData[1] = addr;
C51 COMPILER V7.06   ISO14443A                                                             05/01/2009 01:52:11 PAGE 7   

 366   1      
 367   1          status = PcdComTransceive(pi);
 368   1          if (status == MI_OK)
 369   1          {
 370   2              if (MfComData.MfLength != 0x80)
 371   2              {   status = MI_BITCOUNTERR;   }
 372   2              else
 373   2              {   memcpy(pReaddata, &MfComData.MfData[0], 16);  }
 374   2          }
 375   1          return status;
 376   1      }
 377          
 378          /////////////////////////////////////////////////////////////////////
 379          //写数据到卡上的一块
 380          //input:adde=要写的绝对块号
 381          //      writedata=写入数据
 382          /////////////////////////////////////////////////////////////////////
 383          char PcdWrite(unsigned char addr,unsigned char *pWritedata)
 384          {
 385   1          char status;
 386   1          struct TranSciveBuffer MfComData;
 387   1          struct TranSciveBuffer *pi;
 388   1          pi = &MfComData;
 389   1          
 390   1          PcdSetTmo(5);
 391   1          WriteRawRC(RegChannelRedundancy,0x07); 
 392   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 393   1          MfComData.MfLength  = 2;
 394   1          MfComData.MfData[0] = PICC_WRITE;
 395   1          MfComData.MfData[1] = addr;
 396   1      
 397   1          status = PcdComTransceive(pi);
 398   1          if (status != MI_NOTAGERR)
 399   1          {
 400   2              if(MfComData.MfLength != 4)
 401   2              {   status=MI_BITCOUNTERR;   }
 402   2              else
 403   2              {
 404   3                 MfComData.MfData[0] &= 0x0F;
 405   3                 switch (MfComData.MfData[0])
 406   3                 {
 407   4                    case 0x00:
 408   4                       status = MI_NOTAUTHERR;
 409   4                       break;
 410   4                    case 0x0A:
 411   4                       status = MI_OK;
 412   4                       break;
 413   4                    default:
 414   4                       status = MI_CODEERR;
 415   4                       break;
 416   4                 }
 417   3              }
 418   2          }
 419   1          if (status == MI_OK)
 420   1          {
 421   2              PcdSetTmo(5);
 422   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 423   2              MfComData.MfLength  = 16;
 424   2              memcpy(&MfComData.MfData[0], pWritedata, 16);
 425   2              
 426   2              status = PcdComTransceive(pi);
 427   2              if (status != MI_NOTAGERR)
C51 COMPILER V7.06   ISO14443A                                                             05/01/2009 01:52:11 PAGE 8   

 428   2              {
 429   3                  MfComData.MfData[0] &= 0x0F;
 430   3                  switch(MfComData.MfData[0])
 431   3                  {
 432   4                     case 0x00:
 433   4                        status = MI_WRITEERR;
 434   4                        break;
 435   4                     case 0x0A:
 436   4                        status = MI_OK;
 437   4                        break;
 438   4                     default:
 439   4                        status = MI_CODEERR;
 440   4                        break;
 441   4                 }
 442   3              }
 443   2              PcdSetTmo(4);
 444   2          }
 445   1          return status;
 446   1      }
 447          
 448          
 449          /////////////////////////////////////////////////////////////////////
 450          //扣款和充值
 451          //input:dd_mode=命令字,0xC0:扣款,0xC1:充值
 452          //      addr=钱包的绝对块号
 453          //      value=4字节增(减)值首地址,16进制数,低位在前
 454          /////////////////////////////////////////////////////////////////////
 455          char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
 456          {
 457   1          char status;
 458   1          struct TranSciveBuffer MfComData;
 459   1          struct TranSciveBuffer *pi;
 460   1          pi = &MfComData;                                                                                                              
 461   1      
 462   1          PcdSetTmo(5);
 463   1      //      WriteRawRC(RegCRCPresetLSB,0x63);
 464   1      //      WriteRawRC(RegCwConductance,0x3F);
 465   1          WriteRawRC(RegChannelRedundancy,0x0F);
 466   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 467   1          MfComData.MfLength  = 2;
 468   1          MfComData.MfData[0] = dd_mode;
 469   1          MfComData.MfData[1] = addr;
 470   1      
 471   1          status = PcdComTransceive(pi);
 472   1          if (status != MI_NOTAGERR)
 473   1          {
 474   2              if (MfComData.MfLength != 4)                                                                                                            
 475   2             {   status = 0x21;   } //{   status = MI_BITCOUNTERR;   }
 476   2              else
 477   2              {
 478   3                 MfComData.MfData[0] &= 0x0F;
 479   3                 switch (MfComData.MfData[0])
 480   3                 {
 481   4                    case 0x00:
 482   4                       status = 0x22;//status = MI_NOTAUTHERR;
 483   4                       break;
 484   4                    case 0x0A:
 485   4                       status = MI_OK;
 486   4                       break;
 487   4                    case 0x01:
 488   4                       status = 0x23;//status = MI_VALERR;
 489   4                       break;
C51 COMPILER V7.06   ISO14443A                                                             05/01/2009 01:52:11 PAGE 9   

 490   4                    default:
 491   4                      status = 0x24; //status = MI_CODEERR;
 492   4                       break;
 493   4                 }
 494   3              }
 495   2           }
 496   1           if (status == MI_OK)
 497   1           {
 498   2              PcdSetTmo(5);
 499   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 500   2              MfComData.MfLength  = 4;
 501   2              pi = &MfComData;
 502   2              memcpy(&MfComData.MfData[0], pValue, 4);
 503   2      
 504   2              status = PcdComTransceive(pi);
 505   2              if (status==MI_OK)
 506   2              {
 507   3                 if (MfComData.MfLength != 4)
 508   3                {   status = 0x25;   }// {   status = MI_BITCOUNTERR;   }
 509   3                 else
 510   3                 {   status = MI_OK;            }
 511   3              }
 512   2              else if(status == MI_NOTAGERR)
 513   2              {   status = MI_OK;    }
 514   2              else
 515   2             {   status=0x26;     }// {   status=MI_COM_ERR;     }
 516   2           }
 517   1           
 518   1           if (status == MI_OK)
 519   1           {
 520   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 521   2              MfComData.MfLength  = 2;
 522   2              MfComData.MfData[0] = PICC_TRANSFER;
 523   2              MfComData.MfData[1] = addr;
 524   2              
 525   2              status = PcdComTransceive(pi);
 526   2              if (status != MI_NOTAGERR)
 527   2              {
 528   3                  if (MfComData.MfLength != 4)
 529   3                  {   status = MI_BITCOUNTERR;    }
 530   3                  else
 531   3                  {
 532   4                     MfComData.MfData[0] &= 0x0F;
 533   4                     switch(MfComData.MfData[0])
 534   4                     {
 535   5                        case 0x00:
 536   5                          status = 0x27; //status = MI_NOTAUTHERR;
 537   5                           break;
 538   5                        case 0x0a:
 539   5                           status = MI_OK;
 540   5                           break;
 541   5                        case 0x01:
 542   5                          status = 0x28;// status = MI_VALERR;
 543   5                           break;
 544   5                        default:
 545   5                          status = 0x29; //status = MI_CODEERR;
 546   5                           break;
 547   5                     }
 548   4                  }
 549   3              }
 550   2           }
 551   1           return status;
C51 COMPILER V7.06   ISO14443A                                                             05/01/2009 01:52:11 PAGE 10  

 552   1      }
 553          
 554          /////////////////////////////////////////////////////////////////////
 555          //命令卡进入休眠状态
 556          /////////////////////////////////////////////////////////////////////
 557          char PcdHalt()
 558          {
 559   1          char status = MI_OK;
 560   1          struct TranSciveBuffer MfComData;
 561   1          struct TranSciveBuffer *pi;
 562   1          pi = &MfComData;
 563   1      
 564   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 565   1          MfComData.MfLength  = 2;
 566   1          MfComData.MfData[0] = PICC_HALT;
 567   1          MfComData.MfData[1] = 0;
 568   1      
 569   1          status = PcdComTransceive(pi);
 570   1          if (status)
 571   1          {
 572   2              if (status==MI_NOTAGERR || status==MI_ACCESSTIMEOUT)
 573   2              status = MI_OK;
 574   2          }
 575   1          WriteRawRC(RegCommand,PCD_IDLE);
 576   1          return status;
 577   1      }
 578          
 579          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1677    ----
   CONSTANT SIZE    =      5    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----     760
   IDATA SIZE       =   ----      17
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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