📄 memcard.lst
字号:
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE MEMCARD
OBJECT MODULE PLACED IN memcard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE memcard.c DB OE SMALL ROM(LARGE)
stmt level source
1 #include <stdio.h>
2 #include <string.h>
3 #include "memcard.h"
4 //#include "memcard1.h"
5 #pragma ot(2)
6 void delay(uint iTime)
7 {
8 1 uint i;
9 1 for(i=0;i<iTime;i++);
10 1 }
11
12 //上电函数
13 void power_on(void)
14 {
15 1 VCC = 1;
16 1 }
17
18 //下电函数
19 void power_down(void)
20 {
21 1 VCC = 0;
22 1 }
23
24 /*******************************************************************************************/
25 /********以下为SLE4442卡的函数**************************************************************/
26 /*******************************************************************************************/
27
28 //复位应答
29 void answer_reset_4442(void)
30 {
31 1 uchar data i;
32 1 RST=HIGH;
33 1 SDA=HIGH;
34 1 delay(DELAY_SCL_4442);
35 1 SCL = 0;
36 1 delay(DELAY_SCL_4442);
37 1 SCL = 1;
38 1 delay(DELAY_SCL_4442);
39 1 RST=LOW;
40 1 delay(DELAY_SCL_4442);
41 1 for(i=0;i<32;i++)
42 1 {
43 2 SCL = 0;
44 2 delay(DELAY_SCL_4442);
45 2 SCL = 1;
46 2 delay(DELAY_SCL_4442);
47 2 }
48 1 return;
49 1 }
50 //////////////////////////////////////////////////////////////////////////////
51 //开始状态
52 void begin_4442(void)
53 {
54 1 SDA=HIGH;
55 1 delay(DELAY_SCL_4442);
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 2
56 1 SCL = 0;
57 1 delay(DELAY_SCL_4442);
58 1 SDA=LOW;
59 1 delay(DELAY_SCL_4442);
60 1 SCL = 1;
61 1 return;
62 1 }
63
64 //结束状态
65 void stop_4442(void)
66 {
67 1 SDA=LOW;
68 1 delay(DELAY_SCL_4442);
69 1 SCL = 0;
70 1 delay(DELAY_SCL_4442);
71 1 SDA=HIGH;
72 1 return;
73 1 }
74
75 //检查写入是否完毕
76 bit process_4442(void)
77 {
78 1 uchar data i;
79 1 stop_4442();
80 1 SCL = 1;
81 1 for(i=0;i<256;i++)
82 1 {
83 2 SCL = 0;
84 2 delay(DELAY_SCL_4442);
85 2 SCL = 1;
86 2 delay(DELAY_SCL_4442);
87 2 SDA=HIGH;
88 2 if(SDA==HIGH)
89 2 return TRUE;
90 2 }
91 1 return FALSE;
92 1 }
93 //读取一个字节保护位(a)
94 uchar byte_read_4442_a(void)
95 {
96 1 uchar data cTemp,i;
97 1 cTemp=0x00;
98 1 SDA=HIGH;
99 1 for(i=0;i<8;i++)
100 1 {
101 2 cTemp*=2;
102 2 SCL = 1;
103 2 delay(DELAY_SCL_4442);
104 2 if(SDA==HIGH)
105 2 cTemp++;
106 2 SCL = 0;
107 2 delay(DELAY_SCL_4442);
108 2 }
109 1 return cTemp;
110 1 }
111 //写入一个字节
112 void byte_write_4442(uchar cTemp)
113 {
114 1 uchar data i;
115 1 for(i=0;i<8;i++)
116 1 {
117 2 SDA=cTemp&0x01;
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 3
118 2 SCL = 0;
119 2 delay(DELAY_SCL_4442);
120 2 SCL = 1;
121 2 delay(DELAY_SCL_4442);
122 2 cTemp=cTemp>>1;
123 2 }
124 1 }
125
126 //读取一个字节(b)
127 uchar byte_read_4442_b(void)
128 {
129 1 uchar data cTemp,i;
130 1 cTemp=0x00;
131 1 SDA=HIGH;
132 1 for(i=0;i<8;i++)
133 1 {
134 2 cTemp=cTemp/2;
135 2 SCL = 1;
136 2 delay(DELAY_SCL_4442);
137 2 if(SDA==HIGH)
138 2 cTemp=cTemp+0x80;
139 2 SCL = 0;
140 2 delay(DELAY_SCL_4442);
141 2 }
142 1 return cTemp;
143 1 }
144
145 uchar error_counter_4442(void)
146 {
147 1 uchar data cTemp,i;
148 1 answer_reset_4442();
149 1 begin_4442();
150 1 byte_write_4442(0x31);
151 1 for(i=0;i<2;i++)
152 1 {
153 2 byte_write_4442(0x00);
154 2 }
155 1 stop_4442();
156 1 cTemp=byte_read_4442_b();
157 1 return cTemp&0x07;
158 1 }
159 /*功能:从SLE4442中读取数据
160 参数:
161 iOffset:读取数据起始地址
162 iReadLen:读取数据长度
163 sBuffer:读取数据指针
164 返回:
165 OP_OK
166 */
167 bit read_sle4442(uchar iOffset,uchar iReadLen,uchar *sBuffer)
168 {
169 1 uchar data i;
170 1 if((iOffset<0)||(iOffset>255))
171 1 return FALSE;
172 1 if((256-iOffset)<iReadLen)
173 1 return FALSE;
174 1 answer_reset_4442();
175 1 begin_4442();
176 1 byte_write_4442(0x30);
177 1 byte_write_4442(iOffset);
178 1 byte_write_4442(0x00);
179 1 stop_4442();
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 4
180 1 for(i=0;i<iReadLen;i++)
181 1 {
182 2 *sBuffer++=byte_read_4442_b();
183 2 }
184 1 stop_4442();
185 1 return TRUE;
186 1 }
187 /*
188 功能:向SLE4442中写入数据
189 参数:
190 iOffset:写入数据起始地址
191 iWriteLen:写入数据长度
192 sBuffer:写入数据指针
193 返回:
194 OP_OK
195 */
196 bit write_sle4442(uchar iOffset,uchar iWriteLen,uchar* sBuffer)
197 {
198 1 uchar data i,ipOffset;
199 1 uchar *swBuffer;
200 1 if((iOffset<0)||(iOffset>255))
201 1 return FALSE;
202 1 if((256-iOffset)<iWriteLen)
203 1 return FALSE;
204 1 swBuffer=sBuffer;
205 1 ipOffset=iOffset;
206 1 answer_reset_4442();
207 1 for(i=0;i<iWriteLen;i++)
208 1 {
209 2 begin_4442();
210 2 byte_write_4442(0x38);
211 2 byte_write_4442(ipOffset++);
212 2 byte_write_4442(*swBuffer++);
213 2 if(process_4442()!=TRUE)
214 2 return FALSE;
215 2 }
216 1 answer_reset_4442();
217 1 begin_4442();
218 1 byte_write_4442(0x30);
219 1 byte_write_4442(iOffset);
220 1 byte_write_4442(0x00);
221 1 stop_4442();
222 1 for(i=0;i<iWriteLen;i++)
223 1 {
224 2 if(byte_read_4442_b()!=*sBuffer++)
225 2 return FALSE;
226 2 }
227 1 stop_4442();
228 1 return TRUE;
229 1 }
230 /*
231 功能:读SLE4442卡保护位
232 参数:
233 sBuffer:读取数据指针
234 iReadLen:读取数据长度
235 返回:
236 OP_OK
237 */
238 bit read_pbit_sle4442(uchar iReadLen,uchar* sBuffer)
239 {
240 1 uchar i;
241 1 if(iReadLen!=4)
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 5
242 1 return FALSE;
243 1 answer_reset_4442();
244 1 begin_4442();
245 1 byte_write_4442(0x34);
246 1 for(i=0;i<2;i++)
247 1 byte_write_4442(0xff);
248 1 stop_4442();
249 1 for(i=0;i<iReadLen;i++)
250 1 *sBuffer++=byte_read_4442_a();
251 1 return TRUE;
252 1 }
253
254 /*
255 功能:写SLE4442卡保护位
256 参数:
257 iOffset:写入数据起始地址
258 sBuffer:写入数据指针
259 iBufferLen:写入长度
260 返回:
261 OP_OK
262 */
263 bit write_pbit_sle4442(uchar iOffset,uchar iBufferLen,uchar* sBuffer)
264 {
265 1 uchar data i;
266 1 if((iOffset<0)||(iOffset>31))
267 1 return FALSE;
268 1 if(iBufferLen>(32-iOffset))
269 1 return FALSE;
270 1 answer_reset_4442();
271 1 for(i=0;i<iBufferLen;i++)
272 1 {
273 2 begin_4442();
274 2 byte_write_4442(0x3c);
275 2 byte_write_4442(iOffset++);
276 2 byte_write_4442(*sBuffer++);
277 2 if(process_4442()!=TRUE)
278 2 return FALSE;
279 2 }
280 1 return TRUE;
281 1 }
282
283 /*
284 功能:比较SLE4442密码
285 参数:
286 sPassword:密码存放指针
287 iPassLen:密码长度
288 返回:
289 OP_OK
290 */
291 bit compare_password_sle4442(uchar* sPassword,uchar iPassLen)
292 {
293 1 uchar data i,cTemp;
294 1 if(iPassLen!=3)
295 1 return FALSE;
296 1 cTemp=error_counter_4442();
297 1 if(cTemp==0x00)
298 1 return FALSE;
299 1 switch(cTemp)
300 1 {
301 2 case 0x01,0x03,0x07:
302 2 {
303 3 cTemp=cTemp&0xfe;
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 6
304 3 break;
305 3 }
306 2 case 0x02,0x06:
307 2 {
308 3 cTemp=cTemp&0xfc;
309 3 break;
310 3 }
311 2 case 0x04:
312 2 {
313 3 cTemp=cTemp&0xf8;
314 3 break;
315 3 }
316 2 default:
317 2 {
318 3 return FALSE;
319 3 }
320 2 }
321 1 answer_reset_4442();
322 1 begin_4442();
323 1 byte_write_4442(0x39);
324 1 byte_write_4442(0x00);
325 1 byte_write_4442(cTemp);
326 1 if(process_4442()!=TRUE)
327 1 {
328 2 return FALSE;
329 2 }
330 1 for(i=1;i<=iPassLen;i++)
331 1 {
332 2 begin_4442();
333 2 byte_write_4442(0x33);
334 2 byte_write_4442(i);
335 2 byte_write_4442(*sPassword++);
336 2 if(process_4442()!=TRUE)
337 2 {
338 3 return FALSE;
339 3 }
340 2 }
341 1 answer_reset_4442();
342 1 begin_4442();
343 1 byte_write_4442(0x39);
344 1 byte_write_4442(0x00);
345 1 byte_write_4442(0xff);
346 1 if(process_4442()!=TRUE)
347 1 {
348 2 return FALSE;
349 2 }
350 1 if(error_counter_4442()!=0x07)
351 1 {
352 2 return FALSE;
353 2 }
354 1 return TRUE;
355 1 }
356
357 /*
358 功能:读取SLE4442密码
359 参数:
360 sPassword:密码存放指针
361 iPassLen:密码长度
362 返回:
363 OP_OK
364 */
365 bit read_password_sle4442(uchar* sPassword,uchar iPassLen)
C51 COMPILER V6.12 MEMCARD 12/09/2002 13:03:11 PAGE 7
366 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -