⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.#3

📁 12232液晶单片机驱动程序源代码
💻 #3
📖 第 1 页 / 共 5 页
字号:
               case 0x02:
			       e2key_secotor=Receive_Buf_UART1[5];                                                               			           
           	       status= Mf500PiccAuthE2(selec_abkey,csn,e2key_secotor,sector_num);
                   // 参数e2key_secotor 0 <= e2key_sector <= 15此为e2rom的扇区号                     
                   // 参数sector_num为卡的扇区0  block  0 <= block <= 15 即为认证的卡的扇区                   
                   if(status==0)                 		
                          SEND_ICINFO_PC(1,0,0,NULL);                            
                   else  
                          SEND_ICINFO_PC(1,1,0,NULL); 
                   SpeakSound();
				   break;   
			   default:
			        SEND_ICINFO_PC(1,2,0,NULL);
					SpeakSound();
			    	break;                                                 
				}    
               break;

		 case 0x02:  //卡的初始化值操作
               block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
               memmove(temp_buf,Receive_Buf_UART1+4,16);   //搬移16个16进制数      			                                                                      
               status=Mf500PiccWrite(block_num,temp_buf);                              
 			   if(status==0)                 		
               	   SEND_ICINFO_PC(2,0,0,NULL);                             
               else  
                   SEND_ICINFO_PC(2,1,0,NULL);                                
               SpeakSound();
               break;		
					
    	 case 0x03:   //卡的增减值操作
               block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
               //memmove(temp_buf,RECEIVEBUFFER+5,1);   //搬移1个16进制数  
               temp_buf[0]=Receive_Buf_UART1[5];
               temp_buf[1]=Receive_Buf_UART1[6];
               temp_buf[2]=0;
               temp_buf[3]=0;
               switch(Receive_Buf_UART1[4]){
		       case 0x01:
			       status=Mf500PiccValue(0xc0,block_num,temp_buf,block_num);//减值
                   if(status==0)
                         SEND_ICINFO_PC(3,0,0,NULL);                                                                        
                   else
			             SEND_ICINFO_PC(3,1,0,NULL);  
                   SpeakSound();
				   break; 
			   case 0x02:
                   status=Mf500PiccValue(0xc1,block_num,temp_buf,block_num); //增值操作                            
                   if(status==0)
                         SEND_ICINFO_PC(3,0,0,NULL);                                                                                    
                   else 
                         SEND_ICINFO_PC(3,1,0,NULL);                  
                   SpeakSound();
                   break;
			   default:
                   SEND_ICINFO_PC(3,2,0,NULL);  
			       break;							   
			   }    
			   break;

	   case 0x04:  //读写块操作					                             
           block_num=Receive_Buf_UART1[2]*4+Receive_Buf_UART1[3];
           switch(Receive_Buf_UART1[4]){
		       case 0x01:
				    status=Mf500PiccRead(block_num,rbuf);             
                    if(status==0)		                              
				           SEND_ICINFO_PC(4,0,16,rbuf);                                                                            
            		else
                           SEND_ICINFO_PC(4,1,0,NULL);                                                                                                          
                    SpeakSound(); 
                    break;
			   case 0x02:
                    memmove(temp_buf,Receive_Buf_UART1+5,16);   //搬移16个16进制数      			                                                                      
                    status=Mf500PiccWrite(block_num,temp_buf);                              
 			  		if(status==0)                 		
                 	       SEND_ICINFO_PC(4,0,0,NULL);  //显示写成功                             
                    else  
                           SEND_ICINFO_PC(4,1,0,NULL);     
                    SpeakSound();
                    break;
			   default:
			        SEND_ICINFO_PC(4,2,0,NULL);     
			        break; 
			   }
           break;

        case 0x05:  //卡密钥装载命令				                             
               block_num=Receive_Buf_UART1[2]*4+3;                   
               memmove(temp_buf,Receive_Buf_UART1+3,16);   //搬移16个16进制数      			                                                                      
               status=Mf500PiccWrite(block_num,temp_buf);                              
 			   if(status==0)                 		
                    SEND_ICINFO_PC(5,0,0,NULL);  //显示写成功                             
               else  
                    SEND_ICINFO_PC(5,1,0,NULL);
			   SpeakSound();		 
			   break;
									                               
        case 0x06://设备密钥装载命令 loadkeye2  将密钥装入RC500的密钥存贮区                                                 																																					                 
               if(Receive_Buf_UART1[3]==0x0A)
                       selec_abkey=PICC_AUTHENT1A;
               if(Receive_Buf_UART1[3]==0x0B) 
                       selec_abkey=PICC_AUTHENT1B; 
               e2key_secotor=Receive_Buf_UART1[2];
                    
               keybuf[0]=Receive_Buf_UART1[4];  
               keybuf[1]=Receive_Buf_UART1[5];
               keybuf[2]=Receive_Buf_UART1[6];
               keybuf[3]=Receive_Buf_UART1[7];
               keybuf[4]=Receive_Buf_UART1[8];
               keybuf[5]=Receive_Buf_UART1[9];

               status=Mf500PcdLoadKeyE2(selec_abkey,e2key_secotor,keybuf);  //first save key to e2rom
               if(status==00)             
             	     SEND_ICINFO_PC(6,0,0,NULL);  //显示写成功      
               else
                     SEND_ICINFO_PC(6,1,0,NULL);    
               SpeakSound();
               break;
                                                               
       default:
               SEND_ICINFO_PC(6,2,0,NULL);    
               break;
       }//run command
     }////接收成功
  }//while(1)                    
}//end main()


//串口0中断服务程序
// Head_Flag=0x0E	End_Flag=0x05  0x0A means 0x7D 
// when x<0x10  ,x= 0x7D x^0x10	
void  Seri_int(void)  interrupt 4
{ 
	if(RI0){ 

		RI0=0; 					// 清串口0标字位

		if(UART1_Receive_Len > 240)	                                                                                        
		{
			UART1_Receive_Len = 0;
			Receive_Flag_UART1 = 0;
		}

		if(SBUF0==0x0E)
		{				// 接收帧头
			Receive_Flag_UART1=1;
			UART1_Receive_Len = 0;
		}			
		else{

			if(Receive_Flag_UART1==1)
			{
								
				// 接收数据			
				if(SBUF0==0x05){
					Receive_Flag_UART1=0;
					Padding_Flag_UART1=0;
				 	UART1_Rec_Complete=1;
				}
				else if(Padding_Flag_UART1==1){
					Padding_Flag_UART1=0;
					Receive_Buf_UART1[UART1_Receive_Len] = SBUF0;
	  	        	Receive_Buf_UART1[UART1_Receive_Len] ^= 0x7D;
	  	        	UART1_Receive_Len++;
				}
				else if(SBUF0==0x7D){
					Padding_Flag_UART1=1;
				}
				else if(SBUF0==0x0A){
					Receive_Buf_UART1[UART1_Receive_Len] = 0x7D;
					UART1_Receive_Len++;
				}
				else{
					Receive_Buf_UART1[UART1_Receive_Len] = SBUF0;
					UART1_Receive_Len++;
				}							
			}
		}
	}						
}

// 向pc发送子程序
// command----命令,status_flag----应答状态,len-----应答数据长度,buf[]-----应答数据
//此函数请不要添加看门狗定时器复位,否则卡不能认证,不知为何,曾为此痛不于生
void SEND_ICINFO_PC(unsigned char command,unsigned char status_flag,unsigned char len,unsigned char buf[])
{
	unsigned char i;
	unsigned char checksum=0;
	unsigned char xdata buff[20];
    unsigned char Data_Len;

     DIR=1;
    Delay(5000);
    Delay(5000);
    Delay(5000);
    Delay(5000);
    Delay(5000);
    Delay(5000);
    Delay(5000);
    Delay(5000);
  
    Data_Len=0; 
    buff[Data_Len]=0x66;       //应答标志
	buff[++Data_Len]=command;  //命令 
	if(status_flag==0)
      	buff[++Data_Len]=0x00;   //成功标志
    else 
	    buff[++Data_Len]=0x01;	

    for(i=0;i<len;i++)
	    buff[++Data_Len]=buf[i];      
 
	for(i=0;i<Data_Len+1;i++)
	{ 
		checksum = checksum + buff[i];
	}

	buff[++Data_Len] = checksum;  //校验和

	TI0=0;
	SBUF0 = 0x0E;									// 发送帧头
	while(!TI0); TI0=0;

	for(i=0;i<Data_Len+1;i++)						// 发送数据
	{
		if(buff[i] == 0x7D)
		{
			SBUF0 = 0x0A;
			while(!TI0); TI0=0;
		}
		else if(buff[i]<0x10)
		{
			SBUF0 = 0x7D;
			while(!TI0); TI0=0;
			SBUF0 = buff[i]^0x7D;
			while(!TI0); TI0=0;
		}
		else 
		{
			SBUF0 = buff[i];
			while(!TI0); TI0=0;
		}
	}
	SBUF0 = 0x05;									// 发送帧尾
	while(!TI0); TI0=0;

//	SBUF1 = 0x05;									// 发送帧尾
//	while(!(SCON1 & 0x02)); SCON1 &=0xFD;
    DIR=0;
}

/****************************************************************************
*                                                                           *
* Function:   Mf500PcdConfig                                                  *
*                                                                           *
* Input:                                                                *
* Output:       STATE                                                     *
*                                                                           *
****************************************************************************/
char Mf500PcdConfig(void)
{
   
   unsigned int idata RstLoopCnt = 0;
   unsigned int idata CmdWaitCnt = 0;
    status = MI_RESETERR;
   // wait until reset command recognized
do
  {      
   Delay(100);     	// wait     
   PReset=1;   		// reset RC500
   Delay(300);      	// wait
   PReset=0; // clear reset pin
   Delay(300);      	// wait 
   } 
  while (ReadRC(RegPage) != 0x80);  
 do
 {   
       WriteRC(RegPage,0x0); // Dummy access in order to determine the bus 
 }while(ReadRC(RegCommand) != 0x00); // configuration
      // necessary read access 
      // after first write access, the returned value
      // should be zero ==> interface recognized
      if (ReadRC(RegCommand) != 0x00)
      {                           
          status = MI_INTERFACEERR;
      }
      else
      {
         status = 0;
      }

   if(status==0)
   {
    // loade2();
     
	 XBYTE[RegClockQControl]=0x0;
     XBYTE[RegClockQControl]=0x40;
  	
	 Delay(24);// wait approximately 100 us - calibration in progress
     ClearBitMask(RegClockQControl,0x40);  // clear bit ClkQCalib for 
     
	 XBYTE[RegBitPhase]=0xAd;      
     XBYTE[RegRxThreshold]=0xFF;   
     XBYTE[RegRxControl2]=01;
     XBYTE[RegFIFOLevel]=0x1A; // initialize to 26d 
     XBYTE[RegTimerControl]=0x02;  // TStopRxEnd=0,TStopRxBeg=0,当数据发送结束时定时器自动启动
     XBYTE[RegIRqPinConfig]=0x3; // interrupt active low enable管脚irq上的信号与位irq状态相反,标准cmos输出
   //XBYTE[RegRxWait]=0x02;       //////RxWait有默认值
	 status=PcdRfReset(1);            // Rf - reset and enable output driver   
   } 
   return status;
}
/****************************************************************************
Request 指令将通知MCM在天线有效的工作范围(距离)内寻找MIFARE 1卡片。如果有
MIFARE 1卡片存在,这一指令将分别与MIFARE 1进行通信,读取MIFARE 1卡片上的卡片
类型号TAGTYPE(2个字节),由MCM传递给MCU,进行识别处理。
程序员可以根据TAGTYPE来区别卡片的不同类型。
对于MIFARE 1卡片来说,返回卡片的TAGTYPE(2个字节)可能为0004h。
                                           
* Function:     Mf500PiccRequest                                                                              *
* Input:        req_code                                                      *
* Output:       TagType                                                     *
*                                                                           *
****************************************************************************/
char Mf500PiccRequest(unsigned char req_code, 
                         unsigned char *atq)
{
   
   char i;
   status = MI_OK;

      PcdSetTmo(2);
      
      WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
      ClearBitMask(RegControl,0x08);      // disable crypto 1 unit   
      WriteRC(RegBitFraming,0x07);        // set TxLastBits to 7 
      
      ResetInfo();   
        //AUXR=0;
        MSndBuffer[0] = req_code;
      MInfo.nBytesToSend   = 1;   
      status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
     
      if (status)      // error occured
      {
         atq[0] = 0;
      } 
      else 
      {
         if (MInfo.nBitsReceived != 16) // 2 bytes expected
         {
            atq[0] = 0;
            status = MI_BITCOUNTERR;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -