📄 main.lst
字号:
249 {
250 1 char status;
251 1 status=PcdSelect(g_cSNR, &g_cReceBuf[2]);
252 1 if (status!=MI_OK)
253 1 {
254 2
255 2 g_cReceBuf[0]=1;
256 2 g_cReceBuf[1]=status;
257 2 AnswerOk();
258 2 return;
259 2 }
260 1 g_cReceBuf[0]=3;
261 1 g_cReceBuf[1]=status;
262 1 AnswerOk();
263 1 }
264 ////////////////////////////////////////////////////////////////////////
265 ///校验密码
266 ///////////////////////////////////////////////////////////////////////
267 void ComM500PiccAuthE2()
268 {
269 1 char status;
270 1 unsigned char *pSNR;
271 1 pSNR = &g_cSNR;
272 1 status=PcdLoadKeyE2(g_cReceBuf[1],g_cReceBuf[2]);
273 1 if(status==0)
274 1 {
275 2 status = PcdAuthState(g_cReceBuf[1], g_cReceBuf[3], pSNR); //验证密钥
276 2 g_cReceBuf[0]=1;
277 2 g_cReceBuf[1]=status;
278 2 AnswerOk();
279 2 return;
280 2 }
281 1 AnswerOk();
282 1 }
283
284 //////////////////////////////////////////////////////////////////////
285 ///////////////////////////////////////////////////////////////////////
286 ///下载密码
287 ///////////////////////////////////////////////////////////////////////
288 void ComM500PcdLoadKeyE2()
289 {
290 1 char status;
291 1 status=M500PcdLoadKeyE2(g_cReceBuf[1],g_cReceBuf[2],&g_cReceBuf[3]);
292 1 g_cReceBuf[0]=1;
293 1 g_cReceBuf[1]=status;
294 1 AnswerOk();
295 1 }
296
297 /////////////////////////////////////////////////////////////////////
298 //响应上位机发送的A卡休眠命令
299 /////////////////////////////////////////////////////////////////////
300 void ComHlta()
301 {
302 1 unsigned char status;
303 1 status=PcdHalt();
C51 COMPILER V7.06 MAIN 05/01/2009 01:52:10 PAGE 6
304 1 g_cReceBuf[0]=1;
305 1 g_cReceBuf[1]=status;
306 1 AnswerOk();
307 1 }
308
309 /////////////////////////////////////////////////////////////////////
310 //响应上位机发送的A卡验证密钥命令
311 /////////////////////////////////////////////////////////////////////
312 void ComAuthentication()
313 {
314 1 char status = MI_COM_ERR;
315 1 unsigned char *pkeys,*pSNR;
316 1 pkeys = &g_cReceBuf[20];
317 1 pSNR = &g_cSNR;
318 1 if (MI_OK == ChangeCodeKey(&g_cReceBuf[3],pkeys)) //转换密钥格式
319 1 {
320 2 if (MI_OK == PcdAuthKey(pkeys)) //传送密钥到RC500FIFO
321 2 {
322 3 status = PcdAuthState(g_cReceBuf[1], g_cReceBuf[3], pSNR); //验证密钥
323 3 }
324 2 }
325 1 if (status == MI_OK)
326 1 { g_cReceBuf[0]=1;
327 2 g_cReceBuf[1]=status;
328 2 AnswerOk();
329 2 }
330 1
331 1 }
332
333 /////////////////////////////////////////////////////////////////////
334 //响应上位机读M1卡命令
335 /////////////////////////////////////////////////////////////////////
336 void ComM1Read()
337 {
338 1 char status;
339 1 status=PcdRead(g_cReceBuf[1], &g_cReceBuf[2]);
340 1 if (status==MI_OK)
341 1 {
342 2 if(g_cCidNad==mifare1||g_cCidNad==mifarepro)
343 2 g_cReceBuf[0]=17;
344 2 else if(g_cCidNad==1)
345 2 g_cReceBuf[0]=9;
346 2 else g_cReceBuf[0]=16;
347 2 g_cReceBuf[1]=status;
348 2 AnswerOk();
349 2 return;
350 2 }
351 1 else
352 1 { g_cReceBuf[0]=1; }
353 1 g_cReceBuf[1]=status;
354 1 AnswerOk();
355 1 }
356
357
358 /////////////////////////////////////////////////////////////////////
359 //响应上位机写M1卡命令
360 /////////////////////////////////////////////////////////////////////
361 void ComM1Write()
362 {
363 1 char status;
364 1 status=PcdWrite(g_cReceBuf[1], &g_cReceBuf[2]);
365 1 g_cReceBuf[0]=1;
C51 COMPILER V7.06 MAIN 05/01/2009 01:52:10 PAGE 7
366 1 g_cReceBuf[1]=status;
367 1 AnswerOk();
368 1
369 1 }
370 /////////////////////////////////////////////////////////////////////
371 //响应上位机扣款命令 充值命令
372 /////////////////////////////////////////////////////////////////////
373 void ComM1Decrement()
374 {
375 1 char status;
376 1 status=PcdValue(g_cReceBuf[1], g_cReceBuf[2], &g_cReceBuf[3]);
377 1 if (status==MI_OK)
378 1 {
379 2 g_cReceBuf[0]=1;
380 2 g_cReceBuf[1]=status;
381 2 AnswerOk();
382 2 return;
383 2 }
384 1 g_cReceBuf[0]=1;
385 1 g_cReceBuf[1]=status;
386 1 AnswerOk();
387 1 return;
388 1
389 1 }
390
391
392 /////////////////////////////////////////////////////////////////////
393 //正确执行完上位机指令,应答
394 //input:answerdata = 应答数据
395 // answernum = 数据长度
396 /////////////////////////////////////////////////////////////////////
397 void AnswerOk()
398 {
399 1 unsigned char len, i;
400 1 ES = 0; //不允许串行中断
401 1 TI=0; //清发送标志位
402 1 len=g_cReceBuf[0]; //长度
403 1 for(i=0;i<len+1;i++) //发送
404 1 {
405 2 SBUF=g_cReceBuf[i];
406 2 while(!TI);
407 2 TI=0;
408 2 }
409 1
410 1 TI = 0;
411 1 ES = 1;
412 1 }
413
414 /////////////////////////////////////////////////////////////////////
415 //串行中断,接收上位机数据
416 /////////////////////////////////////////////////////////////////////
417 seri_int () interrupt 4 using 1
418 {
419 1 unsigned char len, i;
420 1 unsigned int j=0;
421 1 if (RI)
422 1 {
423 2
424 2 ES=0;
425 2 len=SBUF; //首先接收数据包长度
426 2 RI=0;
427 2 for(i=0;i<len;i++)
C51 COMPILER V7.06 MAIN 05/01/2009 01:52:10 PAGE 8
428 2 {
429 3 while(!RI) //假如没有接收到第二个数据(命令字),则等待
430 3 {
431 4 j++;
432 4 if(j>1000) //超时退出接收中断
433 4 {
434 5 ES = 1;
435 5 break;
436 5 }
437 4 }
438 3 if(j<1000) //不超时超时
439 3 {
440 4 g_cReceBuf[i]=SBUF; //读出命令字和数据
441 4 RI=0;
442 4 j=0;
443 4 }
444 3 else //超时退出接收中断
445 3 {
446 4 ES = 1;
447 4 break;
448 4 }
449 3 }
450 2 if(i==len) //接收的个数与数据包长度一致接收正常
451 2 {
452 3 ES = 1;
453 3 g_bReceOk = 1; //置接收完成标志位
454 3 }
455 2 }
456 1
457 1 }
458
459
460 /////////////////////////////////////////////////////////////////////
461 //用T2做延时子程序
462 /////////////////////////////////////////////////////////////////////
463 void DelayMs(unsigned int _MS)
464 {
465 1 RCAP2LH = RCAP2_1ms;
466 1 T2LH = RCAP2_1ms;
467 1
468 1 ET2 = 0; // Disable timer2 interrupt
469 1 T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
470 1 TR2 = 1; //启动定时器2
471 1 while (_MS--)
472 1 {
473 2 while (!TF2); //判断有没有溢出
474 2 TF2 = 0;
475 2 }
476 1 TR2 = 0;
477 1 }
478 void Delay_50us(unsigned char _50us)
479 {
480 1 RCAP2LH = RCAP2_50us;
481 1 T2LH = RCAP2_50us;
482 1
483 1 ET2 = 0; // Disable timer2 interrupt
484 1 T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
485 1 while (_50us--)
486 1 { while (!TF2);TF2 = 0; }
487 1 TR2 = 0;
488 1 }
489
C51 COMPILER V7.06 MAIN 05/01/2009 01:52:10 PAGE 9
490
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1060 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 15
IDATA SIZE = 64 ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -