📄 sle4442.lst
字号:
199 unsigned char ByteNum --- 要写入的字节数(1 - 256)
200 unsigned char *WriteBuf --- 写入数据缓冲区
201 输 出: 0 --- 写成功
202 1 --- 表示无效卡或者卡损坏
203 注 意:要校验密钥正确,才能对卡的主存储器写入数据
204 *****************************************************************/
205 unsigned char WriteCm(unsigned char StarAdr,unsigned char ByteNum,unsigned char *WriteBuf)
206 {
207 1 unsigned char i = 0;
208 1
209 1 if (RstCard() == 1) /* 使卡复位*/
210 1 return 1; /* 如果复位失败返回1 */
211 1
212 1 for(i = 0; i < ByteNum; i++)
213 1 {
214 2 SendCommand(0x38,StarAdr,*WriteBuf); //发送写主存储区命令
215 2 SendClock(); //发送处理脉冲
216 2 StarAdr++; //写入字节地址加1
217 2 WriteBuf++; //写入缓冲区指针加1
218 2 }
219 1 return 0;
220 1 }
221
222 /******************************************************************
223 函数名称:ReadPm
224 功 能:读保护存储器,并把保护存储器的4字节的内容存在RecBuf中
225 输 入:unsigned char *RecBuf --- 接收数据缓冲区,长度为4个字节
226 输 出:0 --- 读成功
227 1 --- 表示无效卡或者卡损坏
228 *******************************************************************/
229 unsigned char ReadPm(unsigned char *RecBuf)
230 {
231 1 unsigned char i = 0;
232 1
233 1 if (RstCard() == 1) /* 使卡复位*/
234 1 return 1; /* 如果复位失败返回1 */
235 1
236 1 SendCommand(0x34,0x00,0x00); //读保护存储器命令
237 1
238 1 IO = 1; // 置IO口为输入状态
239 1 Delay10Us(); // 延时一下
240 1
241 1 for(i = 0; i < 4; i++) //读保护存储器4个字节
C51 COMPILER V7.09 SLE4442 09/17/2004 11:10:16 PAGE 5
242 1 {
243 2 *RecBuf=Readchar();
244 2 RecBuf++; //接收缓冲区指针加1
245 2 }
246 1
247 1 SendClock(); //发送处理脉冲
248 1
249 1 return 0;
250 1 }
251
252 /********************************************************************
253 函数名称:WritePm
254 功 能:写保护数据存储器
255 输 入:unsigned char StartAdr --- 起始地址(0 - 31)
256 unsigned char ByteNum --- 写入的字节数(1 - 32)
257 unsigned char *WriteBuf --- 写入数据缓冲区
258 输 出:0 --- 写成功
259 1 --- 表示无效卡或者卡损坏
260 注 意: 首先校验密钥正确,才能对卡的护存储器写入数据,
261 其次写入的数据必须与卡中对应的数据相等才能写入
262 *********************************************************************/
263 unsigned char WritePm(unsigned char StartAdr,unsigned char ByteNum,unsigned char *WriteBuf)
264 {
265 1 unsigned char i;
266 1
267 1 if (RstCard() == 1) /* 使卡复位*/
268 1 return 1; /* 如果复位失败返回1 */
269 1
270 1 for (i = 0; i < ByteNum; i++)
271 1 {
272 2 SendCommand(0x3c,StartAdr,*WriteBuf); //写入一个字节
273 2 SendClock(); //发送写命令处理脉冲
274 2 StartAdr++; //写入字节地址加1
275 2 WriteBuf++; //写入缓冲区指针加1
276 2 }
277 1 return 0;
278 1 }
279
280 /**********************************************************************
281 函数名称:ReadPsw
282 功 能:读加密存储器
283 输 入:unsigned char *Psw --- 用于装读到的加密存储器内容,长度为4个字节
284 Psw第一字节: 错误计数器值
285 Psw第二字节到第四字节: 卡的密码值
286 输 出:0 --- 读成功
287 1 --- 表示无效卡或者卡损坏
288 注 意: 必须校验密码正确才能读到正确的密钥值,否则读到的密码值为00 00 00
289 ***********************************************************************/
290 unsigned char ReadPsw(unsigned char *Psw)
291 {
292 1 unsigned char i = 0;
293 1
294 1 if (RstCard() == 1) /* 使卡复位*/
295 1 return 1; /* 如果复位失败返回1 */
296 1
297 1 SendCommand(0x31,0,0); //读加密存储器命令
298 1
299 1 for(i = 0; i < 4; i++) //读加密存储器的四个字节
300 1 {
301 2 *Psw = Readchar();
302 2 Psw++;
303 2 }
C51 COMPILER V7.09 SLE4442 09/17/2004 11:10:16 PAGE 6
304 1 return 0;
305 1 }
306
307 /*********************************************************************
308 函数名称:CheckPsw
309 功 能:校验密码,把Psw中1,2,3字节的内容分别与加密存储器的1,2,3字节比较
310 输 入:unsigned char *Psw --- 待校验的密码值,长度为3个字节
311 输 出: 3: 核对密码成功
312 0: 卡已报废
313 1: 只剩一次校验机会,校验密码失败
314 2: 只剩二次校验机会,校验密码失败
315 4: 卡为无效卡或已损坏
316 **********************************************************************/
317 unsigned char CheckPsw(unsigned char *Psw)
318 {
319 1 unsigned char ReadBuf[4];
320 1 unsigned char i = 0;
321 1
322 1 if (ReadPsw(ReadBuf) == 1) //读加密存储器
323 1 return 4;
324 1
325 1 if(ReadBuf[0]==0x07)
326 1 {
327 2 SendCommand(0x39,0,0x03); //将EC写为0x03
328 2 SendClock(); //发送处理脉冲
329 2 }
330 1 else if(ReadBuf[0]==0x06 || ReadBuf[0]==0x05 || ReadBuf[0]==0x03)
331 1 {
332 2 SendCommand(0x39,0,0x01); //将EC写为0x01
333 2 SendClock(); //发送处理脉冲
334 2 }
335 1 else if(ReadBuf[0]==0x01 || ReadBuf[0]==0x02 || ReadBuf[0]==0x04)
336 1 {
337 2 SendCommand(0x39,0,0x00); //将EC写为0x00
338 2 SendClock(); //发送处理脉冲
339 2 }
340 1
341 1 SendCommand(0x33,1,Psw[0]); //校验密码的第一个字节
342 1 SendClock();
343 1 SendCommand(0x33,2,Psw[1]); //校验密码的第二个字节
344 1 SendClock();
345 1 SendCommand(0x33,3,Psw[2]); //校验密码的第三个字节
346 1 SendClock();
347 1
348 1 SendCommand(0x39,0,0x07); //擦除错误计数器
349 1 SendClock();
350 1
351 1 SendCommand(0x31,0,0); //读加密存储器命令
352 1
353 1 for(i = 0;i < 4;i++)
354 1 {
355 2 ReadBuf[i]=Readchar(); //读加密存储器的四个字节
356 2 }
357 1
358 1 if(ReadBuf[0] == 0x07) return 3; //剩下3次校验机会,校验密码成功
359 1 else if(ReadBuf[0] == 0x06 || ReadBuf[0] == 0x05 || ReadBuf[0] == 0x03) return 2;
360 1 //剩下2次校验机会,校验密码失败
361 1 else if(ReadBuf[0] == 0x04 || ReadBuf[0] == 0x02 || ReadBuf[0] == 0x01) return 1;
362 1 //剩下1次校验机会,校验密码失败
363 1 else return 0; //剩下0次校验机会,卡报废
364 1 }
365
C51 COMPILER V7.09 SLE4442 09/17/2004 11:10:16 PAGE 7
366 /**********************************************************************
367 函数名称:SetPsw
368 功 能:修改加密存储器中的密码
369 输 入:NewPsw -- 新密码缓冲区,长度为3个字节
370 输 出:0 --- 读成功
371 1 --- 表示无效卡或者卡损坏
372 注 意: 必须校验密码成功后才能修改密码, 否则密码写不进卡中
373 ***********************************************************************/
374 unsigned char SetPsw(unsigned char *NewPsw)
375 {
376 1 unsigned char i;
377 1
378 1 if (RstCard() == 1) /* 使卡复位*/
379 1 return 1; /* 如果复位失败返回1 */
380 1
381 1 for (i = 0; i < 3; i++)
382 1 {
383 2 SendCommand(0x39,i + 1,*NewPsw); //发送新的密码值
384 2 SendClock(); //发送处理脉冲
385 2 NewPsw++; //密码值缓冲区指针加1
386 2 }
387 1 return 0;
388 1 }
389
390
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1110 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 34
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -