📄 main.lst
字号:
433 4 break;
434 4
435 4 case 0x05: //卡密钥装载命令
436 4 block_num=Receive_Buf_UART1[2]*4+3;
437 4 memmove(temp_buf,Receive_Buf_UART1+3,16); //搬移16个16进制数
-
438 4 status=Mf500PiccWrite(block_num,temp_buf);
439 4 if(status==0)
440 4 SEND_ICINFO_PC(5,0,0,NULL); //显示写成功
441 4 else
442 4 SEND_ICINFO_PC(5,1,0,NULL);
443 4 SpeakSound();
444 4 break;
445 4
446 4 case 0x06://设备密钥装载命令 loadkeye2 将密钥装入RC500的密钥存贮区
-
447 4 if(Receive_Buf_UART1[3]==0x0A)
448 4 selec_abkey=PICC_AUTHENT1A;
449 4 if(Receive_Buf_UART1[3]==0x0B)
450 4 selec_abkey=PICC_AUTHENT1B;
451 4 e2key_secotor=Receive_Buf_UART1[2];
452 4
453 4 keybuf[0]=Receive_Buf_UART1[4];
454 4 keybuf[1]=Receive_Buf_UART1[5];
455 4 keybuf[2]=Receive_Buf_UART1[6];
456 4 keybuf[3]=Receive_Buf_UART1[7];
457 4 keybuf[4]=Receive_Buf_UART1[8];
458 4 keybuf[5]=Receive_Buf_UART1[9];
459 4
460 4 status=Mf500PcdLoadKeyE2(selec_abkey,e2key_secotor,keybuf); //first save key to e2rom
461 4 if(status==00)
462 4 SEND_ICINFO_PC(6,0,0,NULL); //显示写成功
463 4 else
464 4 SEND_ICINFO_PC(6,1,0,NULL);
465 4 SpeakSound();
466 4 break;
467 4
468 4 default:
469 4 SEND_ICINFO_PC(6,2,0,NULL);
470 4 break;
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 9
471 4 }//run command
472 3 }////接收成功
473 2 }//while(1)
474 1 }//end main()
*** WARNING 280 IN LINE 214 OF MAIN.C: 'j': unreferenced local variable
475
476
477 //串口0中断服务程序
478 // Head_Flag=0x0E End_Flag=0x05 0x0A means 0x7D
479 // when x<0x10 ,x= 0x7D x^0x10
480 void Seri_int(void) interrupt 4
481 {
482 1 if(RI0){
483 2
484 2 RI0=0; // 清串口0标字位
485 2
486 2 if(UART1_Receive_Len > 240)
-
487 2 {
488 3 UART1_Receive_Len = 0;
489 3 Receive_Flag_UART1 = 0;
490 3 }
491 2
492 2 if(SBUF0==0x0E)
493 2 { // 接收帧头
494 3 Receive_Flag_UART1=1;
495 3 UART1_Receive_Len = 0;
496 3 }
497 2 else{
498 3
499 3 if(Receive_Flag_UART1==1)
500 3 {
501 4
502 4 // 接收数据
503 4 if(SBUF0==0x05){
504 5 Receive_Flag_UART1=0;
505 5 Padding_Flag_UART1=0;
506 5 UART1_Rec_Complete=1;
507 5 }
508 4 else if(Padding_Flag_UART1==1){
509 5 Padding_Flag_UART1=0;
510 5 Receive_Buf_UART1[UART1_Receive_Len] = SBUF0;
511 5 Receive_Buf_UART1[UART1_Receive_Len] ^= 0x7D;
512 5 UART1_Receive_Len++;
513 5 }
514 4 else if(SBUF0==0x7D){
515 5 Padding_Flag_UART1=1;
516 5 }
517 4 else if(SBUF0==0x0A){
518 5 Receive_Buf_UART1[UART1_Receive_Len] = 0x7D;
519 5 UART1_Receive_Len++;
520 5 }
521 4 else{
522 5 Receive_Buf_UART1[UART1_Receive_Len] = SBUF0;
523 5 UART1_Receive_Len++;
524 5 }
525 4 }
526 3 }
527 2 }
528 1 }
529
530 // 向pc发送子程序
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 10
531 // command----命令,status_flag----应答状态,len-----应答数据长度,buf[]-----应答数据
532 //此函数请不要添加看门狗定时器复位,否则卡不能认证,不知为何,曾为此痛不于生
533 void SEND_ICINFO_PC(unsigned char command,unsigned char status_flag,unsigned char len,unsigned char buf[])
534 {
535 1 unsigned char i;
536 1 unsigned char checksum=0;
537 1 unsigned char xdata buff[20];
538 1 unsigned char Data_Len;
539 1
540 1 DIR=1;
541 1 Delay(5000);
542 1 Delay(5000);
543 1 Delay(5000);
544 1 Delay(5000);
545 1 Delay(5000);
546 1 Delay(5000);
547 1 Delay(5000);
548 1 Delay(5000);
549 1
550 1 Data_Len=0;
551 1 buff[Data_Len]=0x66; //应答标志
552 1 buff[++Data_Len]=command; //命令
553 1 if(status_flag==0)
554 1 buff[++Data_Len]=0x00; //成功标志
555 1 else
556 1 buff[++Data_Len]=0x01;
557 1
558 1 for(i=0;i<len;i++)
559 1 buff[++Data_Len]=buf[i];
560 1
561 1 for(i=0;i<Data_Len+1;i++)
562 1 {
563 2 checksum = checksum + buff[i];
564 2 }
565 1
566 1 buff[++Data_Len] = checksum; //校验和
567 1
568 1 TI0=0;
569 1 SBUF0 = 0x0E; // 发送帧头
570 1 while(!TI0); TI0=0;
571 1
572 1 for(i=0;i<Data_Len+1;i++) // 发送数据
573 1 {
574 2 if(buff[i] == 0x7D)
575 2 {
576 3 SBUF0 = 0x0A;
577 3 while(!TI0); TI0=0;
578 3 }
579 2 else if(buff[i]<0x10)
580 2 {
581 3 SBUF0 = 0x7D;
582 3 while(!TI0); TI0=0;
583 3 SBUF0 = buff[i]^0x7D;
584 3 while(!TI0); TI0=0;
585 3 }
586 2 else
587 2 {
588 3 SBUF0 = buff[i];
589 3 while(!TI0); TI0=0;
590 3 }
591 2 }
592 1 SBUF0 = 0x05; // 发送帧尾
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 11
593 1 while(!TI0); TI0=0;
594 1
595 1 // SBUF1 = 0x05; // 发送帧尾
596 1 // while(!(SCON1 & 0x02)); SCON1 &=0xFD;
597 1 DIR=0;
598 1 }
599
600 /****************************************************************************
601 * *
602 * Function: Mf500PcdConfig *
603 * *
604 * Input: *
605 * Output: STATE *
606 * *
607 ****************************************************************************/
608 char Mf500PcdConfig(void)
609 {
610 1
611 1 unsigned int idata RstLoopCnt = 0;
612 1 unsigned int idata CmdWaitCnt = 0;
613 1 status = MI_RESETERR;
614 1 // wait until reset command recognized
615 1 do
616 1 {
617 2 Delay(100); // wait
618 2 PReset=1; // reset RC500
619 2 Delay(300); // wait
620 2 PReset=0; // clear reset pin
621 2 Delay(300); // wait
622 2 }
623 1 while (ReadRC(RegPage) != 0x80);
624 1 do
625 1 {
626 2 WriteRC(RegPage,0x0); // Dummy access in order to determine the bus
627 2 }while(ReadRC(RegCommand) != 0x00); // configuration
628 1 // necessary read access
629 1 // after first write access, the returned value
630 1 // should be zero ==> interface recognized
631 1 if (ReadRC(RegCommand) != 0x00)
632 1 {
633 2 status = MI_INTERFACEERR;
634 2 }
635 1 else
636 1 {
637 2 status = 0;
638 2 }
639 1
640 1 if(status==0)
641 1 {
642 2 // loade2();
643 2
644 2 XBYTE[RegClockQControl]=0x0;
645 2 XBYTE[RegClockQControl]=0x40;
646 2
647 2 Delay(24);// wait approximately 100 us - calibration in progress
648 2 ClearBitMask(RegClockQControl,0x40); // clear bit ClkQCalib for
649 2
650 2 XBYTE[RegBitPhase]=0xAd;
651 2 XBYTE[RegRxThreshold]=0xFF;
652 2 XBYTE[RegRxControl2]=01;
653 2 XBYTE[RegFIFOLevel]=0x1A; // initialize to 26d
654 2 XBYTE[RegTimerControl]=0x02; // TStopRxEnd=0,TStopRxBeg=0,当数据发送结束时定时器自动启动
C51 COMPILER V6.00i MAIN 07/16/2004 10:11:59 PAGE 12
655 2 XBYTE[RegIRqPinConfig]=0x3; // interrupt active low enable管脚irq上的信号与位irq状态相反,标准cmos输
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -