📄 weigand_26.c
字号:
}
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 + -