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

📄 mss_spi.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE MSS_SPI
OBJECT MODULE PLACED IN Mss_spi.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Mss_spi.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          ///////////////////////////////////////////////////////////////////////////////
   2          //
   3          // Hopinfo Copyright.
   4          //
   5          // www.chinahopeinfo.com.cn
   6          //
   7          // 2005.04.26
   8          //
   9          // 审阅:黄平生
  10          //
  11          // 指纹模块(MSS)和HOST通信采用SPI通信接口,在该设计中8051作为HOST端,工作模式为
  12          // 主设备,指纹模块工作模式为负设备,接收/发送的时钟由8051提供,通信速率由8051处
  13          // 理速度决定,MSS在时钟的下降沿对齐要发送/接收数据位的中间,MSS在时钟的下降沿有
  14          // 效。
  15          // 基本通信原理是:当MSS有数据发送时向HOST申请中断,置MSS_INT为低电平,HOST决定
  16          // 是否接收数据;HOST有数据要发送时,直接向MSS发送,因为HOST为主设备。
  17          //
  18          ///////////////////////////////////////////////////////////////////////////////
  19          
  20          #include "Global.h"
  21          
  22          
  23          ///////////////////////////////////////////////////////////////////////////////
  24          // 内部存储区变量       0~256
  25          // 全局变量定义
  26          extern data  uchar checksum;                    // 校验和
  27          extern data  uchar testchecksum;                // 接收到的校验和
  28          
  29          extern data  uchar key;                                 // 键盘值
  30          
  31          extern data  uchar MSG;                                 // 信息号
  32          extern data  uchar CSH;                                 // 校验和ASC高字节
  33          extern data  uchar CSL;                                 // 校验和ASC低字节
  34          extern data  uint  SOHptr;                              // SPI缓冲区头指针
  35          extern data  uint  ETXptr;                              // ETX位置
  36          extern data  uint  CommandLen;                  // 命令体长度
  37          extern data  uchar pulse;                               // 蜂鸣次数
  38          extern data  uint  time_out;                    // 通用超时定时器
  39          
  40          extern data char groupclass;                    // 用户分组信息
  41          extern data char User_id[6];                    // 用户编号0~65534
  42          
  43          extern data uchar cur_time[15];                 // 系统当前时间显示存储区 XXXX年XX月XX日XX时XX分XX秒星期X
  44          
  45          extern data uint  index;                                // 数据索引
  46          
  47          extern data uint  trans_ctr;                    // 发送数据指针
  48          extern data uint  trans_size;                   // 发送数据大小
  49          
  50          extern bdata bit reverse;                               // LCD底色显示控制
  51          extern bdata bit HandwareErr;                   // 指纹模块工作状态
  52          
  53          extern bdata bit managemode;                    // 管理员比对操作
  54          
  55          // 全局临时变量
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 2   

  56          extern idata char Start_user_id[6];             // 开始用户编号
  57          extern idata char End_user_id[6];               // 终止用户编号
  58          extern idata char Start_time[5];                // 开始时间
  59          extern idata char End_time[5];                  // 终止时间
  60          extern idata char Security_level;               // 安全等级0~4
  61          extern idata char ManageClass;                  // 管理分类'M'管理用户'G'普通用户
  62          extern idata char AppClass;                             // 应用分类'F'指纹用户'P'密码用户
  63          extern idata char Password[7];                  // 密码
  64          extern idata char wieformat;                    // 韦根通信格式
  65          
  66          ///////////////////////////////////////////////////////////////////////////////
  67          // 内部存储区变量       256~1280
  68          // 全局变量定义
  69          extern xdata uchar SPIbuf[BUFSIZE];             // SPI和串行通信缓冲区
  70          extern xdata uchar trans_buf[TRANSBUFSIZE];// 发送数据缓冲区
  71          
  72          ///////////////////////////////////////////////////////////////////////////////
  73          // 程序存储区变量       0~32K
  74          // SPI通信显示信息
  75          code char Putf[]                =" -按下手指- ";
  76          code char Liftf[]               =" -抬起手指- ";
  77          code char success[]             ="  <<成功>>  ";
  78          code char failure[]             ="  <<失败>>  ";
  79          code char welcome[]             ="欢迎";
  80          
  81          code char                                                       // 指纹模块返回信息显示
  82          disp_err[12][12]=
  83          {
  84                  " -没有手指- ", 
  85                  " -图像太差- ",
  86                  " -手指不同- ",
  87                  " -手指太偏- ",
  88                  " -不能注册- ",
  89                  " -已 注 册- ",
  90                  " -没有注册- ",
  91                  " -比对失败- ",
  92                  " -没有空间- ",
  93                  " -不能使用- ",
  94                  " -系统复位- ",
  95                  " -不能通信- ",
  96          };
  97          
  98          ///////////////////////////////////////////////////////////////////////////////
  99          // 十毫秒延时函数,累积系统若干条指令
 100          ///////////////////////////////////////////////////////////////////////////////
 101          void Wait10ms()
 102          {
 103   1              idata uint i;
 104   1      
 105   1              for(i=0;i<3600;i++){}
 106   1      }
 107          
 108          ///////////////////////////////////////////////////////////////////////////////
 109          // 一秒钟延时函数,累积10ms计数
 110          ///////////////////////////////////////////////////////////////////////////////
 111          void OneSecond()
 112          {
 113   1              idata uchar i;
 114   1      
 115   1              for(i=0;i<100;i++)
 116   1              {
 117   2                      Wait10ms();     
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 3   

 118   2              }
 119   1      }
 120          
 121          ///////////////////////////////////////////////////////////////////////////////
 122          // MSS和HOST通信包结构采用标准不定长信息包结构
 123          //
 124          // 信息包结构定义如下:
 125          // SOH  地址4字节ASC码      信息号1字节ASC码 STX  命令体ASC码3~   ETX  校验2字节AC码 EOT
 126          // 0B   1B   2B   3B   4B   5B               6B   NB              N+1B N+2B N+3B     N+4B
 127          // 01H  30H  31H  30H  32H  30H~39H          02H                  03H                04H
 128          //
 129          ///////////////////////////////////////////////////////////////////////////////
 130          
 131          ///////////////////////////////////////////////////////////////////////////////
 132          // SPI_Transfer
 133          // 使用SPI 协议同时发送<SPI_byte>
 134          // SCK 空闲为高 在SCK 下降时位锁存
 135          //
 136          // 此程序的时序如下
 137          //
 138          // 参数 时钟数
 139          // MOSI 有效到SCK 下降沿 6
 140          // SCK 上升到 MISO 锁存 2
 141          // SCK 下降到 MOSI 有效 7
 142          // SCK 高时间 13
 143          // SCK 低时间 8
 144          ///////////////////////////////////////////////////////////////////////////////
 145          char SPItrans(char SPI_byte)
 146          {
 147   1              idata uchar i;
 148   1      
 149   1              MSS=0;                          // SPI选通
 150   1              for(i=8;i>0;i--)
 151   1              {
 152   2                      MOSI=SPI_byte&0x80;     // 移下一位到 MSB
 153   2              SPI_byte=SPI_byte<<1;
 154   2                      SCK=0;                                  // 时钟下降沿接收
 155   2                      SPI_byte|=MISO;
 156   2                      SCK=1;                                  // 时钟上升沿发送
 157   2              }
 158   1              MSS=1;
 159   1      
 160   1              key=0;
 161   1      
 162   1              return(SPI_byte);
 163   1      }
 164          
 165          ///////////////////////////////////////////////////////////////////////////////
 166          // 生成信息包的信息号'0~'9'
 167          ///////////////////////////////////////////////////////////////////////////////
 168          void NewMsgNum()
 169          {
 170   1              MSG++;
 171   1              if(MSG>0x39){MSG=0x30;}
 172   1      }
 173          
 174          ///////////////////////////////////////////////////////////////////////////////
 175          // 将16进制数据校验和转换为ASC码校验和,以便发送
 176          ///////////////////////////////////////////////////////////////////////////////
 177          void CS_ASCII()
 178          {
 179   1              checksum=~checksum+1;                   // 校验和求补
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 4   

 180   1              CSH=((checksum>>4)&0x0f)+0x30;
 181   1              if(CSH>0x39)
 182   1              {CSH+=0x07;}
 183   1              CSL=(checksum&0x0f)+0x30;
 184   1              if(CSL>0x39)
 185   1              {CSL+=0x07;}                                    // 校验和转换成两位ASCII码 高位CSH 低位 CSL                                     
 186   1      }
 187          
 188          ///////////////////////////////////////////////////////////////////////////////
 189          // 将ASC码校验和转换为16进制校验和,以便比较
 190          ///////////////////////////////////////////////////////////////////////////////
 191          void HEX_CS()              
 192          {       
 193   1              CSH-=0x30;
 194   1              if(CSH>9){CSH-=0x07;}
 195   1              CSL-=0x30;
 196   1              if(CSL>9){CSL-=0x07;}
 197   1              checksum=((CSH<<4)&0xf0)+CSL;
 198   1      }
 199          
 200          ///////////////////////////////////////////////////////////////////////////////
 201          // 将ASC码数据转换为16进制数据
 202          ///////////////////////////////////////////////////////////////////////////////
 203          uchar Asc_hex(char alpha)
 204          {
 205   1              alpha=alpha-0x30;
 206   1              if(alpha>0x09)alpha=alpha-0x07;
 207   1              return alpha;
 208   1      }
 209          
 210          ///////////////////////////////////////////////////////////////////////////////
 211          // 将16进制数据转换为ASC码数据
 212          ///////////////////////////////////////////////////////////////////////////////
 213          char Hex_ascii(uchar h)
 214          {
 215   1              h=h+0x30;
 216   1              if(h>0x39)
 217   1              {h+=0x07;}
 218   1              return h;
 219   1      }
 220          
 221          ///////////////////////////////////////////////////////////////////////////////
 222          // 组织发送命令头
 223          ///////////////////////////////////////////////////////////////////////////////
 224          void Preamble()
 225          {
 226   1              Rstwdt();                               // 喂狗

⌨️ 快捷键说明

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