📄 cardread.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)
{
FLAG1 |=gb_cardin;
}
if(cardout !=0)
{
FLAG1 |=gb_cardout;
}
}
_EINT();
}
//------------------------------------------------------------------------------
//卡号奇偶校验
//------------------------------------------------------------------------------
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;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
/*****读取卡号并比较,存在返回1,不存在返回0************/
uchar card_read040(ulong addr39, ulong card, ulong ncount)
{
uchar card_buf[4];
uchar card_pre[4];
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=addr39; i<ncount+addr39; i++)
{
for(j=0; j<4; j++)
{
//(i*4-addr39*3+j)为读取的地址。如:addr39=0x800,i=0x804,j=0
//则 i*4-addr39*3+j =0x810
card_pre[j] = read040(i*4-addr39*3+j);
}
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]))
{
return 1;
}
}
return 0;
}
/*****判断卡号是否存在**********/
uchar card_read(ulong card)
{
ulong addr39;
addr39 =0;
if(card_read040(addr39,card,nvip))
{
return 0;
}
addr39 = 0x800;
if(card_read040(addr39,card,nnom))
{
return 1;
}
else
{
return 2;
}
}
//------------------------------------------------------------------------------
//内门刷卡处理
//------------------------------------------------------------------------------
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)
{
FLAG |=gb_buzzer;
FLAG |=gb_lock;
buzzer_cycle =1;
}
else if(i==1)
{
FLAG |=gb_buzzer;
buzzer_cycle =1;
}
else if(i==2)
{
FLAG |=gb_buzzer;
buzzer_cycle =2;
}
}
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)
{
FLAG |=gb_buzzer;
FLAG |=gb_lock;
buzzer_cycle =1;
}
else if(i==1)
{
FLAG |=gb_buzzer;
buzzer_cycle =1;
}
else if(i==2)
{
FLAG |=gb_buzzer;
buzzer_cycle =2;
}
}
cardout =0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -