}
}
} else { }
}
}
}
}
if (status == MI_OK) { }
com(0x85);
dat(money[15]/10+'0'); dat(money[15]+'0'); if(t==0) { }
com(0xc5);
dat(money[15]/10+'0'); dat(money[15]+'0');
bell=0; t=1; money[15]--;
status= PcdRequest(0x26,&RevBuffer[2]);//寻卡 if(status!=MI_OK)
t=0;
flag--; if(flag==0) { }
bell=1; flag=5;
21
子程序RC522.C #include
#include
void delay(unsigned char x); ///////////////////////////////////////////////////////////////////// //功 能:寻卡
//参数说明: req_code[IN]:寻卡方式
// 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdRequest(unsigned char req_code,unsigned char *pTagType) {
char status; unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN]; // unsigned char xTest ;
ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07);
// xTest = ReadRawRC(BitFramingReg); // if(xTest == 0x07 ) // { LED_GREEN =0 ;}
22
// else {LED_GREEN =1 ;while(1){}} SetBitMask(TxControlReg,0x03);
ucComMF522Buf[0] = req_code;
status =
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); // if(status == MI_OK ) // { LED_GREEN =0 ;} // else {LED_GREEN =1 ;}
if ((status == MI_OK) && (unLen == 0x10)) {
*pTagType = ucComMF522Buf[0]; *(pTagType+1) = ucComMF522Buf[1]; } else
{ status = MI_ERR; }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:防冲撞
//参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdAnticoll(unsigned char *pSnr) {
char status;
unsigned char i,snr_check=0; unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80);
23
ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20;
status=
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); if (status == MI_OK) {
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComMF522Buf[i]; snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } }
SetBitMask(CollReg,0x80); return status; }
///////////////////////////////////////////////////////////////////// //功 能:选定卡片
//参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdSelect(unsigned char *pSnr) {
char status; unsigned char i; unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0;
24
for (i=0; i<4; i++) {
}
CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
ClearBitMask(Status2Reg,0x08);
status =
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else
{ status = MI_ERR; }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码
// pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) {
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
25
ucComMF522Buf[i+2] = *(pSnr+i); ucComMF522Buf[6] ^= *(pSnr+i); //