📄 main.c
字号:
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x11: // 软件掉电模式 ,1字节数据,非0退出软件掉电模式,0x00进入软件掉电
//任何一条对卡的操作命令或自动寻卡被设置后都将终止掉电模式
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_1ms(2); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==SOFTDOWN))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x12: // Idle the card //卡休眠
cStatus =SPI_Write(g_cReceBuf);
delay_1ms(2); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 保存到数组cP
if((cStatus==SUCCESS)&&(cp[1]==HALT_CARD))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
}
break;
case 0x13: // 自动寻卡 ,1字节数据,0x01 开启自动寻卡,0x00关闭
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_1ms(2); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==AUTOSEARCH))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
cStatus=0;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x19://读卡类型 //无数据 返回卡类型(2 bytes)
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_1ms(2); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==CARD_TYPE))
{
g_cReceBuf[0]=4;
g_cReceBuf[1]=cmd;
g_cReceBuf[2]=cp[2];
g_cReceBuf[3]=cp[3];
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x20: // Request,Anticoll,Select,return CardSerialNo(4 bytes)
// 寻卡,防冲突,选择卡 返回卡系列号(4 bytes)
cStatus =SPI_Write(g_cReceBuf); // 发送寻卡命令
delay_1ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取卡号并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==CARD_SN))
{
g_cReceBuf[0]=6;
g_cReceBuf[1]=cmd;
memcpy(&g_cReceBuf[2],&cp[2],4);
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x21: //读块
//数据内容 1 字节密钥标识+1 块号+6 字节密钥
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==READ_BLOCK))
{
g_cReceBuf[0]=0x12;
g_cReceBuf[1]=cmd;
memcpy(&g_cReceBuf[2],&cp[2],16);
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x22 : //写块
//1 字节密钥标识+1 块号+6 字节密钥+16 字节写入数据
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==WRITE_BLOCK))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x23 : //初始化钱包
//数据内容“1 字节密钥标识+1 块号+6 字节密钥+4 字节钱包”
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==INIT_PURSE))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x24: //读钱包
//数据内容"1字节密钥标识+1 块号+6 字节密钥”
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==READ_PURSE))
{
g_cReceBuf[0]=0x06;
g_cReceBuf[1]=cmd;
memcpy(&g_cReceBuf[2],&cp[2],4);
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x25: //钱包充值
//数据内容“1 字节密钥标识+1 块号+6 字节密钥+4 字节增加值(低字节在前)”
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==ADD_PURSE))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x26: //钱包扣款
//数据内容“11 字节密钥标识+1 块号+6 字节密钥+4 字节增加值(低字节在前)”
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(5); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==DEC_PURSE))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x30: // EEPROM read max size:16
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(2); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==READ_E2))
{
temp=g_cReceBuf[4];
g_cReceBuf[0]=g_cReceBuf[4]+2;
g_cReceBuf[1]=cmd;
memcpy(&g_cReceBuf[2],&cp[2],temp);
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
case 0x31: // EEPROM write max size:16
cStatus =SPI_Write(g_cReceBuf); // 发送命令
delay_10ms(2); // 延时等待模块执行命令
cStatus =SPI_Read(cp); // 读取并存入到cP
if((cStatus==SUCCESS)&&(cp[1]==WRITE_E2))
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=cmd;
}
else
{
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
}
break;
default:
g_cReceBuf[0]=0x02;
g_cReceBuf[1]=~cmd;
cStatus=1;
break;
}
return cStatus;
}
//-----Reset rf module -------//
void Reset_HY502(void)
{
RST_HY=0; //Reset HY502 复位模块
delay_10ms(50);
RST_HY=1;
}
/************************** main function start here *******************************/
void main()
{
uchar idata cStatus;
InitializeSystem(); // 初始化系统
Reset_HY502();
// LED_YELLOW=0; //test led
LED_GREEN=0;
delay_10ms(50);
// LED_YELLOW=1;
LED_GREEN=1; //LED light 0.5s
beep(2); //test buzz
//----- test key------//
if(KEY1==0) splash(1);
if(KEY2==0) splash(2);
if(KEY3==0) splash(3);
if(KEY4==0) splash(4);
//-----------------main loop ---------------//
while (1)
{
LED_GREEN=sig; // detect module inturrupt ,if there is a card in ,then sig=0,unless you colse the auto search.
// KeyPress(); 处理按键
// add your code here
//检查命令标志
if (g_bReceCommandOk)
{
g_bReceCommandOk = FALSE;
cStatus=uart_process();
if(cStatus)
{
cStatus=0;
}
UartSend(g_cReceBuf); // Send data to uart.
// add your code here
}
}
}
/*****************************************************************************
*system initialize
*UART baudrate = 19200bps, baud generator is T1
*****************************************************************************/
void InitializeSystem()
{
ET2 = 0;
T2CON = 0x04;
PCON = 0x80;
SCON = 0x70;
TMOD = 0x21; //TMOD = 0x22;
TH1 = BAUD_19200; //默认波特率
TL1 = TH1;
TR1 = TRUE; // 波特率发生器
ET1=0;
EA=1;
EX0=0;//1;
IT0 = 1;
TR2=0;
ES = TRUE;
g_bReceCommandOk=0;
BUZ=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -