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

📄 m500auc.c

📁 51+rc500阅读器源码程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    else
    {
        ClearBitMask(RegTxControl,0x03);  
    }
    return status;
}

#pragma noaregs

///////////////////////////////////////////////////////////////////////
// Delay 50us
///////////////////////////////////////////////////////////////////////
void delay_50us(unsigned char _50us)
{
    while(_50us--)
	{
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    }
}

///////////////////////////////////////////////////////////////////////
// Delay 1ms
///////////////////////////////////////////////////////////////////////
void delay_1ms(unsigned char _1ms)
{
#ifndef NO_TIMER2
    RCAP2LH = RCAP2_1ms;
    T2LH    = RCAP2_1ms;

    TR2 = TRUE;
    while (_1ms--)
    {
	    while (!TF2);
	    TF2 = FALSE;
    }
    TR2 = FALSE;
#else
    while (_1ms--)
    {
	    delay_50us(20);
    }
#endif
}

///////////////////////////////////////////////////////////////////////
// Delay 10ms
///////////////////////////////////////////////////////////////////////
void delay_10ms(unsigned int _10ms)
{
#ifndef NO_TIMER2
    RCAP2LH = RCAP2_10ms;
    T2LH    = RCAP2_10ms;
    
    TR2 = TRUE;
    while (_10ms--)
    {
	    while (!TF2);
	    TF2 = FALSE;
    }
    TR2 = FALSE;
#else
    while (_10ms--)
    {
	    delay_50us(19);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid )
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(19);
	    if (CmdValid)
	        return;
    }
#endif
}

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
void RC500ISR (void) interrupt 0 using 1    
{
    static unsigned char idata irqBits;
    static unsigned char idata irqMask;            
    static unsigned char idata nbytes;
    static unsigned char idata cnt;
	
    IE0 = 0; 	
    WriteRawIO(0,0x80);
    if (MpIsrInfo && MpIsrOut)
    {
        while( ReadRawIO(RegPrimaryStatus) & 0x08) 
        {
            irqMask = ReadRawIO(RegInterruptEn);
            irqBits = ReadRawIO(RegInterruptRq) & irqMask;
            MpIsrInfo->irqSource |= irqBits; 
            if (irqBits & 0x01)   
            {  
                nbytes = 64 - ReadRawIO(RegFIFOLength);
                if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <= nbytes)
                {
                    nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
                    WriteRawIO(RegInterruptEn,0x01);
                }   
                for ( cnt = 0;cnt < nbytes;cnt++)
                {
                    WriteRawIO(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]);
                    MpIsrInfo->nBytesSent++;
                }
                WriteRawIO(RegInterruptRq,0x01);  
            }      
            if (irqBits & 0x10)    
            {
                WriteRawIO(RegInterruptRq,0x10);    
                WriteRawIO(RegInterruptEn,0x82);   
                if (MpIsrInfo->cmd == PICC_ANTICOLL1) 	
	            {                                        
                    WriteIO(RegChannelRedundancy,0x02);
                    WriteRawIO(0,0x80);
	            }	
            }
            if (irqBits & 0x0E) 
            {
                nbytes = ReadRawIO(RegFIFOLength);
                for ( cnt = 0; cnt < nbytes; cnt++)               
                {
                    MpIsrOut[MpIsrInfo->nBytesReceived] = ReadRawIO(RegFIFOData);
                    MpIsrInfo->nBytesReceived++;
                }
                WriteRawIO(RegInterruptRq,0x0A & irqBits); 
            }   
            if (irqBits & 0x04) 
            {
                WriteRawIO(RegInterruptEn,0x20); 
                WriteRawIO(RegInterruptRq,0x20); 
                irqBits &= ~0x20; 
                MpIsrInfo->irqSource &= ~0x20;
                WriteRawIO(RegInterruptRq,0x04);
            }
            if (irqBits & 0x20)     
            {
                WriteRawIO(RegInterruptRq,0x20); 
                MpIsrInfo->status = MI_NOTAGERR; 
            }
        }
    }
}

