📄 wigen.c
字号:
#include "STC12C5410AD.h"
#include "app.h"
#include <string.h>
#include <stdio.h>
#include <INTRINS.H>
sbit DATA0 = P1^0; // green
sbit DATA1 = P3^7; // white
void send_wiegand26(unsigned char *str)
{
unsigned char i;
static unsigned char one_num; //计算 1 的个数
unsigned char check_temp; //韦根包奇偶效验中间暂存
bit data even; //韦根包前 12 位偶效验
bit data odd; //韦根包后 12 位齐效验
static unsigned char wiegand[3]; //韦根包数据 24 位
//================================数组到韦根包的转化
wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每个字节的低 4 位取出,来计算这个字节的值
wiegand[0] = wiegand[0]|(*(str+1)&0x0f);
//--------------------------------计算前 8 位 1 的个数,为偶效验用
check_temp = wiegand[0];
for(i = 0;i<8;i++)
{
if(check_temp&0x01) //(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
wiegand[1] = wiegand[1]|(*(str+2)<<4);
//--------------------------------计算接下来的 4 位 1 的个数,为偶效验用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x80)
{
one_num++;
}
check_temp<<=1;
}
//--------------------------------判断 1 的个数
one_num%2 == 0 ? (even = 0):( even = 1);
one_num = 0;
wiegand[1] = wiegand[1]|(*(str+3)&0x0f);
//--------------------------------计算接下来的 4 位 1 的个数,为奇效验用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x01)
{
one_num++;
}
check_temp>>=1;
}
wiegand[2] = wiegand[2]|(*(str+4)<<4);
wiegand[2] = wiegand[2]|(*(str+5)&0x0f);
//--------------------------------计算接下来的 8 位 1 的个数,为奇效验用
check_temp = wiegand[2];
for(i = 0;i<8;i++)
{
if(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
//--------------------------------判断 1 的个数
one_num%2 == 0 ? (odd = 1):( odd = 0);
one_num = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -