📄 rc500.c
字号:
#include "c8051F020.h"
#include "absacc.h"
#include "string.h"
#include "stdio.h"
#include "intrins.h"
#include <MfRcuC.h>
#include <MfRc500R.h>
#include <MfErrNo.h>
//******************************************************************
#define STX 0x7E //通讯开始
#define ETX 0x7F //通讯结束
#define BUFF_LEN 30 //接收缓冲区长度
//串口中断接收缓存区定义
unsigned char xdata RECEIVEBUFFER[BUFF_LEN],*RECEIVEBUFFERPOINT; // UART0 RECEIVE buffer
unsigned char xdata Receive_Num=0;
bit START_FLAG=0,END_FLAG=0;
//********************************************************************
#define unchar unsigned char
//********************************************************************
unsigned char xdata MLastSelectedSnr[5];
unsigned char xdata Returnval,status=0;
unsigned char xdata MRcvBuffer[64] ,MSndBuffer[16]; //
static MfCmdInfo MInfo;
//********************************************
bit haveset=0;
sbit PReset=P1^7;
/********************************************
void Delay(unsigned int );
********************************************/
void Delay(unsigned int j)
{
unsigned int i;
for(i=0;i<j;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/****************************************************************************
* *
* Function: main *
* *
* Input: - *
* Output: - *
* *
* Description: *
****************************************************************************/
void main(void)
{
unsigned char idata i;
unsigned char xdata catq[2],csn[5];
unsigned char xdata rbuf[16]={0};
unsigned char xdata keybuf[6],keycodebuf[12],temp_buf[17];
unsigned char idata sector_num; //扇区绝对号
unsigned char idata selec_abkey; //key a b selector
unsigned char idata block_num; //块绝对号
unsigned char idata e2key_secotor;
unsigned short idata rc500_e2addr;
unsigned short delay;
OSCXCN = 0x67; // Enable external crystal
WDTCN = 0xDE; // disable watchdog timer
WDTCN = 0xAD;
EMI0CF = 0x07; // Set External Memory Configuration Register,
//使用片内 4K 和片外存储器低端口,地址数据复用
//因为地址与数据复用,所以应将XBR2.1设为高电平,以使交叉开关
//跳过ALE,RD,WR
XBR0 = 0X04; //SET UART0
XBR1 = 0x10; // Set INT1
XBR2 = 0x46; // Set UART1,Enable XBAR,Enable EMFILE
P0MDOUT = 0xe1; //Output configuration for P0
//ALE,RD,WR,TXD配置为推挽输出,RXD,INT1配置为漏级开路
P1MDOUT = 0xff; // Output configuration for P1
//复位脚配置为推挽输出
P2MDOUT = 0xff; // Output configuration for P2
P3MDOUT = 0xff; // Output configuration for P3
P0|=0x12; //set RX0,INT1为输入
delay=256; // Delay >1 ms before polling XTLVLD.
while(delay--);
while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
OSCICN = 0x0C; // Switch to external oscillator
OSCICN = 0x88; // Disable internal oscillator; enable
// missing clock detector.
while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
OSCICN = 0x08; // Switch to external oscillator
///////////////////////////////////////////////////
// 初始化UART0、TIMER2
Baudrate_Init(); // 初始化串口0的波特率
IT1=1; // 外部中断1设为沿触发
ES0=1; //允许串口0中断
EX1=1; //外部中断1开放
EA=1; //
///////////////////////////////////////////////////////////////////////////////////////
SendEnter();
SendData("通讯成功");
status=Mf500PcdConfig(); //配置RC500内部寄存器函数
SendData("售卡机终端工作"); //显示上电成功
memset(RECEIVEBUFFER,0,BUFF_LEN);
status=Mf500PiccHalt();
while(1) //while(1)
{
if(END_FLAG==1){//接收成功
END_FLAG=0;
SendData("Send:");
for(i=0;i<Receive_Num;i++)
SendHex(RECEIVEBUFFER[i]); //接收的内容发回去
SendEnter();
SendData("Rece:");
switch(RECEIVEBUFFER[1]){ //run command
case 0x4f: //择卡并发挥卡信息
do{
status=Mf500PiccRequest(PICC_REQALL,catq);
status=Mf500PiccAnticoll(0,csn); //csn 为返回的卡序列号SN
status=Mf500PiccSelect(csn,catq); //选择这张卡
}while(status);
if(catq[0]==0x08) // MIFARE I 卡
SendData("Mifare 1");
else
SendData("非法卡片");
SendData("卡号:");
for(i=0;i<5;i++) //seril
SendHex(csn[i]);
SendEnter();
SendData("select ok"); //显示选择卡成功
break;
case 0x4c: //直接验证
sector_num=RECEIVEBUFFER[3]*4+3;//算出密钥所在的扇区
memmove(keybuf,RECEIVEBUFFER+6,6);
status=Mf500HostCodeKey(keybuf,keycodebuf);//将密钥转换成RC500格式
if(RECEIVEBUFFER[5]==0x0A)
selec_abkey=PICC_AUTHENT1A;
if(RECEIVEBUFFER[5]==0x0B)
selec_abkey=PICC_AUTHENT1B;
status=Mf500PiccAuthKey(selec_abkey,csn,keycodebuf,sector_num);
if(status==0)
SendData("auth ok");
else
SendData("auth lose");
break;
case 0x0B: //间接验证
sector_num=RECEIVEBUFFER[3]*4+3;//算出密钥所在的扇区
if(RECEIVEBUFFER[5]==0x0A)
selec_abkey=PICC_AUTHENT1A;
if(RECEIVEBUFFER[5]==0x0B)
selec_abkey=PICC_AUTHENT1B;
e2key_secotor=RECEIVEBUFFER[6];
status= Mf500PiccAuthE2(selec_abkey,csn,e2key_secotor,sector_num);
// 参数e2key_secotor 0 <= e2key_sector <= 15此为e2rom的扇区号
// 参数sector_num为卡的扇区0 block 0 <= block <= 15 即为认证的卡的扇区
if(status==0)
SendData("Auth ok");//显示写成功
else
SendData("Auth lose");
break;
case 0x01: //loadkeye2 将密钥装入RC500的密钥存贮区
if(RECEIVEBUFFER[5]==0x0A)
selec_abkey=PICC_AUTHENT1A;
if(RECEIVEBUFFER[5]==0x0B)
selec_abkey=PICC_AUTHENT1B;
e2key_secotor=RECEIVEBUFFER[6];
keybuf[0]=RECEIVEBUFFER[7];
keybuf[1]=RECEIVEBUFFER[8];
keybuf[2]=RECEIVEBUFFER[9];
keybuf[3]=RECEIVEBUFFER[10];
keybuf[4]=RECEIVEBUFFER[11];
keybuf[5]=RECEIVEBUFFER[12];
status=Mf500PcdLoadKeyE2(selec_abkey,e2key_secotor,keybuf); //first save key to e2rom
if(status==00)
SendData("Load key e2 ok ");
else
SendData("Load key e2 lose ");
break;
case 0x55: //rc500 的地址0x30---0x7f存贮测试
e2key_secotor=RECEIVEBUFFER[5];
rc500_e2addr = 0x30 + e2key_secotor * 0x18;
keybuf[0]=RECEIVEBUFFER[6];
keybuf[1]=RECEIVEBUFFER[7];
keybuf[2]=RECEIVEBUFFER[8];
keybuf[3]=RECEIVEBUFFER[9];
status = PcdWriteE2(rc500_e2addr,4,keybuf);
if(status==0)
SendData("Save Info ok ");
else
SendData("Save Info lose ");
break;
case 0x56: //读出rc500 的地址0x30---0x7f存贮测试
e2key_secotor=RECEIVEBUFFER[5];
status= PcdReadE2(e2key_secotor,4,rbuf);
if(status==0)
{
SendData("Read Info ok ");
for(i=0;i<4;i++)
{
SendHex(rbuf[i]); //显示到屏幕
}
SendEnter();
}else
SendData("Read Info lose");
break;
case 0x99:
memset(temp_buf,0,sizeof(temp_buf));
sector_num=RECEIVEBUFFER[3]*4+3;//算出密钥所在的块
temp_buf[0]=RECEIVEBUFFER[5];
temp_buf[1]=RECEIVEBUFFER[6];
temp_buf[2]=RECEIVEBUFFER[7];
temp_buf[3]=RECEIVEBUFFER[8];
temp_buf[4]=RECEIVEBUFFER[9];
temp_buf[5]=RECEIVEBUFFER[10];
temp_buf[6]=RECEIVEBUFFER[11];
temp_buf[7]=RECEIVEBUFFER[12];
temp_buf[8]=RECEIVEBUFFER[13];
temp_buf[9]=RECEIVEBUFFER[14];
temp_buf[10]=RECEIVEBUFFER[15];
temp_buf[11]=RECEIVEBUFFER[16];
temp_buf[12]=RECEIVEBUFFER[17];
temp_buf[13]=RECEIVEBUFFER[18];
temp_buf[14]=RECEIVEBUFFER[19];
temp_buf[15]=RECEIVEBUFFER[20];
status=Mf500PiccWrite(sector_num,temp_buf);
if(status==0)
SendData("Change ok");//显示写成功
else
SendData("Change lose");
break;
case 0x30: //read rf card
block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
status=Mf500PiccRead(block_num,rbuf);
if(status==0)
{
SendData("read sector ok ");
for(i=0;i<16;i++)
{
SendHex(rbuf[i]); //显示到屏幕
}
SendEnter();
}else{
SendData("Read sector lose");
}
break;
case 0xA0: //write rf card
block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
memmove(temp_buf,RECEIVEBUFFER+5,16); //搬移16个16进制数
status=Mf500PiccWrite(block_num,temp_buf);
if(status==0)
SendData("write ok");//显示写成功
else
SendData("write lose");
break;
case 0x34: //initval
block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
memmove(temp_buf,RECEIVEBUFFER+5,16); //搬移16个16进制数
status=Mf500PiccWrite(block_num,temp_buf);
if(status==0)
SendData("value init ok");//显示写成功
else
SendData("value write lose");
break;
case 0xC0: //decrement
block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
//memmove(temp_buf,RECEIVEBUFFER+5,1); //搬移1个16进制数
temp_buf[0]=RECEIVEBUFFER[5];
temp_buf[1]=0;
temp_buf[2]=0;
temp_buf[3]=0;
status=Mf500PiccValue(0xc0,block_num,temp_buf,block_num); //减值
if(status==0)
SendData("Dec value ok");
else SendData("Dec value not ok");
break;
case 0xC1: //increment
block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -