📄 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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -