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

📄 rc531.c

📁 由华邦单片机w78e516bc1来控制RC531设计的一款读写器
💻 C
📖 第 1 页 / 共 4 页
字号:
/*名称: Read_FIFO                                                                     	               	*/
/*功能: 该函数实现从RC531的FIFO中读出x bytes数据                                                       	*/                           	             
/*												        */		
/*输入:                                                                                                	*/
/*       buff, 指向读出数据的指针                                                                      	*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 N/A                                                 		                                */
/********************************************************************************************************/
void Read_FIFO(uchar idata *buff)
{
	uchar temp;
	uchar i;
	temp=FIFO_Length;
	for(i=0;i<temp;i++)
 		*(buff+i)=FIFO;
 }

/*******************************************************************************************************/
/*名称: Judge_Req                                                                    	               */
/*功能: 该函数实现对卡片复位应答信号的判断                                                             */                           	             
/*												       */											
/*输入:                                                                                                */
/*       *buff, 指向应答数据的指针                                                                     */
/*                                                                                                     */
/*输出:                                                                                                */
/*	 TRUE, 卡片应答信号正确                                                 		       */
/*       FALSE, 卡片应答信号错误                                                                       */
/*******************************************************************************************************/
uchar Judge_Req(uchar idata *buff)
{
	uchar temp1,temp2;
	
	temp1 = *buff;
	temp2 = *(buff + 1);

	if((temp1 == 0x04) && (temp2 == 0x00))
		return(TRUE);
	return(FALSE);
}

/********************************************************************************************************/
/*名称: Save_UID                                                                     	                */
/*功能: 该函数实现保存卡片收到的序列号                                                  	        */                           	             
/*												        */											
/*输入:                                                                                                 */
/*       row: 产生冲突的行									 	*/
/*       col: 产生冲突的列										*/						
/*       length: 接収到的UID数据长度                                                                    */
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 N/A                                                   		                		*/
/********************************************************************************************************/
void Save_UID(uchar row,uchar col,uchar length)
{
	uchar i;
	uchar temp;
	uchar temp1;
	
	if(row==0x00 && col==0x00)
		for(i=0;i<length;i++)
			UID[i]=buffer[i];
	else
	{	
		temp=buffer[0];
		temp1=UID[row-1];
		switch(col)
		{
			case 0:
				temp1=0x00;
				row=row+1;
				break;
			case 1:
				temp=temp & 0xFE;
				temp1=temp1 & 0x01;
				break;			
			case 2:
				temp=temp & 0xFC;
				temp1=temp1 & 0x03;
				break;
			case 3:
				temp=temp & 0xF8;
				temp1=temp1 & 0x07;
				break;
			case 4:
				temp=temp & 0xF0;
				temp1=temp1 & 0x0F;
				break;
			case 5:
				temp=temp & 0xE0;
				temp1=temp1 & 0x1F;
				break;
			case 6:
				temp=temp & 0xC0;
				temp1=temp1 & 0x3F;
				break;
			case 7:
				temp=temp & 0x80;
				temp1=temp1 & 0x7F;
				break;
			default:
				break;
		}
		buffer[0]=temp;
		UID[row-1]=temp1 | temp;
		for(i=1;i<length;i++)
		{
			UID[row-1+i]=buffer[i];
		}
	}
}

/********************************************************************************************************/
/*名称: Check_UID                                                                     	               	*/
/*功能: 该函数实现对收到的卡片的序列号的判断                                                       	*/               	             
/*												        */		
/*输入:                                                                                                	*/
/*       N/A                                                                      		 	*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 TRUE: 序列号正确                                                 		                */
/*       FALSE: 序列号错误              								*/
/********************************************************************************************************/
uchar Check_UID(void)
{
	uchar temp;
	uchar i;
	
	temp=0x00;
	for(i=0;i<5;i++)
	{
		temp=temp ^ UID[i];
	}
	if(temp==0)
		return(TRUE);
	return(FALSE);
}

/********************************************************************************************************/
/*名称: Set_BitFraming                                                                     	        */
/*功能: 该函数实现对收到的卡片的序列号的判断                                                       	*/               	             
/*												        */		
/*输入:                                                                                                	*/
/*       row: 产生冲突的行                                                                     		*/
/*	 col: 产生冲突的列										*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*       N/A      											*/
/********************************************************************************************************/
void Set_BitFraming(uchar  row,uchar  col)
{	
	switch(row)
	{
		case 0: 
			buffer[1]=0x20;
			break;
		case 1:
			buffer[1]=0x30;
			break;
		case 2:
			buffer[1]=0x40;
			break;
		case 3:
			buffer[1]=0x50;
			break;
		case 4:
			buffer[1]=0x60;
			break;
		default:
			break;
	}	
	
	switch(col)
	{
		case 0:
			Bit_Frame=0x00;
			break;
		case 1:
			Bit_Frame=0x11;
			buffer[1]=(buffer[1] | 0x01);
			break;
		case 2:
			Bit_Frame=0x22;
			buffer[1]=(buffer[1] | 0x02);
			break;
		case 3:
			Bit_Frame=0x33;
			buffer[1]=(buffer[1] | 0x03);
			break;
		case 4:
			Bit_Frame=0x44;
			buffer[1]=(buffer[1] | 0x04);
			break;
		case 5:
			Bit_Frame=0x55;
			buffer[1]=(buffer[1] | 0x05);
			break;
		case 6:
			Bit_Frame=0x66;
			buffer[1]=(buffer[1] | 0x06);
			break;
		case 7:
			Bit_Frame=0x77;
			buffer[1]=(buffer[1] | 0x07);
			break;
		default:
			break;
	}
}

