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

📄 iso14443a.lst

📁 读ISO14443 CPU卡源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 270   1          MfComData.MfData[1] = block;
 271   1          memcpy(&MfComData.MfData[2], pSnr, 4);    
 272   1            
 273   1          status = PcdComTransceive(pi);
 274   1          if (status == MI_OK)
 275   1          {
 276   2              if (ReadRawRC(RegSecondaryStatus) & 0x07) 
 277   2              {   status = MI_BITCOUNTERR;    }
 278   2              else
 279   2              {
 280   3                   MfComData.MfCommand = PCD_AUTHENT2;
 281   3                   MfComData.MfLength  = 0;
 282   3                   status = PcdComTransceive(pi);
 283   3                   if (status == MI_OK)
 284   3                   {
 285   4                       if (ReadRawRC(RegControl) & 0x08)
 286   4                       {   status = MI_OK;   }
 287   4                       else
 288   4                       {   status = MI_AUTHERR;   }
 289   4                      
 290   4                   }
 291   3               }
 292   2          }
 293   1          return status;
 294   1      }
 295          
 296          /////////////////////////////////////////////////////////////////////
 297          //读mifare_one卡上一块(block)数据(16字节)
 298          //input: addr = 要读的绝对块号
 299          //output:readdata = 读出的数据
 300          /////////////////////////////////////////////////////////////////////
 301          char PcdRead(unsigned char addr,unsigned char *pReaddata)
 302          {
 303   1          char status;
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 6   

 304   1          struct TranSciveBuffer MfComData;
 305   1          struct TranSciveBuffer *pi;
 306   1          pi = &MfComData;
 307   1      
 308   1          PcdSetTmo(4);
 309   1          WriteRawRC(RegChannelRedundancy,0x0F);
 310   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 311   1          MfComData.MfLength  = 2;
 312   1          MfComData.MfData[0] = PICC_READ;
 313   1          MfComData.MfData[1] = addr;
 314   1      
 315   1          status = PcdComTransceive(pi);
 316   1          if (status == MI_OK)
 317   1          {
 318   2              if (MfComData.MfLength != 0x80)
 319   2              {   status = MI_BITCOUNTERR;   }
 320   2              else
 321   2              {   memcpy(pReaddata, &MfComData.MfData[0], 16);  }
 322   2          }
 323   1          return status;
 324   1      }
 325          
 326          /////////////////////////////////////////////////////////////////////
 327          //写数据到卡上的一块
 328          //input:adde=要写的绝对块号
 329          //      writedata=写入数据
 330          /////////////////////////////////////////////////////////////////////
 331          char PcdWrite(unsigned char addr,unsigned char *pWritedata)
 332          {
 333   1          char status;
 334   1          struct TranSciveBuffer MfComData;
 335   1          struct TranSciveBuffer *pi;
 336   1          pi = &MfComData;
 337   1          
 338   1          PcdSetTmo(5);
 339   1          WriteRawRC(RegChannelRedundancy,0x07); 
 340   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 341   1          MfComData.MfLength  = 2;
 342   1          MfComData.MfData[0] = PICC_WRITE;
 343   1          MfComData.MfData[1] = addr;
 344   1      
 345   1          status = PcdComTransceive(pi);
 346   1          if (status != MI_NOTAGERR)
 347   1          {
 348   2              if(MfComData.MfLength != 4)
 349   2              {   status=MI_BITCOUNTERR;   }
 350   2              else
 351   2              {
 352   3                 MfComData.MfData[0] &= 0x0F;
 353   3                 switch (MfComData.MfData[0])
 354   3                 {
 355   4                    case 0x00:
 356   4                       status = MI_NOTAUTHERR;
 357   4                       break;
 358   4                    case 0x0A:
 359   4                       status = MI_OK;
 360   4                       break;
 361   4                    default:
 362   4                       status = MI_CODEERR;
 363   4                       break;
 364   4                 }
 365   3              }
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 7   

 366   2          }
 367   1          if (status == MI_OK)
 368   1          {
 369   2              PcdSetTmo(5);
 370   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 371   2              MfComData.MfLength  = 16;
 372   2              memcpy(&MfComData.MfData[0], pWritedata, 16);
 373   2              
 374   2              status = PcdComTransceive(pi);
 375   2              if (status != MI_NOTAGERR)
 376   2              {
 377   3                  MfComData.MfData[0] &= 0x0F;
 378   3                  switch(MfComData.MfData[0])
 379   3                  {
 380   4                     case 0x00:
 381   4                        status = MI_WRITEERR;
 382   4                        break;
 383   4                     case 0x0A:
 384   4                        status = MI_OK;
 385   4                        break;
 386   4                     default:
 387   4                        status = MI_CODEERR;
 388   4                        break;
 389   4                 }
 390   3              }
 391   2              PcdSetTmo(4);
 392   2          }
 393   1          return status;
 394   1      }
 395          
 396          /////////////////////////////////////////////////////////////////////
 397          //扣款和充值
 398          //input:dd_mode=命令字,0xC0:扣款,0xC1:充值
 399          //      addr=钱包的绝对块号
 400          //      value=4字节增(减)值首地址,16进制数,低位在前
 401          /////////////////////////////////////////////////////////////////////
 402          char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
 403          {
 404   1          char status;
 405   1          struct TranSciveBuffer MfComData;
 406   1          struct TranSciveBuffer *pi;
 407   1          pi = &MfComData;
 408   1      
 409   1          PcdSetTmo(5);
 410   1          WriteRawRC(RegChannelRedundancy,0x0F);
 411   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 412   1          MfComData.MfLength  = 2;
 413   1          MfComData.MfData[0] = dd_mode;
 414   1          MfComData.MfData[1] = addr;
 415   1      
 416   1          status = PcdComTransceive(pi);
 417   1          if (status != MI_NOTAGERR)
 418   1          {
 419   2              if (MfComData.MfLength != 4)
 420   2              {   status = MI_BITCOUNTERR;   }
 421   2              else
 422   2              {
 423   3                 MfComData.MfData[0] &= 0x0F;
 424   3                 switch (MfComData.MfData[0])
 425   3                 {
 426   4                    case 0x00:
 427   4                       status = MI_NOTAUTHERR;
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 8   

 428   4                       break;
 429   4                    case 0x0A:
 430   4                       status = MI_OK;
 431   4                       break;
 432   4                    case 0x01:
 433   4                       status = MI_VALERR;
 434   4                       break;
 435   4                    default:
 436   4                       status = MI_CODEERR;
 437   4                       break;
 438   4                 }
 439   3              }
 440   2           }
 441   1           if (status == MI_OK)
 442   1           {
 443   2              PcdSetTmo(5);
 444   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 445   2              MfComData.MfLength  = 4;
 446   2              pi = &MfComData;
 447   2              memcpy(&MfComData.MfData[0], pValue, 4);
 448   2      
 449   2              status = PcdComTransceive(pi);
 450   2              if (status==MI_OK)
 451   2              {
 452   3                 if (MfComData.MfLength != 4)
 453   3                 {   status = MI_BITCOUNTERR;   }
 454   3                 else
 455   3                 {   status = MI_OK;            }
 456   3              }
 457   2              else if(status == MI_NOTAGERR)
 458   2              {   status = MI_OK;    }
 459   2              else
 460   2              {   status=MI_COM_ERR;     }
 461   2           }
 462   1           
 463   1           if (status == MI_OK)
 464   1           {
 465   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 466   2              MfComData.MfLength  = 2;
 467   2              MfComData.MfData[0] = PICC_TRANSFER;
 468   2              MfComData.MfData[1] = addr;
 469   2              
 470   2              status = PcdComTransceive(pi);
 471   2              if (status != MI_NOTAGERR)
 472   2              {
 473   3                  if (MfComData.MfLength != 4)
 474   3                  {   status = MI_BITCOUNTERR;    }
 475   3                  else
 476   3                  {
 477   4                     MfComData.MfData[0] &= 0x0F;
 478   4                     switch(MfComData.MfData[0])
 479   4                     {
 480   5                        case 0x00:
 481   5                           status = MI_NOTAUTHERR;
 482   5                           break;
 483   5                        case 0x0a:
 484   5                           status = MI_OK;
 485   5                           break;
 486   5                        case 0x01:
 487   5                           status = MI_VALERR;
 488   5                           break;
 489   5                        default:
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 9   

 490   5                           status = MI_CODEERR;
 491   5                           break;
 492   5                     }
 493   4                  }
 494   3              }
 495   2           }
 496   1           return status;
 497   1      }
 498          
 499          /////////////////////////////////////////////////////////////////////
 500          //将mifare_one卡一块数据调入卡缓冲区
 501          //input:addr=绝对块号
 502          /////////////////////////////////////////////////////////////////////
 503          char PcdRestore(unsigned char addr)
 504          {
 505   1          char status;
 506   1          struct TranSciveBuffer MfComData;
 507   1          struct TranSciveBuffer *pi;
 508   1          pi = &MfComData;
 509   1      
 510   1          PcdSetTmo(4);
 511   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 512   1          MfComData.MfLength  = 2;
 513   1          MfComData.MfData[0] = PICC_RESTORE;
 514   1          MfComData.MfData[1] = addr;
 515   1      
 516   1          status = PcdComTransceive(pi);
 517   1          if (status != MI_NOTAGERR)
 518   1          {
 519   2              if (MfComData.MfLength != 4)
 520   2              {   status = MI_BITCOUNTERR;   }
 521   2              else
 522   2              {
 523   3                 MfComData.MfData[0] &= 0x0F;
 524   3                 switch(MfComData.MfData[0])
 525   3                 {
 526   4                    case 0x00:
 527   4                       status = MI_NOTAUTHERR;
 528   4                       break;
 529   4                    case 0x0A:
 530   4                       status = MI_OK;
 531   4                       break;
 532   4                    case 0x01:
 533   4                       status = MI_VALERR;
 534   4                       break;
 535   4                    default:
 536   4                       status = MI_CODEERR;
 537   4                       break;
 538   4                 }
 539   3              }
 540   2           }
 541   1           if (status == MI_OK)
 542   1           {
 543   2              PcdSetTmo(4);
 544   2              MfComData.MfCommand = PCD_TRANSCEIVE;
 545   2              MfComData.MfLength  = 4;
 546   2              MfComData.MfData[0] = 0;
 547   2              MfComData.MfData[1] = 0;

⌨️ 快捷键说明

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