本人用的C51。之前一直没想明白RC522通以下函数 识别到的M1卡ID是什么格式,字符还是16进制。最后在github上参考了一个大佬的代码(用C51整得门禁系统,链接在文末),然后就成功了。
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[18];
ClearBitMask(Status2Reg,0x08);//寄存器清零,状态寄存器2置为0x08,3号位的“1”卡的所有数据通信都被加密,置0表示解除加密状态。
WriteRawRC(BitFramingReg,0x07);//00000111表示不传输最后一个字节的所有位
SetBitMask(TxControlReg,0x03);
ucComMF522Buf[0] = req_code;//获取需要寻找卡的类型,0x26为休眠卡,0x52为所有卡
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x10))//如果成功通信返回pk,否则返回错误。
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1];
}
else
{ status = MI_ERR; }
return status;
}
大佬用的函数给改装了一下:
void lcd1602_ShowCardId(unsigned char x, unsigned char y, unsigned char *CradId)
{
unsigned char bits; // 个位
unsigned char tens; // 十位
unsigned char i;
for(i = 0; i < 4; i++)
{
bits = CradId[i] % 16 + 0x30;
if(bits > 0x39) // 大于9
{
bits += 7;
}
tens = CradId[i] / 16 + 0x30;
if(tens > 0x39) // 大于9
{
tens += 7;
}
if (x==0)
{
lcd1602_write_cmd(0x80+i*2+y);//第一行显示地址设置
lcd1602_write_data(tens);//显示内容
lcd1602_write_cmd(0x80+i*2+1+y);
lcd1602_write_data(bits);
}
else
{
lcd1602_write_cmd(0x80+0x40+i*2+y);//第二行显示地址设置
lcd1602_write_data(tens);//显示内容
lcd1602_write_cmd(0x80+0x40+i*2+1+y);
lcd1602_write_data(bits);
}
}
}
当M1卡信息为:
CardId[0]=0xE7
然后函数将其个位和16位分别取出来即可。