📄 wiegand.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 + -