实例介绍
【实例简介】测试RC522刷卡模块
【实例截图】
【核心代码】
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "rc522_config.h"
#include "rc522_function.h"
#include <stdbool.h>
#define spacenum 20
uint8_t KeyValue[]={0xFF ,0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 卡A密钥
unsigned char Block=0;
unsigned char Modify_Key[6]={0xff,0x00,0xff,0x00,0xff,0x00};//修改后的密码
unsigned char Default_Key[6]={0xff,0xff,0xff,0xff,0xff,0xff};//初始密码
unsigned char Write_Buffer[16]={//修改密码A
0xff,0x00,0xff,0x00,0xff,0x00,//KEYA
0xFF,0x07,0x80,0x69, //控制
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF //KEYB
};
unsigned char Write_Buffer1[16]={//还原密码A
0xff,0xff,0xff,0xff,0xff,0xff,//KEYA
0xFF,0x07,0x80,0x69,//控制
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF//KEYB
};
unsigned char Data_Buffer[16];//读块数据缓存
void ModifyKey(u8 Block);//修改扇区1的第三块控制块的KEY A
void RecoveryKey(u8 Block);//恢复扇区1的KEY A
//修改扇区1的第0块控制块的KEY A
void ModifyKey(u8 Block)
{
u8 block=Block;
uint8_t ucArray_ID [ 4 ]; /*先后存放IC卡的类型和UID(IC卡序列号)*/
uint8_t ucStatusReturn; /*返回状态*/
/*寻卡*/
if ( ( ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID ) ) != MI_OK )
/*若失败再次寻卡*/
ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
PcdSelect(ucArray_ID);
if(PcdAuthState( PICC_AUTHENT1A, block, Default_Key, ucArray_ID )==MI_OK)//校验初始密码
{
printf("验证秘钥成功!Card_Block: %2d\r\n",Block);
delay_ms(100);
if(PcdRead(block,Data_Buffer)==MI_OK)
{
printf("%*s读取块 %02d 成功!Block_Info: %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X %02X%02X%02X%02X%02X%02X \r\n",
spacenum,"",block,
Data_Buffer[0],Data_Buffer[1],Data_Buffer[2],Data_Buffer[3],
Data_Buffer[4],Data_Buffer[5],Data_Buffer[6],Data_Buffer[7],
Data_Buffer[8],Data_Buffer[9],Data_Buffer[10],Data_Buffer[11],
Data_Buffer[12],Data_Buffer[13],Data_Buffer[14],Data_Buffer[15]);
}
if(PcdWrite(block,Write_Buffer)==MI_OK)
{
printf("密码修改成功!");
}
else
{
printf("密码修改失败!");
}
}
else
{
printf("密码验证失败!");
}
}
PcdHalt();
return;
}
}
//恢复扇区1的KEY A 注销该卡
void RecoveryKey(u8 Block)
{
u8 block=Block;
uint8_t ucArray_ID [ 4 ]; /*先后存放IC卡的类型和UID(IC卡序列号)*/
uint8_t ucStatusReturn; /*返回状态*/
/*寻卡*/
if ( ( ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID ) ) != MI_OK )
/*若失败再次寻卡*/
ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
PcdSelect(ucArray_ID);
if(PcdAuthState( PICC_AUTHENT1A, block, Modify_Key, ucArray_ID )==MI_OK)//校验初始密码
{
printf("验证秘钥成功!Card_Block: %2d\r\n",Block);
delay_ms(100);
if(PcdRead(block,Data_Buffer)==MI_OK)
{
printf("%*s读取块 %02d 成功!Block_Info: %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X %02X%02X%02X%02X%02X%02X \r\n",
spacenum,"",block,
Data_Buffer[0],Data_Buffer[1],Data_Buffer[2],Data_Buffer[3],
Data_Buffer[4],Data_Buffer[5],Data_Buffer[6],Data_Buffer[7],
Data_Buffer[8],Data_Buffer[9],Data_Buffer[10],Data_Buffer[11],
Data_Buffer[12],Data_Buffer[13],Data_Buffer[14],Data_Buffer[15]);
}
if(PcdWrite(block,Write_Buffer1)==MI_OK)
{
printf("密码还原成功!");
}
else
{
printf("密码还原失败!");
}
}
else
{
printf("密码验证失败!");
}
}
PcdHalt();
return;
}
}
void IC_test ( void )
{
uint32_t writeValue = 100;
uint32_t readValue;
char cStr [ 30 ];
uint8_t ucArray_ID [ 4 ]; /*先后存放IC卡的类型和UID(IC卡序列号)*/
uint8_t ucStatusReturn; /*返回状态*/
u8 sta;
u8 sta2;
u8 sum;
u8 t;
u8 read_result;
/*寻卡*/
if ( ( ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID ) ) != MI_OK )
/*若失败再次寻卡*/
ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
PcdSelect(ucArray_ID);
for(t=1;t<64;t )
{ sta=PcdAuthState( PICC_AUTHENT1A, t, KeyValue, ucArray_ID );//校验密码
if(sta==MI_OK)
{
printf ( "第%d个块的密码校验成功,返回值:%X\r\n",t,sta); //打印密码校验结果
sta=0;
if((t%4)!=3)
{
WriteAmount(t,t); //写入金额
printf ( "第%d个块写入:金额%d元\r\n",t,t);
}
read_result=ReadAmount(t,&readValue);
printf ( "第%d个块读取函数返回值:%X\r\n",t,read_result);
if((t%4)!=3)
{
sprintf ( cStr, "TThe residual amount: %d", readValue);
printf ("第%d块余额为:%d\r\n",t,readValue);
}
delay_ms(1000);
if(t>=63)
{
t=0;
}
}
else
{
printf ( "第%x个块的密码校验失败,返回值:%X\r\n",t,sta);
}
}
PcdHalt();
return;
// sta2=WriteAmount(0x11,writeValue); //写入金额
//printf ( "%x\r\n",sta2); //打印写入函数返回值
/*sta2=ReadAmount(0x11,&readValue);
if(sta2== MI_OK) //读取金额
{
//writeValue =100;
sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X",ucArray_ID [0], ucArray_ID [1], ucArray_ID [2],ucArray_ID [3] );
printf ( "%s\r\n",cStr ); //打印卡片ID*/
/*sprintf ( cStr, "TThe residual amount: %d", readValue);
printf ("余额为:%d\r\n",readValue);
PcdHalt();
return;
}*/
}
}
}
int main(void)
{
u8 key;
u16 times=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
RC522_Init (); //RC522模块所需外设的初始化配置
printf ( "WF-RC522 Test\r\n" );
PcdReset ();
M500PcdConfigISOType ( 'A' );//设置工作方式
while(1)
{
key=KEY_Scan(0);
//printf("%d\r\n",key);
// IC_test ();//IC卡检测
if(key==KEY0_PRES)
{
printf("KEY0按下\r\n");
ModifyKey(7);
}
if(key==KEY1_PRES)
{
printf("KEY1按下\r\n");
RecoveryKey(7);
}
times ;
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论