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

📄 m500aucend.lst

📁 51单片机进行mifare1射频卡开发
💻 LST
📖 第 1 页 / 共 5 页
字号:
 161   1         }
 162          //********************发送应答信号子程序,是单片机发出的*********OK!
 163          //Clock out an acknowledge bit(low)
 164          //SCL expected low on entry.Return with SCL,SDA low
 165          void MAck_I2c()
 166          {
 167   1        SDA=0;
 168   1        wait_I2c();
 169   1        SCL=1;
 170   1        wait_I2c();
 171   1        SCL=0;
 172   1        _nop_();
 173   1        _nop_();
 174   1        SDA=1;
 175   1       }
 176          //;*****************发送非应答信号,单片机发出******* OK!
 177          //Clock out a negative acknowledge bit(high)
 178          //SCL expected low on entry.Return with SCL low,SDA high
 179           void MNAck_I2c()
 180          {
 181   1        SDA=1;
 182   1        wait_I2c();
 183   1        SCL=1;
 184   1        wait_I2c();
 185   1        SCL=0;
 186   1        _nop_();
 187   1        _nop_();
 188   1        SDA=0;
 189   1       }
 190          //;*******************************************************OK!
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 6   

 191          //;发送字节子程序                                        *
 192          //;字节数据放入ACC                                       *
 193          //;每发送一字节要调用一次CACK子程序,取应答位            *
 194          //;SCL,SDA expected low on entry.Return with SCL low     *
 195          //;*******************************************************
 196          void SendByte(uchar c)
 197          {
 198   1        uchar BitCnt;
 199   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 200   1        {if((c<<BitCnt)&0x80)SDA=1;
 201   2         else SDA=0;
 202   2         _nop_();
 203   2         SCL=1;
 204   2         wait_I2c();
 205   2         SCL=0;
 206   2         wait_I2c();
 207   2         }
 208   1         _nop_();
 209   1         _nop_();
 210   1         SDA=1;
 211   1         _nop_();
 212   1         _nop_();
 213   1         SCL=1;
 214   1         wait_I2c();
 215   1         if(SDA==1)ack=0;
 216   1         else ack=1;
 217   1         SCL=0;
 218   1         _nop_();
 219   1         _nop_();
 220   1      }
 221          //;**********************************************************
 222          //;读取字节子程序                                    OK!
 223          //;读出的值在ACC
 224          //;每取一字节要发送一个应答/非应答信号
 225          //;SCL expected low on entry.Return with SCL low
 226          //;**********************************************************
 227          uchar RcvByte()
 228          {
 229            uchar retc;
 230            uchar BitCnt;
 231            retc=0;
 232            SDA=1;
 233            for(BitCnt=0;BitCnt<8;BitCnt++)
 234            {
 235             _nop_();
 236             SCL=0;
 237             wait_I2c();
 238             SCL=1;
 239             wait_I2c();
 240             retc=retc<<1;
 241             if(SDA==1)retc=retc+1;
 242             _nop_();
 243             _nop_();
 244             }
 245             SCL=0;
 246             _nop_();
 247             _nop_();
 248             return(retc);
 249          }
 250          //向器件指定子地址写N个数据
 251          //;入口参数:  器件从地址sla、器件子地址suba 、发送数据缓冲区*s、发送字节数no
 252          bit IWrStr(uchar sla,uchar suba,uchar *s,uchar no)
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 7   

 253           {
 254            uchar i;
 255            start_I2c();
 256            SendByte(sla);
 257             if(ack==0)return(0);
 258            SendByte(suba);
 259             if(ack==0)return(0);
 260            for(i=0;i<no;i++)
 261            {
 262             SendByte(*s);
 263             if(ack==0)return(0);
 264             s++;
 265             }
 266            stop_I2c();
 267            return(1);
 268           }
 269          //;向器件指定子地址读取N个数据
 270          //;入口参数:  器件从地址sla、器件子地址suba、接收字节数no
 271          //;出口参数:  接收数据缓冲区*s
 272           bit IRdStr(uchar sla,uchar suba,uchar *s,uchar no)
 273           {
 274            uchar i;
 275            start_I2c();
 276            SendByte(sla);
 277             if(ack==0)return(0);
 278            SendByte(suba);
 279             if(ack==0)return(0);
 280            start_I2c();
 281            SendByte(sla+1);
 282             if(ack==0)return(0);
 283             for(i=0;i<no-1;i++)
 284            {
 285             *s=RcvByte();
 286             MAck_I2c();
 287             s++;
 288             }
 289             *s=RcvByte();
 290             MNAck_I2c();
 291             stop_I2c();
 292             return(1);
 293          }
 294          ///////////////////////////////////结束/////////
 295          ////**************下面是rc500的子函数
 296          
 297          ///////////////////////////////////////////////////////////////////////
 298          // 往一个地址写一个数据
 299          ///////////////////////////////////////////////////////////////////////
 300          void WriteRawIO(unsigned char Address,unsigned char value)
 301          {
 302                  XBYTE[Address]=value;
 303          }
 304          
 305          ///////////////////////////////////////////////////////////////////////
 306          // 从一个地址读出一个数据
 307          ///////////////////////////////////////////////////////////////////////
 308          unsigned char ReadRawIO(unsigned char Address)
 309          {
 310                  return XBYTE[Address];
 311          }
 312          
 313          ///////////////////////////////////////////////////////////////////////
 314          // 往一个地址写一个数据(EEPROM)
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 8   

 315          ///////////////////////////////////////////////////////////////////////
 316          void WriteIO(unsigned char Address, unsigned char value)
 317          {
 318              WriteRawIO(0x00,GetRegPage(Address));
 319              WriteRawIO(Address,value);
 320          }
 321          
 322          ///////////////////////////////////////////////////////////////////////
 323          // 从一个地址读出一个数据(EEPROM)
 324          ///////////////////////////////////////////////////////////////////////
 325          unsigned char ReadIO(unsigned char Address)
 326          {
 327             WriteRawIO(0x00,GetRegPage(Address));
 328             return ReadRawIO(Address);
 329          }
 330          
 331          ///////////////////////////////////////////////////////////////////////
 332          // 设置定时时间
 333          ///////////////////////////////////////////////////////////////////////
 334          void M500PcdSetTmo(unsigned char tmoLength)
 335          {
 336              switch(tmoLength)
 337              {
 338                  case 1:
 339                      WriteIO(RegTimerClock,0x07);
 340                      WriteIO(RegTimerReload,0x6a);
 341                      break;
 342                  case 2:
 343                      WriteIO(RegTimerClock,0x07);
 344                      WriteIO(RegTimerReload,0xa0);
 345                      break;
 346                  case 3:
 347                      WriteIO(RegTimerClock,0x09);
 348                      WriteIO(RegTimerReload,0xa0);
 349                      break;
 350                  case 4:
 351                      WriteIO(RegTimerClock,0x09);
 352                      WriteIO(RegTimerReload,0xff);
 353                      break;
 354                  case 5:
 355                      WriteIO(RegTimerClock,0x0b);
 356                      WriteIO(RegTimerReload,0xff);
 357                      break;
 358                  case 6:
 359                      WriteIO(RegTimerClock,0x0d);
 360                      WriteIO(RegTimerReload,0xff);
 361                      break;
 362                  case 7:
 363                      WriteIO(RegTimerClock,0x0f);
 364                      WriteIO(RegTimerReload,0xff);
 365                      break;
 366                  default:
 367                      WriteIO(RegTimerClock,0x07);
 368                      WriteIO(RegTimerReload,tmoLength);
 369                      break;
 370              }
 371          }
 372          
 373          ///////////////////////////////////////////////////////////////////////
 374          // Request Command defined in ISO14443(Mifare)
 375          ///////////////////////////////////////////////////////////////////////
 376          char  M500PcdCmd(unsigned char cmd,
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 9   

 377                         volatile unsigned char data *rcv,
 378                          MfCmdInfo idata *info)
 379          {
 380              char          idata status    = MI_OK;
 381              char          idata tmpStatus ;
 382              unsigned char idata lastBits;
 383              unsigned int  idata timecnt = 0;
 384              unsigned char idata irqEn = 0x00;
 385              unsigned char idata waitFor = 0x00;
 386              unsigned char idata timerCtl  = 0x00;
 387          
 388              WriteIO(RegInterruptEn,0x7F);
 389              WriteIO(RegInterruptRq,0x7F);
 390              WriteIO(RegCommand,PCD_IDLE);
 391          
 392              FlushFIFO();
 393              MpIsrInfo = info;
 394              MpIsrOut = rcv;
 395              info->irqSource = 0x00;
 396              switch(cmd)
 397              {
 398                  case PCD_IDLE:
 399                      irqEn = 0x00;
 400                      waitFor = 0x00;
 401                      break;
 402                  case PCD_WRITEE2:
 403                      irqEn = 0x11;
 404                      waitFor = 0x10;
 405                      break;
 406                  case PCD_READE2:
 407                      irqEn = 0x07;
 408                      waitFor = 0x04;
 409                      break;
 410                  case PCD_LOADCONFIG:
 411                  case PCD_LOADKEYE2:
 412                  case PCD_AUTHENT1:
 413                      irqEn = 0x05;
 414                      waitFor = 0x04;
 415                      break;
 416                  case PCD_CALCCRC:
 417                      irqEn = 0x11;
 418                      waitFor = 0x10;
 419                      break;
 420                  case PCD_AUTHENT2:
 421                      irqEn = 0x04;
 422                      waitFor = 0x04;
 423                      break;
 424                  case PCD_RECEIVE:
 425                      info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
 426                      irqEn = 0x06;
 427                      waitFor = 0x04;
 428                      break;
 429                  case PCD_LOADKEY:
 430                      irqEn = 0x05;
 431                      waitFor = 0x04;
 432                      break;
 433                  case PCD_TRANSMIT:
 434                      irqEn = 0x05;
 435                      waitFor = 0x04;
 436                      break;
 437                  case PCD_TRANSCEIVE:
 438                          info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
C51 COMPILER V7.03   M500AUCEND                                                            05/07/2004 12:23:37 PAGE 10  

 439                      irqEn = 0x3D;
 440                      waitFor = 0x04;

⌨️ 快捷键说明

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