?? 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 + -