www.pudn.com > mifare_wiegand(1.1).rar > Wiegand.c


 /*===================================================================== 
  Copyright (C), 2005, RegalCyber Tech. Co., Ltd. 
  File name:   Wiegand.C 
  Author: Zhangui Duan   Version: v1.2   Date: 2005-3-30 
 
  Description: 
     此程序文件主要是完成Wiegand26数据格式的产生以及发送。 
  		1,偶校验位的产生 
  		2,奇校验位的产生 
		3,Wiegand26输出  
  Other Description: 
  		 由 Keil C51 V6.10 and V7.05 编译通过 
 
  Function List:   
    1. 	偶校验位的产生 
		bit Even_Parity(unsigned char a); 
	2,	奇校验位的产生 
		bit Odd_Parity(unsigned int a); 
	3,	Wiegand26输出  
		 void Wiegand_Out(void); 
  History:           
    1. Date: 
       Author: 
       Modification: 
 
===========================================*/ 
 
 
#include "wiegand.h" 
 
void Delay100us(volatile unsigned char n) 
{ 
    unsigned char i; 
    while(n--) 
        for(i=0;i<35;i++) 
            ; 
} 
/**************************************************************************************** 
  Function:        Even_Parity 
  Description:     对Wiegand26中的第1-12位进行偶校验 
  				   得出Wiegand26的第1位 
  Calls:            
  Called By:       
  			 void Wiegand_Out(void); 
  Input:     a  
  			 Wiegand26的第1-12位(12bit)数据    
  Output:     
  Return:    Bit_EP 
  			 0 a的12位中1的个数为偶数 
			 1 a的12位中1的个数为奇数 
  Others:     
****************************************************************************************/ 
 bit Even_Parity(unsigned char *a) 
 { 
   unsigned char i,j; 
   bit Bit_EP; 
   for(i=0,j=0;i<12;i++) 
   { 
	 if(a[i]==0x01) 
	 { 
	   j++; 
	  } 
   } 
   if((j&0x01)==0x01)Bit_EP=1; 
   else Bit_EP=0; 
   return(Bit_EP); 
 } 
 
/**************************************************************************************** 
  Function:        Odd_Parity 
  Description:     对Wiegand26中的第13-24位进行偶校验 
  				   得出Wiegand26的第26位 
  Calls:            
  Called By:       
  			 void Wiegand_Out(void); 
  Input:     a  
  			 Wiegand26的第13-24位(12bit)数据    
  Output:     
  Return:    Bit_OP 
  			 0 a的12个数中1的个数为奇数 
			 1 a的12个数中1的个数为偶数 
  Others:     
****************************************************************************************/ 
 bit Odd_Parity(unsigned char *a) 
 { 
   bit Bit_OP; 
   unsigned char i,j; 
   for(i=0,j=0;i<12;i++) 
   { 
	 if(a[i]==0x01) 
	 { 
	   j++; 
	  } 
   } 
   if((j&0x01)==0x01)Bit_OP=0; 
   else Bit_OP=1; 
   return(Bit_OP); 
 } 
 
/**************************************************************************************** 
  Function:        Wiegand_Out 
  Description:     按照Wiegand26格式输出数据 
  					 
  Calls:            
  					bit Odd_Parity(unsigned int a) 
					bit Even_Parity(unsigned char a) 
					Delay100us() 
  Called By:       
  			 		void main(void); 
  Input:     		fc1:机器码 
  			 		cc1:卡号  
  Output: 			 
  					如果此位是0,则在DATA0上输出100US的低电平 
					如果此位是1,则在DATA1上输出100US的低电平 
					两个数据位输出间隔是1MS    
  Return:     
  Others:     
****************************************************************************************/ 
 void Wiegand_Out(unsigned char fc,unsigned int cc) 
 { 
	unsigned char i; 
	unsigned char cardno[26]; 
	//得到HID号的低8位 
	//fc=fc1; 
	for(i=1;i<9;i++) 
	{ 
	 cardno[i]=(fc&0x80)>>7; 
	 fc=fc<<1; 
	 } 
	//得到16位机器号 
	//cc=cc1; 
	for(i=9;i<25;i++) 
	{ 
	 if((cc&0x8000)==0x8000) cardno[i]=0x01; 
	 else cardno[i]=0x00; 
	 cc=cc<<1; 
	 } 
	//偶校验位 
	if((Even_Parity(&cardno[1]))==1)cardno[0]=0x01; 
	else cardno[0]=0x00; 
	//奇校验位 
	if((Odd_Parity(&cardno[13]))==1)cardno[25]=0x01; 
	else cardno[25]=0x00; 
	for( i=0;i<26;i++) 
	{ 
	   if(cardno[i]==0x01) 
	   { 
	   	Data1=0;
	   	//脉冲宽度100us
	   	Delay100us(1); 
	   	Data1=1; 
	   } 
	   else 
	   { 
	   //脉冲宽度100us 
	   	Data0=0; 
	   	Delay100us(1); 
	   	Data0=1; 
	   } 
	  //脉冲间隔1ms 
	  	Delay100us(10); 
	 } 
  }