📄 carddeal.c
字号:
//------------------------------------------------------------------------------
//读卡程序
//------------------------------------------------------------------------------
void GETCARD()
{
ulong j;
uchar card_scan;
_DINT();
for(j=0;j<5;j++)
{
card_scan =P1IN&0x0f;
}
j=0x01;
if(card_scan!=0x0f)
{
switch(card_scan)
{
case 7 : cardin |=j<<(25-card_cnt); break;
case 11: break;
case 13: cardout |=j<<(25-card_cnt); break;
case 14: break;
}
card_cnt++;
for(card_scan=P1IN&0X0F;card_scan!=0x0f;card_scan=P1IN&0X0F); //等待数据线为高
}
if(card_cnt>=26)
{
card_cnt=0;
if(cardin !=0)
{
if( FLAG & gb_card) //內門刷卡器加巡更卡
{
cardin = ((cardin >> 1) & 0xffffff);
card_buf[0] = 0x00;
card_buf[1] = ((cardin >> 16) & 0xff);
card_buf[2] = ((cardin >> 8) & 0xff);
card_buf[3] = (cardin & 0xff);
card_buf[4] = 0xff;
cardin = 0;
clk_20s = 10;
FLAG |= gb_lock;
FLAG |= gb_addnom;
}
else
{
FLAG1 |=gb_cardin;
}
}
if(cardout !=0)
{
if( FLAG & gb_card) //外門刷卡器加正式卡
{
cardout = ((cardout >> 1) & 0xffffff);
card_buf[0] = 0x00;
card_buf[1] = ((cardout >> 16) & 0xff);
card_buf[2] = ((cardout >> 8) & 0xff);
card_buf[3] = (cardout & 0xff);
card_buf[4] = 0xff;
cardout = 0;
clk_20s = 10;
FLAG |= gb_lock;
FLAG |= gb_addvip;
}
else
{
FLAG1 |=gb_cardout;
}
}
}
_EINT();
}
/********************************************************/
/**********获取监控状态程序******************************/
/********************************************************/
void GETSTATUS()
{
uchar i;
uchar buf;
for(i=0; i<10; i++)
{
buf = P1IN;
}
buf &= 0x30;
if(conone & BIT6)
{
if(buf & 0x10)//红外状态
{
if(conone & BIT2)
{
STATUS |=0X09;
}
else
{
STATUS |=0X00;
}
}
}
if(buf & 0x20)//门状态
{
if(conone & BIT3)
{
STATUS |=0X70;
}
else
{
STATUS |=0X30;
}
}
}
/******************************************************/
/**********获取状态量**********************************/
/******************************************************/
void ERRORSTATUS()
{
uchar i;
uchar buf;
/**此处的程序有待改善*****/
for(i=0; i<10; i++)
{
buf = P2IN;
}
buf &= 0x40;
switch(buf)
{
case 0x00: STATUS |= 0X02; break; //按键按下
case 0x40: STATUS |= 0X00; break; //案件松开
}
}
//------------------------------------------------------------------------------
//卡号奇偶校验
//------------------------------------------------------------------------------
uchar card_chk(uint i)
{
uchar j=0;
uchar m;
for(m=0;m<12;m++)
{
if(i&0x01)
j++;
i >>=1;
}
return j;
}
//------------------------------------------------------------------------------
//判断卡号是否合法
//------------------------------------------------------------------------------
uchar CARD_DEAL(ulong card)
{
uint i;
uchar j;
i = (card>>13)&0xfff; //13-24位的奇校验
j =card_chk(i);
j %= 2;
if(j == (card>>25))
{
i = (card>>1)&0xfff; //1-12位的偶校验
j =card_chk(i);
j %= 2;
if(j == 0)
{
j =1;
}
else
{
j =0;
}
if(j == (card & 0x01))
{
return 1;
}
}
return 0;
}
/******************************************************/
/*****读取卡号并比较,存在返回1,不存在返回0************/
/******************************************************/
uchar card_read040(ulong addr39, ulong card, ulong ncount)
{
uchar card_buf[4];
uchar card_pre[5];
uchar j;
uint i;
card_buf[0] = 0x00;
card_buf[1] = (card >> 16)& 0xff;
card_buf[2] = (card >> 8)& 0xff;
card_buf[3] = card & 0xff;
for(i=0; i<ncount; i++)
{
for(j=0; j<5; j++)
{
card_pre[j] = read040(addr39++);
}
if((card_pre[0] == card_buf[0]) && (card_pre[1] == card_buf[1])
&& (card_pre[2] == card_buf[2]) && (card_pre[3] == card_buf[3]))
{
index_vip = card_pre[4];
return 1;
}
}
return 0;
}
/**********************************************************/
/*****判断卡号是否存在*************************************/
/******正式卡号返回0***************************************/
/*****非正式卡号返回1**************************************/
/*****不存在返回2******************************************/
/**********************************************************/
uchar card_read(ulong card)
{
ulong addr39;
addr39 =0;
if(card_read040(addr39,card,nvip))
{
return 0;
}
addr39 = 0x2000;
if(card_read040(addr39,card,nnom))
{
return 1;
}
addr39 = 0x4000;
if(card_read040(addr39,card,nyvip))
{
return 3;
}
addr39 = 0x6000;
if(card_read040(addr39,card,nynom))
{
return 4;
}
else
{
return 2;
}
}
/**********************************************************/
/********* 判断时间是否在允许开门得时段内******************/
/**********************************************************/
uchar card_chktime(ulong addr39, uchar ncount, uint timebuf)
{
uchar i;
uchar j;
uchar buf[4];
uint buf2;
uint buf3;
ulong addrrrr;
addrrrr = addr39;
for(j=0; j<ncount; j++)
{
for(i=0; i<4; i++)
{
buf[i] = read040(addrrrr++);
}
buf2 = buf[0];
buf2 = ((buf2 << 8) | buf[1]);
buf3 = buf[2];
buf3 = ((buf3 << 8) | buf[3]);
if((timebuf > buf2) && (timebuf < buf3))
{
return 1;
}
}
for(i=0; i<4; i++)
{
buf[i] = read040(addr39++);
}
if((buf[0] == 0xff) && (buf[1] == 0xff)
&& (buf[2] == 0xff) && (buf[3] == 0xff))
{
return 1;
}
return 0;
}
/**********************************************************/
/******判断是否为节假日************************************/
/*********是节假日返回1************************************/
/*********非节假日返回0************************************/
/**********************************************************/
uchar card_chkhol()
{
uchar i;
for(i=0; i<40; i++)
{
if((clock[4] == holiday[i][0])
&& (clock[3] == holiday[i][1]))
{
return 1;
}
}
return 0;
}
/**********************************************************/
/******判断卡号是否能在现时间开门**************************/
/*****能开门返回1******************************************/
/*****不能开门返回0****************************************/
/**********************************************************/
uchar card_chkvip()
{
uchar i;
uint buf1;
ulong addr39;
i = (index_vip & 0xc0);
if(i == 0x40)
{
i = (index_vip & 0x0f);
FLAG |= gb_re1302;
BurstWriteTime();
buf1 = clock[2];
buf1 = ((buf1<<8)|clock[1]);
addr39 = 0x9000 + i*168 + (clock[5]-1)*24;
if(card_chktime(addr39, 6, buf1))
{
return 1;
}
}
else if(i == 0x80)
{
i = (index_vip & 0x03);
FLAG |= gb_re1302;
BurstWriteTime();
if(card_chkhol())
{
addr39 = 0x8000;
}
else
{
addr39 = 0x8000 + (i+1)*16;
}
buf1 = clock[2];
buf1 = ((buf1<<8)|clock[1]);
if(card_chktime(addr39, 4, buf1))
{
return 1;
}
}
else if(i == 0xc0)
{
return 1;
}
return 0;
}
//------------------------------------------------------------------------------
/**************内门刷卡处理******************************/
//------------------------------------------------------------------------------
void CARDIN_DEAL()
{
if(FLAG1 & gb_cardin)
{
FLAG1 &=~gb_cardin;
uchar i;
if(CARD_DEAL(cardin)) //判断卡号是否合法
{
cardin = (cardin >> 1) & 0xffffff;
i = card_read(cardin); //判断卡号是否存在
if(i == 0) //卡号是正式卡号
{
if(card_chkvip())
{
FLAG |= gb_lock;
REMARK = 0X00;
STATUS =0X02;
GETSTATUS();
}
else
{
REMARK = 10;
STATUS = 0x02;
ERRORSTATUS();
}
}
else if(i == 1) //卡号是巡更卡号
{
REMARK = 0X00;
STATUS =0X00;
GETSTATUS();
}
else if(i == 2) //卡号为无效卡号
{
REMARK = 0x08;
STATUS = 0;
ERRORSTATUS();
}
}
FLAG |= gb_re1302;
FLAG |= gb_buzzer;
FLAG1 |= gb_wrmsg;
buzzer_cycle = 1;
cardnum = cardin;
recordbuf = 0x00;
cardin = 0;
}
}
/**********************************************************/
/****外门刷卡处理******************************************/
/**********************************************************/
void CARDOUT_DEAL()
{
if(FLAG1&gb_cardout)
{
FLAG1 &=~gb_cardout;
uchar i;
if(CARD_DEAL(cardout)) //判断卡号是否合法
{
cardout = (cardout >> 1) & 0xffffff;
i = card_read(cardout); //判断卡号是否存在
if(i == 0) //卡号是正式卡号
{
if(card_chkvip())
{
FLAG |= gb_lock;
FLAG1 |= gb_protect;
FLAG2 |= gb_doorval;
REMARK = 0X00;
STATUS = 0X00;
GETSTATUS();
}
else
{
REMARK = 10;
STATUS = 0;
ERRORSTATUS();
}
}
else if(i == 1) //卡号是巡更卡号
{
REMARK = 0X00;
STATUS = 0X00;
GETSTATUS();
}
else if(i == 2) //卡号为无效卡号
{
REMARK = 0X08;
STATUS = 0;
ERRORSTATUS();
}
}
FLAG |= gb_re1302;
FLAG |= gb_buzzer;
FLAG1 |= gb_wrmsg;
buzzer_cycle = 1;
cardnum = cardout;
recordbuf = 0x00;
cardout = 0;
}
}
/********************************************************/
/**********遥控器开门请求处理程序************************/
/*******************************************************/
void cardy_deal()
{
if(FLAG2 & gb_cardyao)
{
FLAG2 &= ~gb_cardyao;
uchar i;
i = card_read(cardyao); //判断卡号是否存在
if(i == 3) //卡号是正式卡号
{
if(card_chkvip()) //判断卡号在当前时间内能否开门
{
FLAG |= gb_lock;
FLAG1 |= gb_protect;
FLAG2 |= gb_doorval;
REMARK = 0X00;
STATUS = 0X04;
GETSTATUS();
}
else
{
REMARK = 10;
STATUS = 4;
ERRORSTATUS();
}
}
else if(i == 4) //卡号是巡更卡号
{
REMARK = 0X00;
STATUS = 0X04;
GETSTATUS();
}
else if(i == 2) //卡号为无效卡号
{
REMARK = 0X08;
STATUS = 4;
ERRORSTATUS();
}
FLAG |= gb_re1302;
FLAG |= gb_buzzer;
FLAG1 |= gb_wrmsg;
buzzer_cycle = 1;
cardnum = cardyao;
recordbuf = 0x00;
cardyao = 0;
}
}
/***************************************************/
/******判断卡号是否已存在***************************/
/***************************************************/
uchar cardexist(ulong addr39, uint ncount)
{
uchar cardbuf[5];
uchar x;
uint i;
for(i=0; i<ncount; i++)
{
for(x=0; x<5; x++)
{
cardbuf[x] = read040(addr39++);
}
if((cardbuf[0]==card_buf[0]) && (cardbuf[1]==card_buf[1])
&& (cardbuf[2]==card_buf[2]) && (cardbuf[3]==card_buf[3]))
{
if(cardbuf[4]==card_buf[4])
{
return 0;
}
else
{
addrbuf = addr39-1;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -