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

📄 main.c

📁 本程序是基于MFRC500射频卡读写器的单片机控制程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    }
    if (status == MI_OK)
    {
        memcpy(snr,snr_in,4);
    }
    else
    {
        memcpy(snr,"0000",4);
    }
    ClearBitMask(RegDecoderControl,0x20); 
   
    return status;  
}

//////////////////////////////////////////////////////////////////
// Cascaded Select command defined in ISO14443(MIFARE)
// 选择卡 Select Card
//////////////////////////////////////////////////////////////////
char M500PiccCascSelect(uchar *snr,uchar *sak)
{
    char idata status = MI_OK; 
 
    M500PcdSetTmo(106);
	
    WriteIO(RegChannelRedundancy,0x0F); 
    ClearBitMask(RegControl,0x08);    
    ResetInfo(MInfo);   
    SerBuffer[0] = 0x93;
    SerBuffer[1] = 0x70;        
   
    memcpy(SerBuffer + 2,snr,4);
    SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
    MInfo.nBytesToSend   = 7;
    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);

    *sak = 0;   
    if (status == MI_OK)  
    {
        if (MInfo.nBitsReceived != 8)   
        {
            status = MI_BITCOUNTERR;
        }
        else
        {
	        *sak = SerBuffer[0];
        }	
    }
    return status;
}

///////////////////////////////////////////////////////////////////////
// Key loading into the MF RC500's EEPROM
// 校验卡密码(E2)
///////////////////////////////////////////////////////////////////////
char M500PiccAuthE2( uchar auth_mode,uchar *snr,      
                     uchar keynr,uchar block)     
                                              
{
    char idata status = MI_OK;
    unsigned int e2addr = 0x80 + keynr * 0x18;
    uchar *e2addrbuf;
    
    e2addrbuf = (uchar *)&e2addr;
    if (auth_mode == PICC_AUTHENT1B)
    {
        e2addr += 12; 
    }
    FlushFIFO();    
    ResetInfo(MInfo);

    memcpy(SerBuffer,e2addrbuf,2); 
    SerBuffer[2] = SerBuffer[0];      
    SerBuffer[0] = SerBuffer[1]; 
    SerBuffer[1] = SerBuffer[2];
    MInfo.nBytesToSend   = 2;
    if ((status=M500PcdCmd(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)
    {  
        status = M500PiccAuthState(auth_mode,snr,block);  
    }
    return status;
}                        

///////////////////////////////////////////////////////////////////////
// Authentication key coding
///////////////////////////////////////////////////////////////////////
char M500HostCodeKey(  uchar *uncoded, uchar *coded)   
{
    char idata status = MI_OK;
    uchar idata cnt = 0;
    uchar idata ln  = 0;     
    uchar idata hn  = 0;      
    for (cnt = 0; cnt < 6; cnt++)
    {
        ln = uncoded[cnt] & 0x0F;
        hn = uncoded[cnt] >> 4;
        coded[cnt * 2 + 1] = (~ln << 4) | ln;
        coded[cnt * 2 ] = (~hn << 4) | hn;
    }
    return MI_OK;
}

///////////////////////////////////////////////////////////////////////
//校验状态
///////////////////////////////////////////////////////////////////////
char M500PiccAuthState( uchar auth_mode,uchar *snr,uchar block)
{
    char idata status = MI_OK;
    uchar idata i = 0;
   
    status = ReadIO(RegErrorFlag);                                     
    if (status != MI_OK)
    {
        if (status & 0x40)           
        {
            status = MI_KEYERR;
        }
        else
        {
            status = MI_AUTHERR;    
        }
    }
    else
    {
        SerBuffer[0] = auth_mode;    

        SerBuffer[1] = block;  
        memcpy(SerBuffer + 2,snr,4); 
        ResetInfo(MInfo);
        MInfo.nBytesToSend = 6;
        if ((status = M500PcdCmd(PCD_AUTHENT1,SerBuffer,&MInfo)) == MI_OK)
        {
            if (ReadIO(RegSecondaryStatus) & 0x07) 
            {
                status = MI_BITCOUNTERR;
            }
            else
            {
                ResetInfo(MInfo);
                MInfo.nBytesToSend = 0;
                if ((status = M500PcdCmd(PCD_AUTHENT2,
                                     SerBuffer,
                                     &MInfo)) == MI_OK) 
                {
                    if ( ReadIO(RegControl) & 0x08 ) 
                    {
                        status = MI_OK;
                    }
                    else
                    {
                        status = MI_AUTHERR;
                    }
                }
            }
        }
    }
    return status;
}

////////////////////////////////////////////////////////////////
// Read the mifare card
// 读卡
////////////////////////////////////////////////////////////////
char M500PiccRead(uchar addr,uchar *_data)
{
    char idata status = MI_OK;
    char idata tmp    = 0;

    FlushFIFO();    

    M500PcdSetTmo(3);  
    WriteIO(RegChannelRedundancy,0x0F);
    ResetInfo(MInfo);   
    SerBuffer[0] = PICC_READ;   
    SerBuffer[1] = addr;
    MInfo.nBytesToSend   = 2;   
    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);

    if (status != MI_OK)
    {
        if (status != MI_NOTAGERR ) 
        {
            if (MInfo.nBitsReceived == 4)  
            {
                SerBuffer[0] &= 0x0f;  
                if ((SerBuffer[0] & 0x0a) == 0)
                {
                    status = MI_NOTAUTHERR;
                }
                else
                {
                    status = MI_CODEERR;
                }
            }
        }
        memcpy(_data,"0000000000000000",16); 
    }
    else                // Response Processing
    {
        if (MInfo.nBytesReceived != 16)
        {
            status = MI_BYTECOUNTERR;
            memcpy(_data,"0000000000000000",16);
        }
        else
        {
            memcpy(_data,SerBuffer,16);
        }
    }
    M500PcdSetTmo(1);             
    return status; 
}

////////////////////////////////////////////////////////////////
// Write the mifare card
// 写卡  下载密码
////////////////////////////////////////////////////////////////
char M500PiccWrite( uchar addr,uchar *_data)
{
    char idata status = MI_OK;
    
    ResetInfo(MInfo);   
    SerBuffer[0] = PICC_WRITE; 
    SerBuffer[1] = addr;            
    MInfo.nBytesToSend   = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);

    if (status != MI_NOTAGERR)   
    {
        if (MInfo.nBitsReceived != 4)  
        {
            status = MI_BITCOUNTERR;
        }
        else                     
        {
            SerBuffer[0] &= 0x0f; 
            if ((SerBuffer[0] & 0x0a) == 0)
            {
                status = MI_NOTAUTHERR;                   
            }
            else
            {
                if (SerBuffer[0] == 0x0a)
                {
                    status = MI_OK;
                }
                else 
                {
                    status = MI_CODEERR;
                }
            }
        }
    }

    if ( status == MI_OK)
    {
        M500PcdSetTmo(3);    

        ResetInfo(MInfo);   
        memcpy(SerBuffer,_data,16);
        MInfo.nBytesToSend   = 16;
        status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
        
        if (status & 0x80)   
        {
            status = MI_NOTAGERR;
        }
        else
        {
            if (MInfo.nBitsReceived != 4) 
            {
                status = MI_BITCOUNTERR;
            }
            else                  
            {
                SerBuffer[0] &= 0x0f; 
                if ((SerBuffer[0] & 0x0a) == 0)
                {
                    status = MI_WRITEERR;
                }
                else
                {
                    if (SerBuffer[0] == 0x0a)
                    {
                        status = MI_OK;
                    }
                    else 
                    {
                        status = MI_CODEERR;
                    }
                }     
            }
        }        
        M500PcdSetTmo(1);  
    }
    return status;
}

///////////////////////////////////////////////////////////////////////
// Reset Rf Card
///////////////////////////////////////////////////////////////////////
char M500PcdRfReset(uchar ms)
{
    char idata status = MI_OK;
	
    if(ms)
    {
        ClearBitMask(RegTxControl,0x03); 
        delay_1ms(2);                
        SetBitMask(RegTxControl,0x03); 
    }
    else
    {
        ClearBitMask(RegTxControl,0x03);  
    }
    return status;
}

#pragma noaregs

///////////////////////////////////////////////////////////////////////
// Delay 50us
///////////////////////////////////////////////////////////////////////
void delay_50us(uchar _50us)
{
  RCAP2LH = RCAP2_50us;
  T2LH    = RCAP2_50us;
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer
  
  while (_50us--)
  {
	while (!TF2);
	TF2 = FALSE;
  }

  TR2 = FALSE;

}

///////////////////////////////////////////////////////////////////////
// Delay 1ms
///////////////////////////////////////////////////////////////////////
void delay_1ms(uchar _1ms)
{
  RCAP2LH = RCAP2_1ms;
  T2LH    = RCAP2_1ms;
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer
  
  while (_1ms--)
  {
	while (!TF2);
	TF2 = FALSE;
  }
  TR2 = FALSE;
}

///////////////////////////////////////////////////////////////////////
// Delay 10ms
///////////////////////////////////////////////////////////////////////
void delay_10ms(uint _10ms)
{
  RCAP2LH = RCAP2_10ms;
  T2LH    = RCAP2_10ms;
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer
  
  while (_10ms--)
  {
	while (!TF2)
	{
	  if (bCmd)
	  {
		TR2 = FALSE;
		TF2 = FALSE;
		return;
	  }
	}
	TF2 = FALSE;
  }
  TR2 = FALSE;

}

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
void RC500ISR (void) interrupt 0 using 1    
{
    static uchar idata irqBits;
    static uchar idata irqMask;            
    static uchar idata nbytes;
    static uchar 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; 
            }
        }
    }
}



///////////////////////////////////////////////////////////////////////
// MF RC500 Config
///////////////////////////////////////////////////////////////////////
char MfConfig(void)
{
	char status=MI_OK;
	
	M500PcdConfig();
	M500PcdMfOutSelect(2);
	return status;
}
/////////////////////////////////////////////////////////////////////////
//Beep(n);n为鸣叫的声音次数
/////////////////////////////////////////////////////////////////////////
void beep(uchar n)
{
	uchar i;
	for(i=0;i<n;i++)
	{
	    SPEAKER=0;          //产生周期为1s的方波
	    delay_10ms(50);     //delay 0.5s
		SPEAKER=1;
		delay_10ms(50);
		SPEAKER=0;
	}
}
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//LED闪烁次数
////////////////////////////////////////////////////////////////////////
void splash(uchar n)
{
	uchar i;
	for(i=0;i<n;i++)
	{
		CARD_LED=OFF;	
		delay_10ms(50);     //delay 0.5s
		CARD_LED=ON;
		delay_10ms(50);
		CARD_LED=OFF;
		}
}


/*******************************END OF FILE****************************/

⌨️ 快捷键说明

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