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

📄 mf_rc500.lst

📁 RC500 Mifare Chip for 8051 code
💻 LST
📖 第 1 页 / 共 4 页
字号:
                      MInfo.nBytesToSend   = 2;
                      status = RC_Command(PCD_TRANSCEIVE,
                                          SerBuffer,
                                          &MInfo);
                      
                      if (status != MI_NOTAGERR)  
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 12  

                      {
                          if (MInfo.nBitsReceived != 4)
                          {
                             status = MI_BITCOUNTERR;
                          }
                          else                   
                          {
                             SerBuffer[0] &= 0x0f; 
                             switch(SerBuffer[0])
                             {
                                case 0x00: 
                                   status = MI_NOTAUTHERR;
                                   break;
                                case 0x0a:
                                   status = MI_OK;
                                   break;
                                case 0x01:
                                   status = MI_VALERR;
                                   break;
                                default:
                                   status = MI_CODEERR;
                                   break;
                             }
                          }
                      }        
                   }
                 return status;
              }
              
              #endif
 706          
 707          char MF_ChgAvailableKey(  unsigned char *uncoded, 
 708                               unsigned char *coded)   
 709          {
 710   1         char idata status = MI_OK;
 711   1         unsigned char idata cnt = 0;
 712   1         unsigned char idata ln  = 0;     
 713   1         unsigned char idata hn  = 0;      
 714   1         for (cnt = 0; cnt < 6; cnt++)
 715   1         {
 716   2            ln = uncoded[cnt] & 0x0F;
 717   2            hn = uncoded[cnt] >> 4;
 718   2            coded[cnt * 2 + 1] = (~ln << 4) | ln;
 719   2            coded[cnt * 2 ] = (~hn << 4) | hn;
 720   2      
 721   2         }
 722   1         return MI_OK;
 723   1      }
 724          
 725          char MF_AuthKey(  unsigned char auth_mode,unsigned char *snr,unsigned char *keys,unsigned char block)     
             - 
 726          {
 727   1         char idata status = MI_OK;
 728   1         RC_FlushFIFO();   
 729   1         ResetInfo(MInfo);
 730   1         MF_ChgAvailableKey(keys,SerBuffer);
 731   1         MInfo.nBytesToSend = 12;
 732   1         if ((status=RC_Command(PCD_LOADKEY,SerBuffer,&MInfo)) == MI_OK)
 733   1         {      
 734   2            status = MF_AuthState(auth_mode,snr,block); 
 735   2         }
 736   1         return status;
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 13  

 737   1      }
 738          
 739          char MF_AuthState( unsigned char auth_mode,
 740                                  unsigned char *snr,
 741                                  unsigned char block)
 742          {
 743   1         char idata status = MI_OK;
 744   1         unsigned char idata i = 0;
 745   1         
 746   1         status = RC_ReadRC(RegErrorFlag);                                     
 747   1         if (status != MI_OK)
 748   1         {
 749   2            if (status & 0x40)           
 750   2               status = MI_KEYERR;
 751   2            else
 752   2               status = MI_AUTHERR;    
 753   2         }
 754   1         else
 755   1         {
 756   2            SerBuffer[0] = auth_mode;    
 757   2      
 758   2            SerBuffer[1] = block;  
 759   2            memcpy(SerBuffer + 2,snr,4); 
 760   2            ResetInfo(MInfo);
 761   2            MInfo.nBytesToSend = 6;
 762   2            if ((status = RC_Command(PCD_AUTHENT1,
 763   2                                     SerBuffer,
 764   2                                     &MInfo)) == MI_OK)
 765   2            {
 766   3               if (RC_ReadRC(RegSecondaryStatus) & 0x07) 
 767   3               {
 768   4                  status = MI_BITCOUNTERR;
 769   4               }
 770   3               else
 771   3               {
 772   4                  ResetInfo(MInfo);
 773   4                  MInfo.nBytesToSend = 0;
 774   4                  if ((status = RC_Command(PCD_AUTHENT2,
 775   4                                           SerBuffer,
 776   4                                           &MInfo)) == MI_OK) 
 777   4                  {
 778   5                     if ( RC_ReadRC(RegControl) & 0x08 ) 
 779   5                     {
 780   6                         status = MI_OK;
 781   6                     }
 782   5                     else
 783   5                     {
 784   6                         status = MI_AUTHERR;
 785   6                     }
 786   5                  }
 787   4               }
 788   3            }
 789   2         }
 790   1         return status;
 791   1      }
 792          char MF_ReadCard(  unsigned char addr,
 793                            unsigned char *_data)
 794          {
 795   1         char idata status = MI_OK;
 796   1         char idata tmp    = 0;
 797   1      
 798   1         RC_FlushFIFO();    
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 14  

 799   1      
 800   1         RC_SetTmod(tmod_6ms);  
 801   1         RC_WriteRC(RegChannelRedundancy,0x0F);
 802   1         ResetInfo(MInfo);   
 803   1         SerBuffer[0] = PICC_READ;   
 804   1         SerBuffer[1] = addr;
 805   1         MInfo.nBytesToSend   = 2;   
 806   1         status = RC_Command(PCD_TRANSCEIVE,
 807   1                             SerBuffer,
 808   1                             &MInfo);
 809   1      
 810   1         if (status != MI_OK)
 811   1         {
 812   2            if (status != MI_NOTAGERR ) 
 813   2            {
 814   3               if (MInfo.nBitsReceived == 4)  
 815   3               {
 816   4                   SerBuffer[0] &= 0x0f;  
 817   4                   if ((SerBuffer[0] & 0x0a) == 0)
 818   4                   {
 819   5                      status = MI_NOTAUTHERR;
 820   5                   }
 821   4                   else
 822   4                   {
 823   5                      status = MI_CODEERR;
 824   5                   }
 825   4                }
 826   3            }
 827   2            memcpy(_data,"0000000000000000",16); 
 828   2         }
 829   1         else   // Response Processing
 830   1         {
 831   2            if (MInfo.nBytesReceived != 16)
 832   2            {
 833   3               status = MI_BYTECOUNTERR;
 834   3               memcpy(_data,"0000000000000000",16);
 835   3            }
 836   2            else
 837   2            {
 838   3               memcpy(_data,SerBuffer,16);
 839   3            }
 840   2         }
 841   1         RC_SetTmod(tmod_1ms);             
 842   1         return status; 
 843   1      }
 844          
 845          
 846          char MF_WriteCard( unsigned char addr,
 847                            unsigned char *_data)
 848          {
 849   1         char idata status = MI_OK;
 850   1           ResetInfo(MInfo);   
 851   1           SerBuffer[0] = PICC_WRITE; 
 852   1           SerBuffer[1] = addr;            
 853   1           MInfo.nBytesToSend   = 2;
 854   1           status = RC_Command(PCD_TRANSCEIVE,
 855   1                               SerBuffer,
 856   1                               &MInfo);
 857   1      
 858   1           if (status != MI_NOTAGERR)   
 859   1           {
 860   2              if (MInfo.nBitsReceived != 4)  
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 15  

 861   2              {
 862   3                 status = MI_BITCOUNTERR;
 863   3              }
 864   2              else                     
 865   2              {
 866   3                 SerBuffer[0] &= 0x0f; 
 867   3                 if ((SerBuffer[0] & 0x0a) == 0)
 868   3                 {
 869   4                    status = MI_NOTAUTHERR;                   
 870   4                 }
 871   3                 else
 872   3                 {
 873   4                    if (SerBuffer[0] == 0x0a)
 874   4                    {
 875   5                       status = MI_OK;
 876   5                    }
 877   4                    else 
 878   4                    {
 879   5                       status = MI_CODEERR;
 880   5                    }
 881   4                 }
 882   3              }
 883   2           }
 884   1      
 885   1           if ( status == MI_OK)
 886   1           {
 887   2      
 888   2              RC_SetTmod(tmod_6ms);    
 889   2      
 890   2              ResetInfo(MInfo);   
 891   2              memcpy(SerBuffer,_data,16);
 892   2              MInfo.nBytesToSend   = 16;
 893   2              status = RC_Command(PCD_TRANSCEIVE,
 894   2                                  SerBuffer,
 895   2                                  &MInfo);
 896   2              
 897   2              if (status & 0x80)   
 898   2              {
 899   3                 status = MI_NOTAGERR;
 900   3              }
 901   2              else
 902   2              {
 903   3               
 904   3                 if (MInfo.nBitsReceived != 4) 
 905   3                 {
 906   4                    status = MI_BITCOUNTERR;
 907   4                 }
 908   3                 else                  
 909   3                 {
 910   4                    SerBuffer[0] &= 0x0f; 
 911   4                    if ((SerBuffer[0] & 0x0a) == 0)
 912   4                    {
 913   5                       status = MI_WRITEERR;
 914   5                    }
 915   4                    else
 916   4                    {
 917   5                       if (SerBuffer[0] == 0x0a)
 918   5                       {
 919   6                          status = MI_OK;
 920   6                       }
 921   5                       else 
 922   5                       {
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 16  

 923   6                          status = MI_CODEERR;
 924   6                       }
 925   5                    }     
 926   4                 }
 927   3              }        
 928   2              RC_SetTmod(tmod_1ms);  
 929   2           }
 930   1        return status;
 931   1      }
 932          
 933          void MF_RfReset(unsigned char ms)
 934          {
 935   1         if(ms)
 936   1         {
 937   2           RC_ClearBit(RegTxControl,0x03); 
 938   2           delay_1ms(4);                
 939   2           RC_SetBit(RegTxControl,0x03); 
 940   2         }
 941   1        else
 942   1           RC_ClearBit(RegTxControl,0x03);  
 943   1      }
 944          
 945          void delay_50us(unsigned char _50us)
 946          {
 947   1              while(_50us--)
 948   1              {
 949   2              WDG=!WDG;
 950   2              _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 951   2              _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 952   2              _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 953   2              }
 954   1      }
 955          void delay_1ms(uchar _1ms)
 956          {
 957   1        while (_1ms--)
 958   1        {     
 959   2              WDG=!WDG;
 960   2              delay_50us(25);
 961   2        }
 962   1      }
 963          
 964          void delay_10ms(uchar _10ms)
 965          {              
 966   1                  while (_10ms--)
 967   1                  {
 968   2                              WDG=!WDG;
 969   2                           delay_1ms(10);
 970   2                  }
 971   1      }
 972          
 973          //RC500 operation interrupt server rount
 974          void RC_Interrupt(void) interrupt 0 using 1    
 975          {
 976   1         static unsigned char idata irqBits;
 977   1         static unsigned char idata irqMask;            
 978   1         static unsigned char idata nbytes;
 979   1         static unsigned char idata cnt;
 980   1              
 981   1         IE0 = 0;     
 982   1         RC_WriteRawData(0,0x80);
 983   1         if (MpIsrInfo && MpIsrOut)                                          
 984   1         {
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 17  

 985   2            while( RC_ReadRawData(RegPrimaryStatus) & 0x08) 
 986   2            {
 987   3               irqMask = RC_ReadRawData(RegInterruptEn);
 988   3               irqBits = RC_ReadRawData(RegInterruptRq) & irqMask;
 989   3               MpIsrInfo->irqSource |= irqBits; 
 990   3               if (irqBits & 0x01)   
 991   3               {  
 992   4                  nbytes = 64 - RC_ReadRawData(RegFIFOLength);
 993   4                  if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <= nbytes)
 994   4                  {
 995   5                     nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
 996   5                     RC_WriteRawData(RegInterruptEn,0x01);
 997   5                  }
 998   4                  for ( cnt = 0;cnt < nbytes;cnt++)
 999   4                  {
1000   5                     RC_WriteRawData(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]);
1001   5                     MpIsrInfo->nBytesSent++;
1002   5                  }
1003   4                  RC_WriteRawData(RegInterruptRq,0x01);  
1004   4               }      
1005   3               if (irqBits & 0x10)    

⌨️ 快捷键说明

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