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

📄 wiegand.c

📁 c8051f310xmodembootloader.rar
💻 C
字号:
#include "global.h"



/***************************************************************************************
**函数功能:延时ms
**入参:	uint x
**返回值:	无
**作者:	jerkoh
**日期:	2009-03-16
**说明:	无
***************************************************************************************/ 
void delayms (unsigned int x)
{
 unsigned int  j;
 while(x--)
     { 	
       for(j=0;j<1500;j++){;}
     }
}
/***************************************************************************************
**函数功能:延时us
**入参:	uint t
**返回值:	无
**作者:	jerkoh
**日期:	2009-03-16
**说明:	无
***************************************************************************************/ 
void delayus (unsigned int t)
{

 while(t--)
     {
      _nop_();
     }
}

/***************************************************************************************
**函数功能:wiegand发送
**入参:    wie
**返回值:	无
**作者:	jerkoh
**日期:	2009-03-16
**说明:	判断wiegand格式
***************************************************************************************/

void wiegandout(unsigned char wie,unsigned char chanl1)
{
 unsigned char k,m;			 
 unsigned char xdata wiebak[6];        //备份wie
  switch(wie)
  {
   case 32:
    {
    
     for(k=2;k<6;k++)
      {
	    wiedataout(k,chanl1);
      }
	}
	 break;


    case 40:
	  {
	   for(k=1;k<6;k++)
       {
	     wiedataout(k,chanl1);
       }
	  }
	   break;

	case 26:
	case 34:
	  {
		if(wie==26)
		  {m=3;}
		else
		  {m=2;}

	   memcpy(wiebak,wiebuf,6);


	   if(even_parity(wie))	   //str
	     
	   {
		   if(chanl1==CHANL_DIN)
		   {
		    D1IN=1;
		    delayus(90);	       //50us脉冲宽度
		    D1IN=0;
		   }
		   else
		   {
		    D1OUT=1;
			delayus(90);	       //50us脉冲宽度
			D1OUT=0;
		   }


	    }
		else
		{
		   if(chanl1==CHANL_DIN)
		   {
		    D0IN=1;
		    delayus(90);
		    D0IN=0;
		   }
		   else
		   {
		    D0OUT=1;
		    delayus(90);
		    D0OUT=0;
		   }	  
		}
		 delayms(2);
		 memcpy(wiebuf,wiebak,6);
		 
	     for(k=m;k<6;k++)
         {
	       wiedataout(k,chanl1);
         }	 
		  
	   memcpy(wiebuf,wiebak,6);
	   if(odd_parity(wie))	   //end
	     
		  {
		    if(chanl1==CHANL_DIN)
		    {
		     D1IN=1;
		     delayus(90);	       //50us脉冲宽度
		     D1IN=0;
			}
			else
			{
			 D1OUT=1;
		     delayus(90);	       //50us脉冲宽度
		     D1OUT=0;
			}
		  }
		else
		  {
		    if(chanl1==CHANL_DIN)
			{
		     D0IN=1;
		     delayus(90);
		     D0IN=0;
			}
			else
			{
			 D0OUT=1;
		     delayus(90);
		     D0OUT=0;
			}	  
		  }
	 }
	 break;

   default:
      break;
	       	  
  }
  MSG_LIVE;                         //LED+BELL 100ms
}
/***************************************************************************************
**函数功能:wiegand data out
**入参:    wie
**返回值:	无
**作者:	jerkoh
**日期:	2009-06-16
**说明:	无
***************************************************************************************/
void wiedataout(unsigned char k,unsigned char chanl2)
{
  unsigned char i;

  for(i=0;i<8;i++)
	   {
		if(wiebuf[k]&0x80)
		  {
		   if(chanl2==CHANL_DIN)
		   {
		    D1IN=1;
		    delayus(90);	     //50us脉冲宽度
		    D1IN=0;
		   }
		   else
		   {
		    D1OUT=1;
		    delayus(90);	     //50us脉冲宽度
		    D1OUT=0;
		   }
		   delayms(2);		     //2ms脉冲间隔
		   wiebuf[k]<<=1;
		  }
		else
		  {
		   if(chanl2==CHANL_DIN)
		   {
		    D0IN=1;
		    delayus(90);
		    D0IN=0;
		   }
		   else
		   {
		    D0OUT=1;
		    delayus(90);
		    D0OUT=0;
		   }
		   delayms(2);
		   wiebuf[k]<<=1;
		  }
	   }  
}
/***************************************************************************************
**函数功能:Even_Parity	   偶检验  前12bits or 前16bits
**入参:    wiebuf, wieformat
**返回值:	bit
**作者:	jerkoh
**日期:	2009-06-16
**说明:	无
***************************************************************************************/
bit even_parity(unsigned char wieformat)
{
  unsigned char i,j;
  bit opt;

  if(wieformat==26)
   {
	for(i=0,j=0;i<8;i++)
	  {   
        if(wiebuf[3]&0x80)
		  {
		   j++;
		  }
		 wiebuf[3]<<=1;
	  }
    for(i=0;i<4;i++)
	  {
	    if(wiebuf[4]&0x80)
		  {
		   j++;
		  }
		  wiebuf[4]<<=1;
	  } 
   }
   else		  //34
	{
	  for(i=0,j=0;i<8;i++)
	  {   
        if(wiebuf[2]&0x80)
		  {
		   j++;
		  }
		   wiebuf[2]<<=1;
	  }
    for(i=0;i<8;i++)
	  {
	    if(wiebuf[3]&0x80)
		  {
		   j++;
		  }
		  wiebuf[3]<<=1;
	  } 


	}



   if((j&0x01)==0x01) opt=1;   
   else opt=0;   
   return(opt);   

   
}


/***************************************************************************************
**函数功能:Odd_Parity     奇检验  后12bits or 后16bits
**入参:    wiebuf,	wieformat
**返回值:	bit
**作者:	jerkoh
**日期:	2009-06-16
**说明:	无
***************************************************************************************/
bit odd_parity(unsigned char wieformat)
{
  unsigned char i,j;
  bit opt;

  if(wieformat==26)
   {
	wiebuf[4]<<=4; //先左移4位

	for(i=0,j=0;i<4;i++)
	  {   
        if(wiebuf[4]&0x80)
		  {
		   j++;
		  }
		  wiebuf[4]<<=1;
	  }
    for(i=0;i<8;i++)
	  {
	    if(wiebuf[5]&0x80)
		  {
		   j++;
		  }
		   wiebuf[5]<<=1;
	  } 
   }
   else		       //34
	{
	  for(i=0,j=0;i<8;i++)
	  {   
        if(wiebuf[4]&0x80)
		  {
		   j++; 
		  }
		  wiebuf[4]<<=1;
	  }
    for(i=0;i<8;i++)
	  {
	    if(wiebuf[5]&0x80)
		  {
		   j++;
		  }
		  wiebuf[5]<<=1;
	  } 


	}



   if((j&0x01)==0x01) opt=0;   
   else opt=1;   
   return(opt);   



}

⌨️ 快捷键说明

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