///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
    unsigned char len, i;
  	unsigned int j=0;
  	
  	if(RI)
	{		
		len=SBUF;
		RI=0;
		LED = 1;	
		for(i=0;i<len;i++)
		{
			while(!RI)
			{
				j++;
				if(j>1000)
				{
				    break;
				}
			}
			if(j<1000)
			{
				RevBuffer[i]=SBUF;
				RI=0;
				j=0;
			}
			else
			{
			    break;
			}
		}
		LED = 0;
		if(i==len)
		{
			REN=0;
			CmdValid=1;
		}
	}
	else if(!RI && TI)
	{
		TI=0;
		len=RevBuffer[0];
		LED = 1;
		for(i=0;i<len+1;i++)
		{
			SBUF=RevBuffer[i];
			while(!TI);
			TI=0;			
		}
		LED = 0;
		REN=1;
	}
}

///////////////////////////////////////////////////////////////////////
// MF RC500 Config
///////////////////////////////////////////////////////////////////////
char MfConfig(void)
{
	char status=MI_OK;
	
	M500PcdConfig();
	M500PcdMfOutSelect(2);
	return status;
}

///////////////////////////////////////////////////////////////////////
// 系统初始化
///////////////////////////////////////////////////////////////////////
void init(void)
{
	RC500RST = 0;	
	
	ET2 = 0; 	
	T2CON = 0x04;		
    PCON = 0x80;                
    SCON = 0x70;                 
    TMOD = 0x21;        //TMOD = 0x22;

	TH1   = BAUD_9600;
	TL1   = TH1;
	TR1   = TRUE;             // 波特率发生器

	TH0 = 0x60;
    TL0 = 0x60;
    TR0 = 0;
    
    ET0=0;
	ET1=0;
	EA=1;
	EX0=1;
	IT0 = 1;	
	TR2=0;
 	ES = TRUE;    
	CmdValid=0; 
	
	SPEAKER=0;
	LED = 0;
	
	delay_10ms(30);
	SPEAKER=1;
	LED = 1;
	delay_10ms(30);
	SPEAKER=0;
	LED = 0;
	  
 	MfConfig();
}

///////////////////////////////////////////////////////////////////////
// IC卡处理函数
///////////////////////////////////////////////////////////////////////
void cmd_execution(void)
{
	unsigned char cmd;
	unsigned char status;
	
	cmd = RevBuffer[0];
	switch(cmd)
	{
		case 1:     // Halt the card     //终止卡的操作
			status=M500PiccHalt();			
			RevBuffer[0]=1;
			RevBuffer[1]=status;
			break;			
		case 2:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
			        // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
			status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
			if(status!=0)
			{
				status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
				if(status!=0)				
				{
					RevBuffer[0]=1;	
					RevBuffer[1]=status;
					break;
				}
			}
			if(RevBuffer[2]==2)
				cardtype=mifarepro;     // Mifare Pro 卡
			else if(RevBuffer[2]==4)
				cardtype=mifare1;       // Mifare One 卡
			else if(RevBuffer[2]==16)
				cardtype=mifarelight;   // Mifare Light 卡
			else
				cardtype=unknowncard;
			RevBuffer[0]=3;	
			RevBuffer[1]=status;
			break;
			
		case 3:                         // 防冲突 读卡的系列号 MLastSelectedSnr
			status = M500PiccCascAnticoll(0,&RevBuffer[2]);
			if(status!=0)
			{
				RevBuffer[0]=1;	
				RevBuffer[1]=status;
				break;
			}
			memcpy(MLastSelectedSnr,&RevBuffer[2],4);
			RevBuffer[0]=5;
			RevBuffer[1]=status;
			break;	
		case 4:		                    // 选择卡 Select Card
			status=M500PiccCascSelect(MLastSelectedSnr,&RevBuffer[2]);
			if(status!=MI_OK)
			{
				RevBuffer[0]=1;	
				RevBuffer[1]=status;
				break;
			}
			RevBuffer[0]=3;
			RevBuffer[1]=status;			
			break;
		case 5:	    // Key loading into the MF RC500's EEPROM
		            // 校验卡密码(E2)
			status=M500PiccAuthE2(RevBuffer[1],MLastSelectedSnr,RevBuffer[2],RevBuffer[3]);
			RevBuffer[0]=1;
			RevBuffer[1]=status;			
			break;							
		case 6:     // Key loading into the MF RC500's EEPROM
		            // 下载密码(E2)
			status=M500PcdLoadKeyE2(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
			RevBuffer[0]=1;
			RevBuffer[1]=status;			
			break;				
		case 7:     // Authentication with direct key loading from the uC
		            // 直接校验密码
			memcpy(&RevBuffer[9],&RevBuffer[3],6);
			M500HostCodeKey(&RevBuffer[9],&RevBuffer[3]);
			status=M500PiccAuthKey(RevBuffer[1],MLastSelectedSnr,&RevBuffer[3],RevBuffer[2]);
			RevBuffer[0]=1;
			RevBuffer[1]=status;			
			break;
		case 8:     // Read the mifare card
		            // 读卡
			status=M500PiccRead(RevBuffer[1],&RevBuffer[2]);
			if(status==0)
			{
				if(cardtype==mifare1||cardtype==mifarepro)
					RevBuffer[0]=17;
				else if(cardtype==1)
					RevBuffer[0]=9;
				else
					RevBuffer[0]=16;			
			}
			else
			{
			    RevBuffer[0]=1;
			}
			RevBuffer[1]=status;			
			break;
		case 9:     // Write the mifare card
		            // 写卡  下载密码
			status=M500PiccWrite(RevBuffer[1],&RevBuffer[2]);
			RevBuffer[0]=1;
			RevBuffer[1]=status;			
			break;
		case 10:
			status = M500PiccValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3],RevBuffer[7]);
			RevBuffer[0]=1;	
			RevBuffer[1]=status;
			break;
		case 12:    // 参数设置
			RevBuffer[0]=1;	//contact
			RevBuffer[1]=0;
			break;
		case 14:    // 自动寻卡
			status = M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
			while(status)
			{
			    status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);
		    }
			
			if(RevBuffer[2]==2)
				cardtype=mifarepro;     // Mifare Pro 卡
			else if(RevBuffer[2]==4)
				cardtype=mifare1;       // Mifare One 卡
			else if(RevBuffer[2]==16)
				cardtype=mifarelight;   // Mifare Light 卡
			else
				cardtype=unknowncard;
			RevBuffer[0]=3;	
			RevBuffer[1]=status;
			break;
		case 16:
		    SetBitMask(RegControl,0x10);        // PowerDown = 1       进入软件掉电模式
		    RevBuffer[0]=1;	                    // 内部电流消耗模块包括晶振在内关闭
			RevBuffer[1]=0;
		    break;
		case 17:
		    ClearBitMask(RegControl,0x10);      // PowerDown = 0        退出软件掉电模式
		    RevBuffer[0]=1;	
			RevBuffer[1]=0;
		    break;
		default:
		    break;		
	}
}

