实验目的 1. 最基础实现刷卡后显示冲值/扣款说明 2. 实现芯片内部寄存器的读写,实现可记忆性。 设计思路
根据M1射频卡与读写器的通讯过程,程序设计基本流程如下: 主函数架构: - void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // 关看门狗
- int i = 0;
- unsigned char status;
- BoardConfig(0xf0);
- Init_Port();
- InitUART();
- Port_init(); //系统初始化,设置IO口属性
- delay_ms(100); //延时100ms
- LCD_init(); //液晶参数初始化设置
- LCD_clear(); //清屏
- LCD_Desk1();
- _EINT();
- PcdReset(); //复位RC522
- PcdAntennaOn(); //开启天线发射
- while (1)
- {
- status = PcdRequest(PICC_REQIDL, Temp); ////寻卡,输出为卡类型
- if (status == MI_OK)
- status = PcdAnticoll(UD); //防冲撞处理,输出卡片序列号,4字节
- if (status == MI_OK)
- status = PcdSelect(UD); //选择卡片,输入卡片序列号,4字节
- if (status == MI_OK)
- status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UD); //在进行读写操作之前需要先进行认证
- if (status == MI_OK)
- status == incharg();//读
- if (status == MI_OK)
- {
- status = PcdWrite(1,money_ok);//充钱
- memset(money_ok,0,sizeof(money_ok));
- break;
- }
- }
- LCD_clear(); //清屏
- LCD_Desk3();
- led();
- }
复制代码其中 status == incharg();//读 incharg 函数 这一部分是自己编写用于读写存储器内容,并且进行数据类型转换功能的函数。 - char incharg(void)
- {
- unsigned char g_ucTempbuf[20];
- unsigned char num;
- unsigned char temp1[10];
- unsigned char temp2[5];
- unsigned char status2;
- long int sum = 0; //充值后整数部分的额度
- long int re;
- temp1[0] = '\0';
- temp2[0] = '\0';
- memset(money, 0, sizeof(money)); //清空钱包临时数组
- status2 = PcdRead(1, g_ucTempbuf);//读块2部分
- if (status2 == MI_OK)
- {
- for (num = 0; num < 2; num++)
- {
- money[num] = g_ucTempbuf[1 - num];//存储芯片寄存器读出来的内容,并且调换高低位(因为存储的时候,按照低位在前的顺序)
- }
- itoa(money[0], temp1, 16); //十六进制数值转十六进制字符串(字符串无法进行计算)
- itoa(money[1], temp2, 16); //十六进制数值转十六进制字符串(字符串无法进行计算)
- strcat(temp1, temp2); //将两个char类型连接。输出temp1=temp1temp2
- inteDec = str_dec(temp1); //余额整数 十六进制字符串转十进制数
- temp1[0] = '\0'; // 字符常量占一个字节的内存空间
- temp2[0] = '\0'; // 字符常量占一个字节的内存空间
- memset(money, 0, sizeof(money)); //将money中当前位置后面清零 。
- sum = inputnum + inteDec; //充值后余额整数部分之和
- re = sum;
- Int_char(re); //十进制转字符串
- led(); //led灯亮
- LCD_clear(); //清屏
- LCD_Desk2(); //lcd显示正在充值
- while (Result[i] != '\0')
- {
- LCD_write_str(Result); //lcd显示10进制字符串
- i++;
- }
- delay_ms(1800);
- }
- if(sum<65536) //将充值完毕的余额总数再次存储到寄存器内。
- {
- itoa(sum,money_inch_hex,16); //10进制数值转为16进制字符串,整数部分
- i=strlen(money_inch_hex);
- switch(i)
- {
- case 0:
- for(num=0;num<4;num++)
- {
- money_inch_hex[num]='0';
- }
- money_inch_hex[4]='\0';
- break;
- case 1:
- money_inch_hex[4]='\0';
- money_inch_hex[3]=money_inch_hex[0];
- money_inch_hex[2]='0';
- money_inch_hex[1]='0';
- money_inch_hex[0]='0';
- break;
- case 2:
- money_inch_hex[4]='\0';
- money_inch_hex[3]=money_inch_hex[1];
- money_inch_hex[2]=money_inch_hex[0];
- money_inch_hex[1]='0';
- money_inch_hex[0]='0';
- break;
- case 3:
- money_inch_hex[4]='\0';
- money_inch_hex[3]=money_inch_hex[2];
- money_inch_hex[2]=money_inch_hex[1];
- money_inch_hex[1]=money_inch_hex[0];
- money_inch_hex[0]='0';
- break;
- }
- StringToHex(money_i, money_inch_hex); //16进制字符串转为16进制字节数组
- for(num=0;num<2;num++) //置高位在前
- {
- money_ok[num]=money_i[1-num];
- }
- }
- return status2; //返回判断值
复制代码函数功能基本实现,因为是实现充值功能,所以为了防止连续多次充值,在主函数最后设置了break环节。 在实际操作过程中,在刷卡充值的时候,不能过早的移开卡片,否则会导致充卡失败。 
|