📄 ic_card.c
字号:
srxdbuff[6]=XORCheck(srxdbuff,6);
srxdbuff[7]=0x0d;
Uart0_Send(srxdbuff,8);
n=20000;
while(n)
{
if(rx_complete)//接收完成
{
rx_complete = 0;
// n = 0;
break;
}
Delay_10ms();
n--;
}
if(n==0)
return 1;//超时返回
if(rxdbuff[1] == 0x01)
{
return 2; //错误返回
}
else if(rxdbuff[1] == 0x12)
{
if((XORCheck(rxdbuff,19)==rxdbuff[19])&&((rxdbuff[20])==0x0d))
{
for(j=0;j<16;j++)
{
CardData[j]=rxdbuff[3+j];
}
return 0;//读卡成功返回
}
else
{
return 3;//校验错误返回
}
}
else return 4;//其它错误返回
}
//写卡
//下传命令:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
//成功返回:3C 02 00 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
u8 CardWrite_step(BlockNum)//成功则返回0,否则返回失败原因
{
u8 j;
int n;
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0;
srxdbuff[0]=0x3c;
srxdbuff[1]=0x13;
srxdbuff[2]=0x01;
srxdbuff[3]=0x67;
srxdbuff[4]=BlockNum;
for (j=0;j<16; j++)
srxdbuff[j+5]=WriteCardData[j];
srxdbuff[21]=XORCheck(srxdbuff,21);
srxdbuff[22]=0x0d;
Uart0_Send(srxdbuff,23);
n=20000;
while(n)
{
if(rx_complete)//接收完成
{
rx_complete = 0;
// n = 0;
break;
}
Delay_10ms();
n--;
}
if(n==0)
return 1;//超时返回
if(rxdbuff[1] == 0x01)
{
return 2; //错误返回
}
else if(rxdbuff[1] == 0x02)
{
if((XORCheck(rxdbuff,4)==rxdbuff[4])&&((rxdbuff[5])==0x0d))
{
return 0;//写卡成功返回
}
else
{
return 3;//校验错误返回
}
}
else return 4;//其它错误返回
}
//关闭卡片:
//下传命令:3C 04 01 68 00 00 51 0D
//正确返回:3C 02 00 00 3E 0D
//错误返回:3C 01 FF (错误返回代码)BCC 0D
u8 CardClose()//成功则返回0,否则返回失败原因
{
u8 i;
u16 n;
CardCloseERR:
srxdbuff[0]=0x3c;
srxdbuff[1]=0x04;
srxdbuff[2]=0x01;
srxdbuff[3]=0x68;
srxdbuff[4]=0x00;//0x01;
srxdbuff[5]=0x00;
srxdbuff[6]=0x51;
srxdbuff[7]=0x0d;
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0; //发送标志位清零
Uart0_Send(srxdbuff,8);
n=20000;
while(n)
{
if(rx_complete)//接收完成
{
rx_complete = 0;
break;
}
Delay_10ms();
n--;
}
if(n==0)
return 1;//超时返回
if(rxdbuff[1] == 0x01)
{
return 2; //错误返回
}
else if(rxdbuff[1] == 0x02)
{
i = XORCheck(rxdbuff,4);
if((i==rxdbuff[4])&&(rxdbuff[5])==0x0d)
{
i = 0;
return 0;//寻卡成功返回
}
else
{
i = 0;
return 3;//校验错误返回
}
}
else goto CardCloseERR;
}
//点亮一次LED
LED_ON()
{
srxdbuff[0]=0x3c;
srxdbuff[1]=0x03;
srxdbuff[2]=0x01;
srxdbuff[3]=0x6d;
srxdbuff[4]=0x55;//0x01;
srxdbuff[5]=0x06;
srxdbuff[6]=0x0d;
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0; //发送标志位清零
Uart0_Send(srxdbuff,8);
while(!rx_complete);
rx_complete = 0; //接收完成了则清标志位
}
//蜂鸣器响一声
Buzzer_ON()
{
srxdbuff[0]=0x3c;
srxdbuff[1]=0x03;
srxdbuff[2]=0x01;
srxdbuff[3]=0x6b;
srxdbuff[4]=0x55;//0x01;
srxdbuff[5]=0x00;
srxdbuff[6]=0x0d;
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0; //发送标志位清零
Uart0_Send(srxdbuff,8);
while(!rx_complete);
rx_complete = 0; //接收完成了则清标志位
}
//读卡
u8 CardRead(u8 BlockNum) //读卡成功返回1,读出来的值存在CardData[16]中,失败返回0
{
if(!CardReady())//寻卡成功
{
// while(!CardReady())
//{
// CardClose();
// }
if(!KeyPass(BlockNum))//密码验证成功
{
if(!CardRead_step(BlockNum))//读卡某块成功
{
LED_ON();//亮一次LED
CardClose();//关卡
return 0; //成功返回
}
else
{
goto Fail;
}
}
else
{
goto Fail;
}
}
Fail:
Buzzer_ON();//蜂鸣器响一声
CardClose();
return 1;
}
//写卡
u8 CardWrite(u8 BlockNum)
{
if(!CardReady())//寻卡成功
{
if(!KeyPass(BlockNum))//密码验证成功
{
if(!CardWrite_step(BlockNum))//写卡某块成功
{
LED_ON();//亮一次LED
CardClose();//关卡
return 0; //成功返回
}
else
goto Fail;
}
else
goto Fail;
}
Fail:
Buzzer_ON();//蜂鸣器响一声
CardClose();
return 1;
}
//-----------------------------------------------------------------------------
// 主函数
//-----------------------------------------------------------------------------
void main (void)
{
u16 h;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
Init_SYSCLK ();
Init_PORT ();
Init_T0();
Init_UART0 ();
EA = 1;
_nop_();
while(1)
{
_nop_();
CardRead(15);
_nop_();
}
}
//定时器T0中断,用来判断接收结束
void ISR_T0 (void) interrupt 1
{
TR0 = 0; // Timer0 OFF //; // Timer0 ON
Numrxdi = indexUartRec; // 需完善
rx_complete = 1; //接收完成标志位置位
indexUartRec = 0;
_nop_();
//Uart0_Send(BufUartRec, numUartRec);
//Uart0_Send(BufUartRec, numUartRec);
}
//接收中断
void ISR_UART0 (void) interrupt 4
{
if (RI0 == 1)
{
RI0 = 0; //clear flag bit
rxdbuff[indexUartRec] = SBUF0;
TH0 = T0_RELOAD_H; // Init Timer0 High register
TR0 = 1; // Timer0 ON
indexUartRec++;
if(indexUartRec >= BUFSIZE_UREC) //接收缓冲区溢出
{
TF0 = 1; //触发定时器中断(待测试)
}
}
else // 不加则会发生发送数据丢失,可能是别的地方将TI0置位而导致进入中断?
{
TI0 = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -