实例介绍
【实例简介】测试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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论