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

📄 mss_spi.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 460   3                              break;                          // ACK或NAK命令长度不超过20
 461   3                      }
 462   2      
 463   2                      if(time_out==0)
 464   2                      {
 465   3                              HandwareErr=ERROR;              // MSS可能故障
 466   3                              return ERROR;   // 返回
 467   3                      }
 468   2              }while(temp!=EOT);                      // 接收到EOT结束符
 469   1      
 470   1              if(SPIbuf[R_BUF-2]==ACK)
 471   1              {
 472   2                      return ACK;             // 返回ACK
 473   2              }
 474   1              else if(SPIbuf[R_BUF-2]==NAK)
 475   1              {
 476   2                      return NAK;             // 返回NAK
 477   2              }
 478   1      
 479   1              HandwareErr=ERROR;      // MSS可能故障
 480   1              return ERROR;
 481   1      }
 482          
 483          ///////////////////////////////////////////////////////////////////////////////
 484          // 显示公共错误信息
 485          ///////////////////////////////////////////////////////////////////////////////
 486          void disperr(uchar id)
 487          {
 488   1              Rstwdt();                       // 喂狗
 489   1      
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 9   

 490   1              GLCD_Locate(16,32);
 491   1              reverse=1;
 492   1              dprintf(failure,12);                                    // 失败                 
 493   1              reverse=0;
 494   1      
 495   1              GLCD_Locate(0,48);
 496   1              dprintf("               ",15);                  // 清行
 497   1              GLCD_Locate(16,48);
 498   1      
 499   1              if(id<'A')
 500   1              {
 501   2                      dprintf(disp_err[id-0x30],12);  // 显示正常错误信息
 502   2              }
 503   1              else
 504   1              {
 505   2                      if(id<='F')
 506   2                      {
 507   3                              HandwareErr=ERROR;      // MSS不能正常工作
 508   3                              dprintf(disp_err[10],12);       // 显示模块复位
 509   3                              TURN_ON();
 510   3                      }
 511   2                      else
 512   2                      {
 513   3                              dprintf(disp_err[11],12);       // 显示ACK错误
 514   3                      }
 515   2              }
 516   1      }
 517          
 518          ///////////////////////////////////////////////////////////////////////////////
 519          // MSS上电复位函数
 520          // MSS电源芯片采用TPS70145,该芯片具备可编程供电能力,当使能端为低电平时,MSS
 521          // 上电,MSS上电后进入自检状态,当自检完成后向HOST申请中断,发送自检结果信息。
 522          // MSS自检成功发送'HHHF0'信息,否则发送'HHHFX',X表示MSS模块硬件故障代码。
 523          // MSS自检成功后,HOST设置MSS系统安全等级。
 524          // 当MSS在10秒内不能完成自检,置MSS故障标志。
 525          ///////////////////////////////////////////////////////////////////////////////
 526          void TURN_ON()
 527          {
 528   1              idata uint  i;
 529   1              idata uchar count=3;
 530   1      
 531   1              MSS_INT=1;                                      // 清MSS中断位
 532   1              MSS_PWR_ON=1;                           // 清MSS电源使能位
 533   1      
 534   1              Rstwdt();                                       // 喂狗
 535   1      
 536   1      init_again:
 537   1              MSS_PWR_ON=0;                           // 打开MSS电源
 538   1      
 539   1              for(i=0;i<50;i++)
 540   1              {
 541   2                      Wait10ms();                             // 等待500ms
 542   2                      Rstwdt();                               // 喂狗
 543   2              }
 544   1                                                      
 545   1              for(i=0;i<3;i++)                        // 检测3次低电平中断,目的是防止MSS上电时误发送低电平
 546   1              {
 547   2                      do
 548   2                      {
 549   3                              Rstwdt();                       // 喂狗
 550   3                              if(count==0)
 551   3                              {
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 10  

 552   4                                      HandwareErr=ERROR;      // MSS不能正常工作
 553   4                                      return;
 554   4                              }
 555   3                      }while(MSS_INT);                // 检测MSS中断
 556   2                      Rstwdt();                               // 喂狗
 557   2                      Wait10ms();                             // 等待10毫秒
 558   2              }
 559   1      
 560   1              if(!SPIReceive())
 561   1              {
 562   2                      goto power_off;                 // 重新对MSS上电
 563   2              }
 564   1      
 565   1              if(SPIbuf[SOHptr+7]=='H'&&SPIbuf[SOHptr+8]=='H'&&SPIbuf[SOHptr+9]=='H'
 566   1                      &&SPIbuf[SOHptr+10]=='F'&&SPIbuf[SOHptr+11]=='0')
 567   1              {
 568   2                      for(i=0; i<BUFSIZE; i++)
 569   2                              SPIbuf[i]=0;
 570   2      
 571   2                      HandwareErr=OK;         // MSS工作正常
 572   2                      return;
 573   2              }
 574   1      
 575   1              if(count==0)
 576   1              {
 577   2                      HandwareErr=ERROR;              // MSS不能正常工作
 578   2                      return;
 579   2              }
 580   1              
 581   1      power_off:
 582   1              MSS_PWR_ON=1;                           // 清MSS电源使能
 583   1              OneSecond();
 584   1              count--;
 585   1              goto init_again;
 586   1      }
 587          
 588          ///////////////////////////////////////////////////////////////////////////////
 589          // HOST向MSS发送不同的命令,发送完成后HOST等待接收MSS的ACK或NAK数据,如果HOST
 590          // 接收到ACK,表示MSS正确接收可识别的命令包;如果HOST接收到NAK,表示MSS没有
 591          // 正确接收到可识别的命令包。
 592          // HOST接收到MSS的ACK后,HOST继续等待MSS的数据
 593          ///////////////////////////////////////////////////////////////////////////////
 594          // 指纹注册SPI命令处理过程
 595          // 发送:ETF+管理分类+应用分类+用户编号+密码
 596          // 返回:ETFS成功
 597          //       ETFF+X失败
 598          //       ETFM提醒用户抬起手指
 599          //       ETFR提醒用户按下手指
 600          ///////////////////////////////////////////////////////////////////////////////
 601          bit Enroll()
 602          {
 603   1              idata uchar i;          // 计数器
 604   1      
 605   1              NewMsgNum();            // 信息号
 606   1      
 607   1              SPIbuf[0]='E';          // 注册用户ETF
 608   1              SPIbuf[1]='T';
 609   1              SPIbuf[2]='F';
 610   1      
 611   1              SPIbuf[3]=ManageClass;  // 管理员或普通用户
 612   1              SPIbuf[4]=AppClass;             // 指纹或密码用户
 613   1      
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 11  

 614   1              for(i=0;i<5;i++) SPIbuf[5+i]=User_id[i];
 615   1      
 616   1              if(AppClass=='P')
 617   1              {
 618   2                      for(i=0;i<6;i++)
 619   2                              SPIbuf[10+i]=Password[i];       // 密码用户输入密码
 620   2              }
 621   1              else
 622   1              {
 623   2                      for(i=0;i<6;i++)
 624   2                              SPIbuf[10+i]=Password[i];       // 密码用户发送用户输入的密码
 625   2              }
 626   1      
 627   1              CommandLen=16;                  // 命令体长度
 628   1      
 629   1              SendMsg();      // 发送命令
 630   1              Rstwdt();                       // 喂狗
 631   1      
 632   1              if(AppClass=='F')
 633   1              {
 634   2                      GLCD_Locate(40,32);
 635   2                      dprintf(User_id,5);             // 显示用户名
 636   2                      GLCD_Locate(16,48);
 637   2                      dprintf(Putf,12);               // 按下手指
 638   2              }
 639   1      
 640   1              if(ACKReceive()!=ACK)   // 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
 641   1              {
 642   2                      disperr(100);           // 显示错误
 643   2              }       
 644   1              else
 645   1              {
 646   2      liftget_enroll:
 647   2                      if(SPIReceive())                // 接收DSP数据
 648   2                      {
 649   3                              Rstwdt();                       // 喂狗
 650   3      
 651   3                              if(SPIbuf[SOHptr+7]=='E' && SPIbuf[SOHptr+8]=='T' && SPIbuf[SOHptr+9]=='F')
 652   3                              {
 653   4      
 654   4                                      switch(SPIbuf[SOHptr+10])
 655   4                                      {
 656   5                                      case 'M' :
 657   5                                              GLCD_Locate(16,48);
 658   5                                              dprintf(Liftf,12);              // 抬起手指
 659   5                                              goto liftget_enroll;
 660   5                                              break;
 661   5                                      case 'R' :
 662   5                                              GLCD_Locate(16,48);
 663   5                                              dprintf(Putf,12);               // 按下手指
 664   5                                              goto liftget_enroll;
 665   5                                              break;
 666   5                                      case 'F' :
 667   5                                              pulse=3;
 668   5                                              disperr(SPIbuf[SOHptr+11]);     // 显示错误
 669   5                                              break;
 670   5                                      case 'S' : 
 671   5                                              pulse=1;
 672   5                                              if(wieformat==1)                // 自定义门禁方式
 673   5                                                      white_bill_reg();       // 注册白名单
 674   5      
 675   5                                              Wait10ms();
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 12  

 676   5                                              Wait10ms();
 677   5                                              Wait10ms();
 678   5                                              Wait10ms();
 679   5      
 680   5                                              GLCD_Locate(16,32);
 681   5                                              dprintf(success,12);    // 成功                         
 682   5                                              GLCD_Locate(0,48);
 683   5                                              dprintf("               ",15);
 684   5                                              GLCD_Locate(24,48);
 685   5                                              dprintf(welcome,4);     // 欢迎                         
 686   5                                              GLCD_Locate(72,48);
 687   5                                              dprintf(User_id,5);     // 用户名                               
 688   5                                              time_out=100;
 689   5                                              do{}while(time_out!=0);
 690   5                                              time_out=0;
 691   5                                              return OK;
 692   5                                              break;

⌨️ 快捷键说明

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