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

📄 weigand_26.c

📁 很强的射频卡reader源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}



	switch(wiegand_mode)
	{
		case 	s_weigand_26 :	//输出序列号高3个字节(OLD 321,now 012)		
				for(i=0;i<csnlen;i++)
					{	SNRS[i]=snr[csnlen-1-i];	}
				weigand_26(&SNRS[csnlen-3]);
				break;	
		
		case	s_weigand_32:
				weigand_32(&snr[csnlen-4]);
				break;	
		
		case	s_weigand_32e:
				weigand_32e(&snr[csnlen-4]);
				break;	
		
		
		case  	s_weigand_34:
				weigand_34(&snr[csnlen-4]);
				break;
				
		case  	s_weigand_40:
				weigand_40(&snr[csnlen-4]);
				break;
				
		case  	s_weigand_42:
				if(csnlen==4)
				{
					snr[4]=snr[3];
					snr[3]=snr[2];
					snr[2]=snr[1];
					snr[1]=snr[0];
					snr[0]=0;
				}
				weigand_42(snr);
				break;

		case  	s_weigand_56:
				if(csnlen==4)
				{	
					snr[6]=snr[3];
					snr[5]=snr[2];
					snr[4]=snr[1];
					snr[3]=snr[0];
					snr[2]=0;
					snr[1]=0;
					snr[0]=0;
				}
				weigand_56(snr);
				break;

		case  	ABA_1:
				if(csnlen==4)
				{
					snr[4]=snr[3];
					snr[3]=snr[2];
					snr[2]=snr[1];
					snr[1]=snr[0];
					snr[0]=0;
					csnlen=5;
				}
				ABA_OUT(50,&snr[csnlen-5]);
				break;

		case  	ABA_2:
				if(csnlen==4)
				{
					snr[4]=snr[3];
					snr[3]=snr[2];
					snr[2]=snr[1];
					snr[1]=snr[0];
					snr[0]=0;
					csnlen=5;
				}
				ABA_OUT(10,&snr[csnlen-5]);
				break;
				
		case	CD8:
				if(csnlen==4)
				{
					snr[4]=snr[3];
					snr[3]=snr[2];
					snr[2]=snr[1];
					snr[1]=snr[0];
					snr[0]=0;
				}
				CD_OUT(8,snr);
				break;
				
		case	CD10:
				if(csnlen==4)
				{
					snr[4]=snr[3];
					snr[3]=snr[2];
					snr[2]=snr[1];
					snr[1]=snr[0];
					snr[0]=0;
				}
				CD_OUT(10,snr);
				break;	
		
		default:
				CMD_status=wg_fail;
				break;
	}
		
	if (weigandFlag & 0x02)
	{
		LED_R =OFF;
		LED_G  = ON;	//ON 
		Buzzer = ON;
		delay_1ms(200);		
		Buzzer = OFF;
		LED_G  = OFF;
		LED_R =ON;
		if ( (MCTYPE==CV5600S)||(wiegand_block==00)  )
			delay_1ms(200);	
	}
	else
	{
		if ( (MCTYPE==CV5600S)||(wiegand_block==00) )
			delay_1ms(200);		
		delay_1ms(200);	
	}		
//		WDTD=0x87;
//		WDTC=0x1F;	//Reset watchdog timer
//		return(CMD_status);		
  }			
} // End 


/************************************
wiegand 26 输出
格式:
************************************/
void weigand_26(unsigned char *wei_data)
{
unsigned char bit_mask;
unsigned char i,j;
unsigned char e_parity, o_parity;

//  Here need to disable Timer Interrupt
  	EA=0;	
	e_parity=0;	o_parity = 0;
	bit_mask = 0x80;
	for (i=0;i<8;i++)
		{
		if (wei_data[0] & bit_mask) e_parity++;
		if (wei_data[2] & bit_mask) o_parity++;
		bit_mask = bit_mask >> 1;
		}
	bit_mask = 0x88;
   	for (i=0;i<4;i++)
		{
		if (wei_data[1] & bit_mask & 0xF0)	e_parity++;
		if (wei_data[1] & bit_mask & 0x0F)	o_parity++;	
		bit_mask =bit_mask >>1;
		}

	e_parity = e_parity & 0x01;
	if (o_parity & 0x01) o_parity = 0;
		else o_parity = 1;

	if (e_parity)	Wei_D1 = LOW;	//inverter out
		else Wei_D0 =LOW;				

	delay_50us(3);
	Wei_D0=HIGH; 
	Wei_D1=HIGH;					//inverter out
	delay_50us(41);

	for (i=0;i < 3; i++)
	{
		bit_mask =0x80;
		for (j =0; j < 8; j++)
		{	
			if (wei_data[i] & bit_mask ) Wei_D1 =LOW;	//inverter out
			else Wei_D0 = LOW;			
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;						//inverter out
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	}
	
	if (o_parity)	Wei_D1 = LOW;	//inverter out
	else Wei_D0 =LOW;            
	delay_50us(3);
	Wei_D0=HIGH; Wei_D1=HIGH;
	delay_50us(41);
  	EA=1;	
}
/**********************************
wiegand32 格式输出
**********************************/
void weigand_32(unsigned char *wei_data)

{
	idata unsigned char bit_mask;
	idata unsigned char i,j;
	idata unsigned char e_parity, o_parity;
	EA=0;	
	e_parity=0;	o_parity = 0;     
	bit_mask = 0x80;
	for (i=0;i<8;i++)
	{
		if (wei_data[1] & bit_mask)	 e_parity++;
		if (wei_data[3] & bit_mask)  o_parity++;	
		bit_mask =bit_mask >>1;
	}
	bit_mask = 0x20;      
	for (i=0;i<6;i++)
	{
		if (wei_data[0] & bit_mask) e_parity++;
		if (wei_data[2] & bit_mask) o_parity++;
		bit_mask = bit_mask >> 1;
	}

	if (wei_data[2]& 0x80) e_parity++;
	if (wei_data[2]& 0x40) o_parity++;

	e_parity = e_parity & 0x01;
	if (o_parity & 0x01) o_parity = 0;
	else o_parity = 1;

	if (e_parity)	Wei_D1 = LOW;	//inverter out
	else Wei_D0 =LOW;				

	delay_50us(3);
	Wei_D0=HIGH; 
	Wei_D1=HIGH;						//inverter out
	delay_50us(41);
	bit_mask =0x20;
	for(j=0;j<6;j++)
		{	
			if(wei_data[0] & bit_mask ) Wei_D1 =LOW;	
				else Wei_D0 = LOW;			
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;						
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	for (i=0;i < 3; i++)                //30 Bit 数据输出wei_data[0]低6位,wei_data[1],wei_data[2],wei_data[3]
	{
		bit_mask =0x80;
		for (j =0; j < 8; j++)
			{	
				if (wei_data[1+i] & bit_mask ) Wei_D1 =LOW;	//inverter out
				else Wei_D0 = LOW;			

				delay_50us(3);
				Wei_D0 = HIGH;	
				Wei_D1 = HIGH;						//inverter out
				delay_50us(41);
				bit_mask = bit_mask >>1;
			}
	}

	if (o_parity)	Wei_D1 = LOW;	//奇校验输出
	else Wei_D0 =LOW;            
	delay_50us(3);
	Wei_D0=HIGH; Wei_D1=HIGH;
	delay_50us(41);
	EA=1;	
}

/**********************************
wiegand34 格式输出
**********************************/
void weigand_34(unsigned char *wei_data)

{
idata unsigned char bit_mask;
idata unsigned char i,j;
idata unsigned char e_parity, o_parity;

 	EA=0;	
	e_parity=0;	o_parity = 0;
	bit_mask = 0x80;
	for (i=0;i<8;i++)				//奇偶统计
		{
		if (wei_data[0] & bit_mask) e_parity++;
		if (wei_data[2] & bit_mask) o_parity++;
		bit_mask = bit_mask >> 1;
		}
		bit_mask = 0x80;
	for (i=0;i<8;i++)
		{
		if (wei_data[1] & bit_mask) e_parity++;
		if (wei_data[3] & bit_mask) o_parity++;
		bit_mask = bit_mask >> 1;
		}

		
	e_parity = e_parity & 0x01;
	if (o_parity & 0x01) o_parity = 0;
		else o_parity = 1;

	if (e_parity)	Wei_D1 = LOW;	//inverter out
		else Wei_D0 =LOW;				

	delay_50us(3);
	Wei_D0=HIGH; 
	Wei_D1=HIGH;					//inverter out
	delay_50us(41);

	for (i=0;i < 4; i++)
	{
		bit_mask =0x80;
		for (j =0; j < 8; j++)
		{	
			if (wei_data[i] & bit_mask ) Wei_D1 =LOW;	//inverter out
			else Wei_D0 = LOW;			
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;						//inverter out
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	}
	
	if (o_parity)	Wei_D1 = LOW;	//inverter out
	else Wei_D0 =LOW;            
	delay_50us(3);
	Wei_D0=HIGH; Wei_D1=HIGH;
	delay_50us(41);
  	EA=1;	
}




/*********************************
wiegand 40 格式
*********************************/

void weigand_40(unsigned char *wei_data)
{
	idata unsigned char bit_mask;
	idata unsigned char i,j;
	EA=0;
	wei_data[4]=wei_data[0]^wei_data[1]^wei_data[2]^wei_data[3];
	for (i=0;i < 5; i++)                //40 Bit 数据输出wei_data[0],wei_data[1],wei_data[2], wei_data[3] wei_data[4]
	{
		bit_mask =0x80;
		for (j=0; j<8; j++)
		{	
			if (wei_data[i] & bit_mask ) 
			{
				Wei_D1 =LOW;	
			}	
			else 
			{
				Wei_D0 = LOW;		
			}	
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;						//inverter out
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	}
	EA=1;	
}


/**********************************
wiegand42 格式输出
**********************************/
void weigand_42(unsigned char *wei_data)

{
idata unsigned char bit_mask;
idata unsigned char i,j;
idata unsigned char e_parity, o_parity;

 	EA=0;	
	e_parity=0;	o_parity = 0;
	bit_mask = 0x80;
	for (i=0;i<8;i++)
		{
		if (wei_data[0] & bit_mask) e_parity++;
		if (wei_data[3] & bit_mask) o_parity++;
		bit_mask = bit_mask >> 1;
		}
		bit_mask = 0x80;
	for (i=0;i<8;i++)
		{
		if (wei_data[1] & bit_mask) e_parity++;
		if (wei_data[4] & bit_mask) o_parity++;
		bit_mask = bit_mask >> 1;
		}
	bit_mask = 0x88;
   	for (i=0;i<4;i++)
		{
		if (wei_data[2] & bit_mask & 0xF0)	e_parity++;
		if (wei_data[2] & bit_mask & 0x0F)	o_parity++;	
		bit_mask =bit_mask >>1;
		}

	e_parity = e_parity & 0x01;				//奇校验
	if (o_parity & 0x01) o_parity = 0;		//偶校验
		else o_parity = 1;

	if (e_parity)	Wei_D1 = LOW;	//inverter out
		else Wei_D0 =LOW;				

	delay_50us(3);
	Wei_D0=HIGH; 
	Wei_D1=HIGH;					//inverter out
	delay_50us(41);

	for (i=0;i < 5; i++)
	{
		bit_mask =0x80;
		for (j =0; j < 8; j++)
		{	
			if (wei_data[i] & bit_mask ) Wei_D1 =LOW;	//inverter out
			else Wei_D0 = LOW;			
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;				//inverter out
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	}
	
	if (o_parity)	Wei_D1 = LOW;	//inverter out
	else Wei_D0 =LOW;            
	delay_50us(3);
	Wei_D0=HIGH; Wei_D1=HIGH;
	delay_50us(41);
  	EA=1;	
}


/**********************************
wiegand56 格式输出
**********************************/
void weigand_56(unsigned char *wei_data)

{
data unsigned char bit_mask;
data unsigned char i,j;

 	EA=0;	
		

	delay_50us(3);
	Wei_D0=HIGH; 
	Wei_D1=HIGH;					//inverter out
	delay_50us(41);

	for (i=0;i < 7; i++)
	{
		bit_mask =0x80;
		for (j =0; j < 8; j++)
		{	
			if (wei_data[i] & bit_mask ) Wei_D1 =LOW;	//inverter out
			else Wei_D0 = LOW;			
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;				//inverter out
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	}
  
	delay_50us(3);
	Wei_D0=HIGH; Wei_D1=HIGH;
	delay_50us(41);
  	EA=1;	
}

/**********************************
wiegand32e 格式输出
**********************************/
void weigand_32e(unsigned char *wei_data)
{
	idata unsigned char bit_mask;
	idata unsigned char i,j;

 	EA=0;	
	delay_50us(3);
	Wei_D0=HIGH; 
	Wei_D1=HIGH;					//inverter out
	delay_50us(41);

	for (i=0;i < 4; i++)
	{
		bit_mask =0x80;
		for (j =0; j < 8; j++)
		{	
			if (wei_data[i] & bit_mask ) 
			{
				Wei_D1 =LOW;	//inverter out
			}	
			else 
			{
				Wei_D0 = LOW;			
			}	
			delay_50us(3);
			Wei_D0 = HIGH;	
			Wei_D1 = HIGH;				//inverter out
			delay_50us(41);
			bit_mask = bit_mask >>1;
		}
	}
  
	delay_50us(3);
	Wei_D0=HIGH; Wei_D1=HIGH;
	delay_50us(41);
  	EA=1;	
}

	
				


void ABA_OUT(unsigned char len,unsigned char *ABAD)	
{	
	unsigned char c,i,j,k,s,L;
	unsigned long sum;
	unsigned char BCDnumber[13];
	EA=0;
	for(c=0;c<4;c++)
	{
		sum=(sum<<8)|ABAD[c+1];  // sum 为4个字节  取卡号的后4位    cardnumber[1][2][3][4]
	}
	for(c=0;c<10;c++)
	{	
		BCDnumber[10-c]=sum%10;
		sum=sum/10;
	}
	BCDnumber[0]=11;
	BCDnumber[11]=15;
	BCDnumber[12]=BCDnumber[0]^BCDnumber[1]^BCDnumber[2]^BCDnumber[3]^BCDnumber[4]
				^BCDnumber[5]^BCDnumber[6]^BCDnumber[7]^BCDnumber[8]^BCDnumber[9]
				^BCDnumber[10]^BCDnumber[11];
	
	

	CP=LOW;
	DATA=HIGH;
	for(c=0;c<len;c++)
	{
		CLOCK=LOW;
		delay_50us(11);
		CLOCK=HIGH;
		delay_50us(11);
	}
	
	for(L=0;L<13;L++)
	{
		j=0;	k = 0;
		s = 0x08;
		for (i=0;i<4;i++)
			{
			if (BCDnumber[L] & s) j++;
			s = s >> 1;
			}
		j = j & 0x01;
	
		s =0x01;
		for (k =0; k < 4; k++)
		{	
			CLOCK=LOW;
			if (BCDnumber[L] & s ) DATA =LOW;	//inverter out
			else DATA=HIGH;			
			delay_50us(11);
			CLOCK=HIGH;
			delay_50us(11);
			s = s <<1;
		}
		CLOCK=LOW;
		DATA=!j;
		delay_50us(11);
		CLOCK=HIGH;
		delay_50us(11);
	}
	DATA=HIGH;
	if(len==10)
	{
		for(i=0;i<4;i++)
		{
			CLOCK=LOW;
			delay_50us(11);
			CLOCK=HIGH;
			delay_50us(11);
		}
	}
	else if(len==50)
	{
		for(i=0;i<49;i++)
		{
			CLOCK=LOW;
			delay_50us(11);
			CLOCK=HIGH;
			delay_50us(11);
		}
	}
	CLOCK=LOW;
	delay_50us(11);
	CLOCK=HIGH;
	CP=HIGH;
	EA=1;
}		




void CD_OUT(unsigned char length,unsigned char *cardnumber)
{
	unsigned char i,L,j,s,len;
	unsigned long sum=0;
	unsigned char BCDnumber[13],outnumber[13];

				for(i=0;i<13;i++)
				{
					BCDnumber[i]=0;
				}

				for(i=0;i<3;i++)
				{
					sum=(sum<<8)|cardnumber[i+2];  // sum 为3个字节
				}
				for(i=0;i<8;i++)
				{	
					BCDnumber[i]=sum%10;
					sum=sum/10;
				}

//					sendnbyte(13,BCDnumber);
				len=(length-2)/2;

				outnumber[0]=11;
				for(i=0;i<(2*len+2);i++)
				{
					outnumber[2*len+2-i]=BCDnumber[i];
				}
				outnumber[2*len+3]=15;
	
				outnumber[2*len+4]=outnumber[0];
				for(i=0;i<(2*len+3);i++)
				{
					outnumber[2*len+4]=outnumber[2*len+4]^outnumber[i+1];
				}
			//=======================================================================
				CP=LOW;
				delay_50us(21);
				for(i=0;i<9;i++)
				{
					CLOCK=LOW;
					delay_50us(21);
					CLOCK=HIGH;
					delay_50us(21);
				}
				CLOCK=LOW;
				delay_50us(21);
				CLOCK=HIGH;
				delay_50us(16);	
				for(L=0;L<(2*len+5);L++)
				{
					j=0;
					s = 0x08;

					for (i=0;i<4;i++)
						{
							if (outnumber[L] & s) j++;
							s = s >> 1;
						}

					j = j & 0x01;
					s =0x01;

					for (i =0; i < 4; i++)
					{	
			
						if (outnumber[L] & s ) DATA =LOW;	//inverter out
						else DATA=HIGH;	
						delay_50us(7);
						CLOCK=LOW;
						delay_50us(21);
						CLOCK=HIGH;
						delay_50us(16);
						s = s <<1;
					}

					if(j)
						DATA=HIGH;
					else 
						DATA=LOW;
					delay_50us(7);
					CLOCK=LOW;
					delay_50us(21);
					CLOCK=HIGH;
					delay_50us(16);
				}
				DATA=HIGH;
				delay_50us(7);
				CP=HIGH;

}

		 

⌨️ 快捷键说明

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