📄 sim.lst
字号:
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE SIM
OBJECT MODULE PLACED IN Sim.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sim.c LARGE OPTIMIZE(9,SIZE) BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 /*
2 * Copyright (c) 2004,成都港顺科技发展有限公司
3 * All rights reserved.
4 *
5 * 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
6 * 工程名称:POS-Test.UV2
7 * 文件名称:Sim.C
8 * 摘 要:与税控IC卡通讯的所有底层函数
9 *
10 * 单 片 机:uPSD3254
11 * 当前版本:0.4
12 * 作 者:李凯
13 * 完成日期:2004-12-7 14:45
14 */
15
16 #include "Main.h"
17
18 #define SIM0RXD PDO=0 //select Sim0 RXD Mode
19 #define SIM0TXD PDO=0x02 //select Sim0 TXD Mode
20 #define SIM1RXD PDO=0x04 //select Sim1 RXD Mode
21 #define SIM1TXD PDO=0x06 //select Sim1 TXD Mode
22
23 #define Ctr0Set P15=1
24 #define Ctr0Clr P15=0
25 #define Ctr1Set P17=1
26 #define Ctr1Clr P17=0
27
28 #define Rst0Set P14=1
29 #define Rst0Clr P14=0
30 #define Rst1Set P16=1
31 #define Rst1Clr P16=0
32
33 #define SimWoQi 0 //渥奇的卡
34 #define SimTianYu 1 //天喻的卡
35 #define SimWoQi100K 2 //渥奇的100K卡
36
37 sbit CardDetect=P3^4;
38
39 //uchar xdata SimTimeOut,SimType,SimEtu;
40 xdata uchar SimTimeOut,SimType,SimGuardTime,SimWaitTime,SimIns;
41
42 uchar SimDetect(uchar x)
43 {//x=0x11:插入用户卡;=0x12:插入管理卡;=0x01:取出用户卡;=0x02:取出管理卡
44 1 uint i=1000,k=1000;
45 1
46 1 if((x&0x10)!=0)
47 1 {
48 2 if(x==0x11)
49 2 {
50 3 LcdDisplay(0,0,"请插入用户卡!",3);
51 3 }
52 2 else
53 2 {
54 3 LcdDisplay(0,0,"请插入管理卡!",3);
55 3 }
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 2
56 2 SimDeactive(1);
57 2 while(CardDetect==0){if(GetKey()==K_TC)return 0;}
58 2 while(--i);
59 2 while(CardDetect==0){if(GetKey()==K_TC)return 0;}
60 2 SimDeactive(1);
61 2 while(--k);
62 2 }
63 1 else
64 1 {
65 2 if(x==0x01)
66 2 LcdDisplay(48,0,"请取出用户卡!",1);
67 2 else
68 2 LcdDisplay(48,0,"请取出管理卡!",1);
69 2 SimDeactive(1);
70 2 while(CardDetect==1){if(GetKey()==K_TC)return 0;}
71 2 while(--i);
72 2 while(CardDetect==1){if(GetKey()==K_TC)return 0;}
73 2 }
74 1 return 1;
75 1 }
76
77 void SimActive(uchar ch)
78 {
79 1 uchar k=185,m=75;
80 1
81 1 TXD=1;
82 1 RXD=1;
83 1 RI=0;TI=0;
84 1 if(ch==0)
85 1 {
86 2 Rst0Set;
87 2 Ctr0Clr;
88 2 while(--k);
89 2 Rst0Clr;
90 2 while(--m);
91 2 Rst0Set;
92 2 SIM0RXD;
93 2 }
94 1 else
95 1 {
96 2 Rst1Set;
97 2 Ctr1Clr;
98 2 while(--k);
99 2 Rst1Clr;
100 2 while(--m);
101 2 Rst1Set;
102 2 SIM1RXD;
103 2 }
104 1 }
105
106 void SimDeactive(uchar ch)
107 {
108 1 uchar x=250;
109 1
110 1 if(ch==0)
111 1 {
112 2 Rst0Clr; //RSTIN=0
113 2 Ctr0Set; //CMDVcc=1
114 2 SIM0TXD;
115 2 }
116 1 else
117 1 {
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 3
118 2 Rst1Clr; //RSTIN=0
119 2 Ctr1Set; //CMDVcc=1
120 2 SIM1TXD;
121 2 }
122 1 while(--x); //至少需要125us
123 1 }
124
125 void SimTxdByte(uchar dat)
126 {
127 1 uchar i,j;
128 1
129 1 i=SimGuardTime+1; //对ISO7816-3来说,发送一个字节+奇偶位需要12个ETU
130 1 while(i>0) //但是对51单片机来说,发送一个字节+奇偶位只有10个ETU
131 1 {
132 2 j=104;
133 2 while(--j);
134 2 i--;
135 2 }
136 1 ACC=dat;
137 1 TB8=P;
138 1 while(1)
139 1 {
140 2 SBUF = dat;
141 2 while(!TI);
142 2 TI=0;
143 2 j=100;
144 2 while(--j);
145 2 if(TXD==1)break;//发送方在起始上升沿之后的(11±0.2)基本时间单元(etu)时刻检测I/O
146 2 else
147 2 {//检测到差错信号,至少两个etu延时之后才重发
148 3 j=208; //Bps9600: Etu=104 us
149 3 while(--j);
150 3 }
151 2 }
152 1 }
153
154 uchar SimRxdByte()
155 {
156 1 uchar dat,j;
157 1 ulong m,n;
158 1 bit x;
159 1
160 1 SimTimeOut=0;
161 1 n=SimWaitTime*9600;
162 1 while(1)
163 1 {
164 2 m=n;
165 2 while(!RI)
166 2 {
167 3 m--;
168 3 if(m==0)
169 3 {
170 4 SimTimeOut=1;
171 4 return 0;
172 4 }
173 3 }
174 2 RI=0;
175 2 dat=SBUF;
176 2 ACC=dat;
177 2 x=P;
178 2 if(x==RB8)
179 2 return dat;
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 4
180 2 else
181 2 {//奇偶效验错误时,从(10.5±0.2)基本时间单元(etu)开始,
182 3 REN=0;
183 3 j=50; //从(10.5±0.2)基本时间单元(etu)开始
184 3 while(--j);
185 3 RXD=0; //传送一个状态为A(低电平),最少为1etu,最大为2etu的差错信号
186 3 j=120; //Bps9600: Etu=104 us ;
187 3 while(--j);
188 3 RXD=1;
189 3 j=104; //卡在至少2etu后重发数据
190 3 while(--j);
191 3 REN=1;
192 3 }
193 2 }
194 1 }
195
196 //TS T0 TA1 TB1 TC1 TD1 TA2 TB2 TC2 TD2 TA3 TB3 TC3 TD3 TA(i) TB(i) TC(i) TD(i) T1 T2 ... TK TCK
197 uchar SimATR()
198 {
199 1 uchar i,m,n,len,k,f,x,y,v,TX[24];
200 1 uchar dat;
201 1
202 1 memset(TX,0,sizeof(TX));
203 1 len=2;
204 1 SimGuardTime=0;
205 1 SimWaitTime=10;
206 1 i=0;v=0;
207 1 f=0;k=0;
208 1 x=0;y=0;
209 1 m=0;n=0;
210 1 while(1)
211 1 {
212 2 // RxdLen=len; //TEST
213 2 dat=SimRxdByte();
214 2 if(SimTimeOut==1)
215 2 return 0;
216 2 RxdBuf[i]=dat;
217 2 if(i==1)
218 2 {
219 3 m=2;n=2;
220 3 len+=(dat&0x0F); //历史字节数目
221 3 if(dat&0x10){TX[0]=1;len++;m++;n++;} //判断TA1-TD1是否存在
222 3 if(dat&0x20){TX[1]=1;len++;m++;n++;}
223 3 if(dat&0x40){TX[2]=1;len++;n++;}
224 3 if(dat&0x80){TX[3]=1;len++;}
225 3 }
226 2 if(i==m && TX[2]==1)
227 2 {//额外保护时间N=TC1
228 3 if(dat==255)SimGuardTime=0;
229 3 else SimGuardTime=dat;
230 3 }
231 2 if(i==n && TX[3]==1) //TD1存在并且已经收到
232 2 {
233 3 if((dat&0x0F)!=0)
234 3 {//TCK存在
235 4 f=1;
236 4 len++;
237 4 }
238 3 x=n+1;
239 3 y=x;
240 3 if(dat&0x10){TX[4]=1;len++;x++;y++;} //判断TA2-TD2是否存在
241 3 if(dat&0x20){TX[5]=1;len++;x++;y++;}
C51 COMPILER V8.01 SIM 03/28/2006 09:48:50 PAGE 5
242 3 if(dat&0x40){TX[6]=1;len++;y++;}
243 3 if(dat&0x80){TX[7]=1;len++;}
244 3 }
245 2 if(i==x && TX[6]==1) //TC2存在并且已经收到
246 2 {//最大工作等待时间
247 3 k=dat;
248 3 }
249 2 if(i==y && TX[7]==1) //TD2存在并且已经收到
250 2 {
251 3 if(f==0 && ((dat&0x0F)!=0))
252 3 {//TCK存在
253 4 f=1;
254 4 len++;
255 4 }
256 3 v=y+1;
257 3 if(dat&0x10){TX[8]=1;len++;v++;} //判断TA3-TD3是否存在
258 3 if(dat&0x20){TX[9]=1;len++;v++;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -