📄 mss_spi.lst
字号:
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 + -