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

📄 m500auc.lst

📁 ID卡读卡程序,采用FM1702芯片,测试OK!
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.02a   M500AUC                                                              06/23/2006 09:38:38 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE M500AUC
OBJECT MODULE PLACED IN M500AuC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE M500AuC.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #define M500_GLOBALS
   2          
   3          #include <string.h>
   4          #include <stdio.h>
   5          #include <absacc.h>
   6          #include <intrins.h>
   7          
   8          #include "Mfreg500.h"
   9          #include "MfErrNo.h"
  10          #include "reg52.h"
  11          #include "M500AuC.h"
  12          
  13          #define GetRegPage(addr)    (0x70 | (addr>>3))
  14          #define nocard                      0
  15          #define mifare1                     1
  16          #define mifarepro                   2
  17          #define mifarelight                 3
  18          #define unknowncard                 4
  19          #define NO_TIMER2           1
  20          
  21          ///////////////////////////////////////////////////////////////////////
  22          // 往一个地址写一个数据
  23          ///////////////////////////////////////////////////////////////////////
  24          void WriteRawIO(unsigned char Address,unsigned char value)
  25          {
  26   1              XBYTE[Address]=value;
  27   1      }
  28          
  29          ///////////////////////////////////////////////////////////////////////
  30          // 从一个地址读出一个数据
  31          ///////////////////////////////////////////////////////////////////////
  32          unsigned char ReadRawIO(unsigned char Address)
  33          {
  34   1              return XBYTE[Address];
  35   1      }
  36          
  37          ///////////////////////////////////////////////////////////////////////
  38          // 往一个地址写一个数据(EEPROM)
  39          ///////////////////////////////////////////////////////////////////////
  40          void WriteIO(unsigned char Address, unsigned char value)
  41          {
  42   1          WriteRawIO(0x00,GetRegPage(Address));  
  43   1          WriteRawIO(Address,value);              
  44   1      }
  45          
  46          ///////////////////////////////////////////////////////////////////////
  47          // 从一个地址读出一个数据(EEPROM)
  48          ///////////////////////////////////////////////////////////////////////
  49          unsigned char ReadIO(unsigned char Address)
  50          {
  51   1         WriteRawIO(0x00,GetRegPage(Address));
  52   1         return ReadRawIO(Address);                    
  53   1      }  
  54          
  55          ///////////////////////////////////////////////////////////////////////
C51 COMPILER V7.02a   M500AUC                                                              06/23/2006 09:38:38 PAGE 2   

  56          // 设置定时时间
  57          ///////////////////////////////////////////////////////////////////////
  58          void M500PcdSetTmo(unsigned char tmoLength)
  59          {
  60   1          switch(tmoLength)
  61   1          {  
  62   2              case 1:                       
  63   2                  WriteIO(RegTimerClock,0x07); 
  64   2                  WriteIO(RegTimerReload,0x6a);
  65   2                  break;
  66   2              case 2:                       
  67   2                  WriteIO(RegTimerClock,0x07); 
  68   2                  WriteIO(RegTimerReload,0xa0);
  69   2                  break;
  70   2              case 3:  
  71   2                  WriteIO(RegTimerClock,0x09); 
  72   2                  WriteIO(RegTimerReload,0xa0);
  73   2                  break;
  74   2              case 4: 
  75   2                  WriteIO(RegTimerClock,0x09);
  76   2                  WriteIO(RegTimerReload,0xff);
  77   2                  break;
  78   2              case 5:  
  79   2                  WriteIO(RegTimerClock,0x0b); 
  80   2                  WriteIO(RegTimerReload,0xff);
  81   2                  break;
  82   2              case 6:                       
  83   2                  WriteIO(RegTimerClock,0x0d); 
  84   2                  WriteIO(RegTimerReload,0xff);
  85   2                  break;
  86   2              case 7:                      
  87   2                  WriteIO(RegTimerClock,0x0f); 
  88   2                  WriteIO(RegTimerReload,0xff);
  89   2                  break;
  90   2              default:                       
  91   2                  WriteIO(RegTimerClock,0x07); 
  92   2                  WriteIO(RegTimerReload,tmoLength);
  93   2                  break;
  94   2          }     
  95   1      }
  96          
  97          ///////////////////////////////////////////////////////////////////////
  98          // Request Command defined in ISO14443(Mifare)
  99          ///////////////////////////////////////////////////////////////////////
 100          char  M500PcdCmd(unsigned char cmd,
 101                         volatile unsigned char data *rcv,
 102                          MfCmdInfo idata *info)
 103          {
 104   1          char          idata status    = MI_OK;
 105   1          char          idata tmpStatus ;
 106   1          unsigned char idata lastBits;
 107   1          unsigned int  idata timecnt = 0;
 108   1          unsigned char idata irqEn = 0x00;
 109   1          unsigned char idata waitFor = 0x00;
 110   1          unsigned char idata timerCtl  = 0x00;
 111   1      
 112   1          WriteIO(RegInterruptEn,0x7F);
 113   1          WriteIO(RegInterruptRq,0x7F);
 114   1          WriteIO(RegCommand,PCD_IDLE); 
 115   1      
 116   1          FlushFIFO();     
 117   1          MpIsrInfo = info;  
C51 COMPILER V7.02a   M500AUC                                                              06/23/2006 09:38:38 PAGE 3   

 118   1          MpIsrOut = rcv;
 119   1          info->irqSource = 0x00;
 120   1          switch(cmd)
 121   1          {
 122   2              case PCD_IDLE:                
 123   2                  irqEn = 0x00;
 124   2                  waitFor = 0x00;
 125   2                  break;
 126   2              case PCD_WRITEE2:            
 127   2                  irqEn = 0x11;
 128   2                  waitFor = 0x10;
 129   2                  break;
 130   2              case PCD_READE2:     
 131   2                  irqEn = 0x07;
 132   2                  waitFor = 0x04;
 133   2                  break;
 134   2              case PCD_LOADCONFIG:  
 135   2              case PCD_LOADKEYE2:   
 136   2              case PCD_AUTHENT1:    
 137   2                  irqEn = 0x05;
 138   2                  waitFor = 0x04;
 139   2                  break;
 140   2              case PCD_CALCCRC:
 141   2                  irqEn = 0x11;
 142   2                  waitFor = 0x10;
 143   2                  break;
 144   2              case PCD_AUTHENT2: 
 145   2                  irqEn = 0x04;
 146   2                  waitFor = 0x04;
 147   2                  break;
 148   2              case PCD_RECEIVE:     
 149   2                  info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
 150   2                  irqEn = 0x06;
 151   2                  waitFor = 0x04;
 152   2                  break;
 153   2              case PCD_LOADKEY: 
 154   2                  irqEn = 0x05;
 155   2                  waitFor = 0x04;
 156   2                  break;
 157   2              case PCD_TRANSMIT: 
 158   2                  irqEn = 0x05;
 159   2                  waitFor = 0x04;
 160   2                  break;
 161   2              case PCD_TRANSCEIVE: 
 162   2                      info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
 163   2                  irqEn = 0x3D;
 164   2                  waitFor = 0x04;
 165   2                  break;
 166   2              default:
 167   2                  status = MI_UNKNOWN_COMMAND;
 168   2          }        
 169   1          if (status == MI_OK)
 170   1          {
 171   2              irqEn |= 0x20;                     
 172   2              waitFor |= 0x20;      
 173   2              timecnt=1000;
 174   2              WriteIO(RegInterruptEn,irqEn | 0x80); 
 175   2              WriteIO(RegCommand,cmd);     
 176   2              while (!(MpIsrInfo->irqSource & waitFor||!(timecnt--)));
 177   2              WriteIO(RegInterruptEn,0x7F);         
 178   2              WriteIO(RegInterruptRq,0x7F);          
 179   2              SetBitMask(RegControl,0x04);          
C51 COMPILER V7.02a   M500AUC                                                              06/23/2006 09:38:38 PAGE 4   

 180   2              WriteIO(RegCommand,PCD_IDLE);         
 181   2              if (!(MpIsrInfo->irqSource & waitFor))   
 182   2              {                               
 183   3                  status = MI_ACCESSTIMEOUT;
 184   3              }
 185   2              else
 186   2              {
 187   3                  status = MpIsrInfo->status;           
 188   3              }
 189   2              if (status == MI_OK)                    
 190   2              {
 191   3                  if (tmpStatus = (ReadIO(RegErrorFlag) & 0x17))
 192   3                  {
 193   4                      if (tmpStatus & 0x01)
 194   4                      {
 195   5                          info->collPos = ReadIO(RegCollPos);
 196   5                          status = MI_COLLERR;
 197   5                      }
 198   4                      else
 199   4                      {
 200   5                          info->collPos = 0;
 201   5                          if (tmpStatus & 0x02)  
 202   5                          {
 203   6                              status = MI_PARITYERR;
 204   6                          }
 205   5                      }
 206   4                      if (tmpStatus & 0x04)   
 207   4                      {
 208   5                          status = MI_FRAMINGERR;
 209   5                      }
 210   4                      if (tmpStatus & 0x10)   
 211   4                      {
 212   5                          FlushFIFO();
 213   5                          status = MI_OVFLERR;
 214   5                      }
 215   4                          if (tmpStatus & 0x08) 
 216   4                          {
 217   5                          status = MI_CRCERR;
 218   5                          }   
 219   4                      if (status == MI_OK)
 220   4                          status = MI_NY_IMPLEMENTED;
 221   4                  }
 222   3                  if (cmd == PCD_TRANSCEIVE)
 223   3                  {
 224   4                      lastBits = ReadIO(RegSecondaryStatus) & 0x07;
 225   4                      if (lastBits)
 226   4                          info->nBitsReceived += (info->nBytesReceived-1) * 8 + lastBits;
 227   4                      else
 228   4                          info->nBitsReceived += info->nBytesReceived * 8;
 229   4                  }
 230   3              }
 231   2              else
 232   2              {
 233   3                  info->collPos = 0x00;
 234   3              }
 235   2          }
 236   1          MpIsrInfo = 0;         
 237   1          MpIsrOut  = 0;
 238   1          return status;
 239   1      }   
 240          
 241          ///////////////////////////////////////////////////////////////////////
C51 COMPILER V7.02a   M500AUC                                                              06/23/2006 09:38:38 PAGE 5   

 242          // 置一个bit
 243          ///////////////////////////////////////////////////////////////////////
 244          char SetBitMask(unsigned char reg,unsigned char mask)  
 245          {
 246   1          char idata tmp = 0x00;
 247   1      
 248   1          tmp = ReadIO(reg);
 249   1          WriteIO(reg,tmp | mask);  // set bit mask
 250   1          return 0x00;
 251   1      }
 252          
 253          ///////////////////////////////////////////////////////////////////////
 254          // 清一个bit
 255          ///////////////////////////////////////////////////////////////////////
 256          char ClearBitMask(unsigned char reg,unsigned char mask)  
 257          {
 258   1          char idata tmp = 0x00;
 259   1      
 260   1          tmp = ReadIO(reg);
 261   1          WriteIO(reg,tmp & ~mask);  // clear bit mask
 262   1          return 0x00;
 263   1      }
 264          
 265          ///////////////////////////////////////////////////////////////////////
 266          ///////////////////////////////////////////////////////////////////////
 267          void FlushFIFO(void)
 268          {  
 269   1          SetBitMask(RegControl,0x01);
 270   1      }
 271          
 272          ///////////////////////////////////////////////////////////////////////
 273          // Set card in HALT-state
 274          // 终止卡的操作
 275          ///////////////////////////////////////////////////////////////////////
 276          char M500PiccHalt(void)
 277          {
 278   1          char idata status = MI_CODEERR;
 279   1      
 280   1          // ************* Cmd Sequence ********************************** 
 281   1          ResetInfo(MInfo);   
 282   1          SerBuffer[0] = PICC_HALT ;      // Halt command code
 283   1          SerBuffer[1] = 0x00;            // dummy address
 284   1          MInfo.nBytesToSend = 2;
 285   1          status = M500PcdCmd(PCD_TRANSCEIVE,
 286   1                             SerBuffer,
 287   1                             &MInfo);   
 288   1          if (status)
 289   1          {
 290   2              // timeout error ==> no NAK received ==> OK

⌨️ 快捷键说明

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