///////////////////////////////////////////////////////////////////////
// 主函数
///////////////////////////////////////////////////////////////////////
void main(void)
{ 	
    unsigned char baud;
  
    init();  
    while (1)
    {	
 	    if (CmdValid)
	    {
		    CmdValid = FALSE;
		    if(RevBuffer[0]==11)	    //为了加快相应速度 测试风鸣器
		    {
		    	RevBuffer[2]=RevBuffer[1];
	  	    	RevBuffer[0]=1;         //contact
		    	RevBuffer[1]=0;
		    	CALL_isr_UART();		
		    	SPEAKER=1;
		    	LED = 1;
		    	delay_10ms(RevBuffer[2]);
		    	SPEAKER=0;
		    	LED = 0;
		    }
	    	else if(RevBuffer[0]==13)   //设置通讯波特率
	    	{
    			switch(RevBuffer[1])
    			{
    				case 0:
	    				baud=BAUD_9600;
	    				break;
	    			case 1:
	    				baud=BAUD_14400;
		    			break;
	    			case 2:
	    				baud=BAUD_19200;
	    				break;
	    			case 3:
	    				baud=BAUD_28800;
	    				break;
	    			case 4:
	    				baud=BAUD_38400;
	    				break;
	    			case 5:
	    				baud=BAUD_57600;
	    				break;
	    			case 6:
	    				baud=BAUD_115200;
	    				break;
	    			default:
	    				baud=BAUD_9600;
	    				break;
	    		}				
	    		RevBuffer[0]=1;	        //contact
	    		RevBuffer[1]=0;
	    		CALL_isr_UART();
	    		delay_10ms(5);			
	    		TR1   = 0;
	    		TH1   = baud;
	    		TL1   = TH1;
	    		delay_10ms(2);
	    		TR1   = TRUE;
	    	}
       		else
    		{
    			cmd_execution();        // 进入IC卡处理程序
    			CALL_isr_UART();
    		}
    	}
    }
}

⌨️ 快捷键说明

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