📄 mainjb.lst
字号:
C51 COMPILER V6.12 MAINJB 12/09/2002 13:03:09 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE MAINJB
OBJECT MODULE PLACED IN mainjb.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE mainjb.c DB OE SMALL ROM(LARGE)
stmt level source
1 /****************** 本文件定义IC卡读写器物理层及数据链路层函数 **************************/
2 /****************** 编写时间:2001年9月12日 **************************/
3 //#pragma OE
4 #include "52User.h"
5 #include "datas.h"
6 #include "errcode.h"
7 #include "intrins.h"
8 #include "tr2.h"
9 #include "transt1.h"
10 #include "memcard1.h"
11 /****************子函数定义*********************/
12 void delay_50us()
13 {
14 1 uchar i;
15 1 for(i=0;i<5;i++);
16 1 }
17
18 void delay_104us()
19 {
20 1 TL0=0x68;
21 1 ET0=0;
22 1 TR0=1;
23 1 while(!TF0);
24 1 TR0=0;
25 1 TF0=0;
26 1 ET0=1;
27 1 }
28
29 void delay_104SAM()
30 {
31 1 TL1=0x68;
32 1 ET1=0;
33 1 TR1=1;
34 1 while(!TF1);
35 1 TR1=0;
36 1 TF1=0;
37 1 ET1=1;
38 1 }
39
40
41 void initT0()
42 {
43 1 TL0=0x60;
44 1 ET0=1;
45 1 TR0=1;
46 1 }
47 void initT1()
48 {
49 1 TL1=0x60;
50 1 ET1=1;
51 1 TR1=1;
52 1 }
53
54
55 /***** 定义ReceiveATR函数,该函数接收来自ICC的复位应答,并将其保存到以RICCBuf为首址的存储空间 *****/
C51 COMPILER V6.12 MAINJB 12/09/2002 13:03:09 PAGE 2
56 /******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
57
58 uchar ReceiveATR()
59 {
60 1 uchar i;
61 1 uint WaitTime;
62 1 WaitTime=9600;
63 1 IfSend=0;
64 1 ICC_OUTPUT=1;
65 1 for(RICCLen=0,i=0;;RICCLen++)
66 1 {
67 2 ET0=0; //关T0中断允许
68 2 TR0=1;
69 2 EtuCount=0;
70 2
71 2 while(1) //等待ICC回复起始位
72 2 {
73 3 if(ICC_OUTPUT==0) //是否是起始位
74 3 {
75 4 delay_50us(); //延时去噪
76 4 if(ICC_OUTPUT==0)
77 4 break; //是起始位则准备接收
78 4 }
79 3 if(TF0)
80 3 {
81 4 TF0=0;
82 4 EtuCount++;
83 4 if(EtuCount>WaitTime)
84 4 {
85 5 if(RICCLen!=0)
86 5 return OK;
87 5 else if(!ICC_Detect)
88 5 return NoCard;
89 5 else
90 5 return HaveTimeOut;
91 5 }
92 4 }
93 3 }
94 2 EtuCount=0;
95 2 WaitTime=500;
96 2 initT0();
97 2 rbyte=0x00;
98 2 RBitCount=0x08; //置接收数据位数
99 2 while(RBitCount); //等待接收结束
100 2 delay_104us();
101 2 check=ICC_OUTPUT; //接收校验位
102 2 if(check==P) //接收正确则保存
103 2 {
104 3 RICCBuf[RICCLen]=rbyte;
105 3 ICC_OUTPUT=1; //接收正确
106 3 }
107 2 else
108 2 {
109 3 ICC_OUTPUT=0; //接收错误,请求重发
110 3 delay_50us();
111 3 delay_104us();
112 3 ICC_OUTPUT=1;
113 3 RICCLen--;
114 3 continue; //重新接收数据
115 3 }
116 2 delay_104us(); //延时,准备接收下一位数据
117 2 }
C51 COMPILER V6.12 MAINJB 12/09/2002 13:03:09 PAGE 3
118 1 }
119
120 /****************** 定义函数SendToICC,该函数实现将以SICCBuf为首址的数据发送到ICC **********/
121 /********************* 发送正确则返回OK,无卡则返回Nocard,其他返回invalid ****************/
122
123 uchar SendToICC()
124 {
125 1 uchar data ErrorCount; //错误次数计数
126 1 bit check; //奇偶校验位
127 1 uchar data i;
128 1 IfSend=1; // 置接收标志
129 1 ICC_OUTPUT=1;
130 1 delay_104us();
131 1 for(i=0;i<SICCLen;i++) //准备发送
132 1 {
133 2 sbyte=SICCBuf[i];
134 2 check=P;
135 2 SBitCount=8; //发送数据
136 2 // initT0();
137 2 TL0=0x74;
138 2 TR0=1;
139 2 ET0=1;
140 2 ICC_OUTPUT=0; //发送起始位
141 2 while(SBitCount);
142 2 TL0=0x88;
143 2 ET0=0;
144 2 while(!TF0); //延时1etu
145 2 ICC_OUTPUT=check; //发送校验位
146 2 TF0=0;
147 2 while(!TF0);
148 2 // delay_104us();
149 2 _nop_();
150 2 _nop_();
151 2 ICC_OUTPUT=1;
152 2 TF0=0;
153 2 delay_104us(); //保护时间
154 2 //delay_50us();
155 2 if(ICC_OUTPUT==1) //判断ICC是否接收正确
156 2 {
157 3 delay_104us();
158 3 ErrorCount=0;
159 3 continue; //正确则发送下字节数据
160 3 }
161 2 else if (ErrorCount<3) //判断错误次数是否超出
162 2 {
163 3 i--;
164 3 ErrorCount++;
165 3 delay_104us();
166 3 delay_104us();
167 3 continue;
168 3 }
169 2 else
170 2 {
171 3 if(!ICC_Detect) //判断是否有卡
172 3 return NoCard;
173 3 else
174 3 return SendError;
175 3 }
176 2 }
177 1 return OK;
178 1 }
179
C51 COMPILER V6.12 MAINJB 12/09/2002 13:03:09 PAGE 4
180
181 /***** 定义ReceiveFromICC函数,该函数接收来自ICC的数据,并将其保存到以RICCBuf为首址的存储空间 *****/
182 /******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
183
184 uchar ReceiveFromICC()
185 {
186 1 uchar data i;
187 1 uint WaitTime;
188 1 WaitTime=9600;
189 1 ICC_OUTPUT=1;
190 1 for(RICCLen=0,i=0;;RICCLen++)
191 1 {
192 2 IfSend=0;
193 2 EtuCount=0;
194 2 ET0=0; //关T0中断允许
195 2 TR0=1;
196 2 while(1) //等待ICC回复起始位
197 2 {
198 3 if(ICC_OUTPUT==0) //是否是起始位
199 3 {
200 4 delay_50us(); //延时去噪
201 4 if(ICC_OUTPUT==0)
202 4 break; //是起始位则准备接收
203 4 }
204 3 if(TF0)
205 3 {
206 4 TF0=0;
207 4 EtuCount++;
208 4 if(EtuCount>WaitTime)
209 4 {
210 5 if(ICC_Detect&RICCLen!=0)
211 5 return OK;
212 5 else if(!ICC_Detect)
213 5 return NoCard;
214 5 else
215 5 return HaveTimeOut;
216 5 }
217 4 }
218 3 }
219 2 EtuCount=0;
220 2 if(!isTimeOut)
221 2 WaitTime=50;
222 2 initT0();
223 2 rbyte=0x00;
224 2 RBitCount=0x08; //置接收数据位数
225 2 while(RBitCount); //等待接收结束
226 2 delay_104us();
227 2 check=ICC_OUTPUT; //接收校验位
228 2 if(check==P) //接收正确则保存
229 2 {
230 3 RICCBuf[RICCLen]=rbyte;
231 3 ICC_OUTPUT=1; //接收正确
232 3 ErrorCount=0;
233 3 }
234 2 else if(ErrorCount<3)
235 2 {
236 3 ICC_OUTPUT=0; //接收错误,请求重发
237 3 delay_50us();
238 3 delay_104us();
239 3 ICC_OUTPUT=1;
240 3 RICCLen--;
241 3 ErrorCount++;
C51 COMPILER V6.12 MAINJB 12/09/2002 13:03:09 PAGE 5
242 3 continue; //重新接收数据
243 3 }
244 2 else
245 2 {
246 3 if(!ICC_Detect)
247 3 return NoCard;
248 3 else
249 3 return ReceiveError;
250 3 }
251 2 delay_104us(); //延时,准备接收下一位数据
252 2 }
253 1 }
254 /*************定义T0的中断服务程序*************/
255 /**************接收来自ICC的数据***************/
256
257 RICC()interrupt 1 using 1
258 {
259 1 if(!IfSend)
260 1 {
261 2 ICC_OUTPUT=1;//
262 2 if (ICC_OUTPUT==1)
263 2 {
264 3 _nop_();
265 3 if(ICC_OUTPUT==1)
266 3 rbyte|=0x80;
267 3 else
268 3 {
269 4 //ICC_OUTPUT=1;//
270 4 _nop_();
271 4 if(ICC_OUTPUT==1)
272 4 rbyte|=0x80;
273 4 }
274 3 }
275 2 if(RBitCount>1)
276 2 rbyte=rbyte>>1;
277 2 RBitCount--;
278 2 }
279 1 else
280 1 {
281 2 if(sbyte%2) //发送一位数据
282 2 ICC_OUTPUT=1;
283 2 else
284 2 ICC_OUTPUT=0;
285 2 sbyte=sbyte>>1; //右移一位
286 2 SBitCount--;
287 2 }
288 1 }
289
290 void EnableEX1()
291 {
292 1 EX1=1;//开外部中断0,即允许拔卡中断;
293 1 IT1=1;//下降沿触发;
294 1 }
295 void DisableEX1()
296 {
297 1 EX1=0;
298 1 IT1=0;
299 1 }
300 void EnableEX0()
301 {
302 1 EX0=1;//开外部中断0,即允许拔卡中断;
303 1 IT0=1;//下降沿触发;
C51 COMPILER V6.12 MAINJB 12/09/2002 13:03:09 PAGE 6
304 1 }
305 void DisableEX0()
306 {
307 1 EX0=0;
308 1 IT0=0;
309 1 }
310
311
312 /***** 定义ReceiveATR函数,该函数接收来自ICC的复位应答,并将其保存到以RICCBuf为首址的存储空间 *****/
313 /******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
314
315 uchar ReceiveSAMATR()
316 {
317 1 uchar i;
318 1 uint WaitTime;
319 1 WaitTime=9600;
320 1 IfSend=0;
321 1 SAM_DATA=1;
322 1 for(RICCLen=0,i=0;;RICCLen++)
323 1 {
324 2 ET1=0; //关T0中断允许
325 2 TR1=1;
326 2 EtuCount=0;
327 2 TF1=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -