void data0_deal(void) { datacn++; if(datacn<10) { *sp<<=1; } else if(datacn<18) { *(sp+1)<<=1; } else if(datacn<26) { *(sp+2)<<=1; } else //(datacn==26) //是最后一位? { *(sp+5)&=0x7f; datacn=0; wgdata_over=1; //一个通道的数据接受完毕 fg_wgend=1; EIMSK=0x00; cha=ch; //指示通道号 ch=0; send_wgdata(); } } void data1_deal(void) { datacn++; if(datacn<10) { *sp<<=1; *sp|=0x01; } else if(datacn<18) { *(sp+1)<<=1; *(sp+1)|=0x01; } else if(datacn<26) { *(sp+2)<<=1; *(sp+2)|=0x01; } else //(datacn==26) //是最后一位? { *(sp+5)|=0x80; datacn=0; wgdata_over=1; //一个通道的数据接受完毕 fg_wgend=1; EIMSK=0x00; cha=ch; //指示通道号 ch=0; send_wgdata(); } } #pragma interrupt_handler int0_isr:2 void int0_isr(void) { //external interupt on INT0 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data0 fg_rxding=1; ch=3; EIMSK=0x03; datacn=1; ch3[5]&=0xfe; sp=ch3; } else { data0_deal(); } SEI(); } #pragma interrupt_handler int1_isr:3 void int1_isr(void) { //external interupt on INT1 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data1 fg_rxding=1; ch=3; EIMSK=0x03; datacn=1; ch3[5]|=0x01; sp=ch3; } // s=bufbit; else { data1_deal(); } SEI(); } #pragma interrupt_handler int2_isr:4 void int2_isr(void) { //external interupt on INT2 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data0 fg_rxding=1; ch=4; EIMSK=0x0c; datacn=1; ch4[5]&=0xfe; sp=ch4; } else { data0_deal(); } SEI(); } #pragma interrupt_handler int3_isr:5 void int3_isr(void) { //external interupt on INT3 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data1 fg_rxding=1; ch=4; EIMSK=0x0c; datacn=1; ch4[5]|=0x01; sp=ch4; } // s=bufbit; else { data1_deal(); } SEI(); } #pragma interrupt_handler int4_isr:6 void int4_isr(void) { //external interupt on INT4 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data0 fg_rxding=1; ch=1; EIMSK=0x30; datacn=1; ch1[5]&=0xfe; sp=ch1; } else { data0_deal(); } SEI(); } #pragma interrupt_handler int5_isr:7 void int5_isr(void) { //external interupt on INT5 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data1 fg_rxding=1; ch=1; EIMSK=0x30; datacn=1; ch1[5]|=0x01; sp=ch1; } // s=bufbit; else { data1_deal(); } SEI(); } #pragma interrupt_handler int6_isr:8 void int6_isr(void) { //external interupt on INT6 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data0 fg_rxding=1; ch=2; EIMSK=0xc0; datacn=1; ch2[5]&=0xfe; sp=ch2; } else { data0_deal(); } SEI(); } #pragma interrupt_handler int7_isr:9 void int7_isr(void) { //external interupt on INT7 CLI(); cn_g=0; if(fg_rxding==0) //已经开始接受? { //data1 fg_rxding=1; ch=2; EIMSK=0xc0; datacn=1; ch2[5]|=0x01; sp=ch2; } else { data1_deal(); } SEI(); } /**************************************************/ //weigand数据校验函数 unsigned char wgverify(unsigned char temp_ch) { unsigned char cn_bit=0; unsigned char fg_ver=0; unsigned char i=0; unsigned char *k; if(temp_ch==01) { for(i=0;i<6;i++) ch_buf[i]=ch1[i]; } if(temp_ch==02) { for(i=0;i<6;i++) ch_buf[i]=ch2[i]; } if(temp_ch==03) { for(i=0;i<6;i++) {ch_buf[i]=ch3[i];} } if(temp_ch==04) { for(i=0;i<6;i++) {ch_buf[i]=ch4[i];} } k=&ch_buf[0]; cn_bit=0; for(i=8;i>0;i--) { if(*k&0x01) {cn_bit+=1;} *k>>=1; } for(i=4;i>0;i--) { if((*(k+1))&0x80) {cn_bit+=1;} (*(k+1))<<=1; } (*(k+5))|=0x02; if((cn_bit%2)==0) { (*(k+5))&=0xfd; } //2---13bit 有偶数个1 EP=0; cn_bit=0; for(i=4;i>0;i--) { if((*(k+1))&0x80) {cn_bit+=1;} (*(k+1))<<=1; } for(i=8;i>0;i--) { if((*(k+2))&0x01) {cn_bit+=1;} (*(k+2))>>=1; } (*(k+5))&=0xbf; if((cn_bit%2)==0) //14---25bit 有偶数个1 OP=1; { (*(k+5))|=0x40; } fg_ver=0xaa; if((*(k+5)==0x00)||(*(k+5)==0xc3)||(*(k+5)==0x03)||(*(k+5)==0xc0)) {fg_ver=0x55;} //校验结果正确 return (fg_ver); //返回校验结果 } |