/********************************************************************************************************/
/*名称: Read_E2                                                                     	               	*/
/*功能: 该函数实现从RC531的EE中读出数据                                                                	*/                           	             
/*												        */
/*输入:                                                                                                	*/
/*       lsb, EE地址(低字节)                                                                           	*/
/*	 msb, EE地址(高字节)                                                                           	*/
/*       count, 待读出数据EE的字节个数                                                                 	*/
/*	 buff, 指向待读出数据的指针                                                                    	*/
/*												        */
/*输出:                                                                                                	*/
/*	TRUE, EE数据正确读出                                                 		               	*/
/*	FALSE, EE数据读出有误  	                                       				        */
/********************************************************************************************************/
uchar	Read_E2(uchar lsb,uchar msb,uchar count,uchar idata *buff)
{
	uchar temp;
	
	*buff=lsb;
	*(buff+1)=msb;
	*(buff+2)=count;
	temp=Command_Send(3,buff,ReadE2);
	Read_FIFO(buff);
	return(temp);		
}

/********************************************************************************************************/
/*名称: Write_E2                                                                     	               	*/
/*功能: 该函数实现向RC531的EE中写入数据                                                                	*/                           	             
/*												        */											
/*输入:                                                                                                	*/
/*       lsb, EE地址(低字节)                                                                           	*/
/*	 msb, EE地址(高字节)                                                                           	*/
/*       count, 待写入数据EE的字节个数                                                                 	*/
/*	 buff, 指向待写入数据的指针                                                                    	*/
/*												       	*/
/*输出:                                                                                                	*/
/*	 TRUE, EE数据正确写入  				                                                */
/*	 FALSE, EE数据写入有误  	                                       				*/
/********************************************************************************************************/
uchar	Write_E2(uchar lsb,uchar msb,uchar count,uchar idata *buff)
{

	uchar idata temp,i;
	
	for(i=0;i<count;i++)
		*(buff+count-i+2)=*(buff-i+count);
	*buff=lsb;
	*(buff+1)=msb;
	temp=Command_Send(count+2,buff,WriteE2);
	temp=SecondaryStatus;
	temp=temp & 0x40;
	if (temp==0x40)
		return(TRUE);
	else
		return(FALSE);
}

/********************************************************************************************************/
/*名称: Load_key_CPY                                                                     	     	*/
/*功能: 该函数实现把FIFO中的密码存入rc531的keybuffer中                                                  */                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*       keybuff: 密码首地址                                                                            */
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 TRUE: 密钥装载成功				              					*/
/*	 FALSE: 密钥装载失败										*/
/********************************************************************************************************/
uchar Load_key_CPY(uchar idata *keybuff)
{
	uchar temp;
	
	temp=Command_Send(12,keybuff,LoadKey);
	temp=ErrorFlag & 0x40;
	if (temp==0x40)
		return(FALSE);
	return(TRUE);
}
	
/********************************************************************************************************/
/*名称: Load_keyE2                                                                     	     	  	*/
/*功能: 该函数实现把E2中密码存入rc531的keybuffer中                                                  	*/                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*       Secnr: EE起始地址                                                                    		*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 True: 密钥装载成功			               						*/
/*       False: 密钥装载失败										*/
/********************************************************************************************************/
uchar	Load_keyE2_CPY(uchar Secnr,uchar Mode)
{
	uchar temp;
	uchar msb=0;
	uchar lsb=0;
	
	temp = Secnr * 12;
	if (Mode==0)
	{
		if (temp>=0x80)							//计算密码存放地址
		{
			lsb=temp-0x80;
			msb=0x01;
		}
		else
		{
			msb=0x00;
			lsb=temp+0x80;
		}
	}
	else
	{
		msb=0x01;
		lsb=temp+0x40;
	}
	buffer[0]=lsb;
	buffer[1]=msb;
	temp=Command_Send(2,buffer,LoadKeyE2);
	temp=ErrorFlag & 0x40;
	if (temp==0x40)
		return(FALSE);
	return(TRUE);
}

/********************************************************************************************************/
/*名称: Authentication                                                                     	     	*/
/*功能: 该函数实现密码认证的过程                                                  			*/                           	             
/*													*/											      																								
/*输入:                                                                                                	*/
/*      UID: 卡片序列号地址										*/ 

⌨️ 快捷键说明

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