📄 main.c
字号:
#include "reg52.h"
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "slrc632.h"
#include "iso14443a.h"
#include <absacc.h>
//硬件版本号
unsigned char code hardmodel[12] = {"SL601F-0512"};
bit g_bReceOk; //正确接收到上位机指令标志
bit g_bReceAA; //接收到上位机发送的AA字节标志
bit g_bRc632Ok; //RC632复位正常标志
bit g_bIblock;
unsigned int g_cReceNum; //接收到上位机的字节数
unsigned int data g_cCommand; //接收到的命令码
unsigned char data g_cSNR[4]; //M1卡序列号
unsigned char g_cIcdevH; //设备标记
unsigned char g_cIcdevL; //设备标记
unsigned char g_cFWI; //
unsigned char g_cCidNad; //
unsigned char idata g_cReceBuf[64]; //和上位机通讯时的缓冲区
struct TranSciveBuffer{unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64];
};
void main( )
{
InitializeSystem( );
Rc632Ready( );
PcdConfigISOType( 'A' );
while ( 1 )
{
if (g_bReceOk)
{
g_bReceOk = 0;
switch(g_cCommand)
{
case 0x0101:
ComSetBound(); break;
case 0x0104:
ComGetHardModel(); break;
case 0x0108:
ComM632PcdConfigISOType(); break;
case 0x010C:
ComPcdAntenna(); break;
case 0x0201:
ComRequestA(); break;
case 0x0202:
ComAnticoll(); break;
case 0x0203:
ComSelect(); break;
case 0x0204:
ComHlta(); break;
case 0x0207:
ComAuthentication(); break;
case 0x0208:
ComM1Read(); break;
case 0x0209:
ComM1Write(); break;
case 0x020A:
ComM1Initval(); break;
case 0x020B:
ComM1Readval(); break;
case 0x020C:
ComM1Decrement(); break;
case 0x020D:
ComM1Increment(); break;
case 0x020E:
ComM1Restore(); break;
case 0x020F:
ComM1Transfer(); break;
case 0x0210:
ComTypeARst(); break;
case 0x0211:
ComTypeACOS(); break;
case 0x0303:
ComCL_Deselect(); break;
default:
AnswerErr( FAULT11 ); break;
}
ES = 1;
}
}
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
TMOD &= 0x0F;
TMOD |= 0x21;
PCON |= 0x80;
SCON = 0x50;
TH1 = TL1 = BOUND19200;
TR1=1;
P0 = P1 = P2 = P3 = 0xFF;
IE |= 0x90;
}
/////////////////////////////////////////////////////////////////////
//初始化RC632
/////////////////////////////////////////////////////////////////////
void Rc632Ready()
{
char status;
DelayMs(100);
DelayMs(100);
DelayMs(100);
status = PcdReset();
if(status != MI_OK)
{
DelayMs(10);
status = PcdReset();
}
if(status != MI_OK)
{
DelayMs(10);
status = PcdReset();
}
if(status == MI_OK)
{
g_bRc632Ok = 1;
sond = 1; //蜂鸣器响一声,表示RC632复位成功
DelayMs(250);
sond = 0;
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
unsigned char bound = g_cReceBuf[6];
if (bound > 7)
{ AnswerErr(FAULT12); }
else
{
AnswerCommandOk();
TR1 = 0;
switch(bound)
{
case 0:
TH1=TL1=BOUND4800;
break;
case 1:
TH1=TL1=BOUND9600;
break;
case 2:
TH1=TL1=BOUND14400;
break;
case 3:
TH1=TL1=BOUND19200;
break;
case 4:
TH1=TL1=BOUND28800;
break;
case 5:
TH1=TL1=BOUND38400;
break;
case 6:
TH1=TL1=BOUND57600;
break;
case 7:
TH1=TL1=BOUND115200;
break;
default:
break;
}
TR1 = 1;
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的读取硬件版本号命令
/////////////////////////////////////////////////////////////////////
void ComGetHardModel()
{
memcpy(&g_cReceBuf[0], &hardmodel[0], sizeof(hardmodel));
AnswerOk(&g_cReceBuf[0], sizeof(hardmodel));
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置RC632协议命令,ISO14443A/B或ISO15693
/////////////////////////////////////////////////////////////////////
void ComM632PcdConfigISOType()
{
if (MI_OK == PcdConfigISOType(g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的天线命令
/////////////////////////////////////////////////////////////////////
void ComPcdAntenna()
{
char status;
if (!g_cReceBuf[6])
{ status = PcdAntennaOff(); }
else
{
DelayMs(10);
status = PcdAntennaOn();
DelayMs(10);
}
if (status == MI_OK)
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
unsigned char atq[2];
char status;
status = PcdRequest(g_cReceBuf[6], atq);
if (status != MI_OK)
{ status = PcdRequest(g_cReceBuf[6], atq); }
if (status == MI_OK)
{ AnswerOk(atq,2); }
else
{ AnswerErr(FAULT20); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{
if (MI_OK == PcdAnticoll(&g_cSNR))
{ AnswerOk(&g_cSNR,4); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
if (MI_OK == PcdSelect(&g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 1); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
if (MI_OK == PcdHalt())
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT10); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{
char status = MI_COM_ERR;
unsigned char *pkeys,*pSNR;
pkeys = &g_cReceBuf[20];
pSNR = &g_cSNR;
if (MI_OK == ChangeCodeKey(&g_cReceBuf[8],pkeys)) //转换密钥格式
{
if (MI_OK == PcdAuthKey(pkeys)) //传送密钥到RC500FIFO
{
status = PcdAuthState(g_cReceBuf[6], g_cReceBuf[7], pSNR); //验证密钥
}
}
if (status == MI_OK)
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT22); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 16); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机写M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Write()
{
if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机初始化钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Initval()
{
g_cReceBuf[11]=~g_cReceBuf[7];g_cReceBuf[12]=~g_cReceBuf[8];
g_cReceBuf[13]=~g_cReceBuf[9];g_cReceBuf[14]=~g_cReceBuf[10];
g_cReceBuf[15]=g_cReceBuf[7];g_cReceBuf[16]=g_cReceBuf[8];
g_cReceBuf[17]=g_cReceBuf[9];g_cReceBuf[18]=g_cReceBuf[10];
g_cReceBuf[19]=g_cReceBuf[6];g_cReceBuf[20]=~g_cReceBuf[6];
g_cReceBuf[21]=g_cReceBuf[6];g_cReceBuf[22]=~g_cReceBuf[6];
if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机读钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Readval()
{
if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 4); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机充值命令
/////////////////////////////////////////////////////////////////////
void ComM1Increment()
{
if (MI_OK == PcdValue(PICC_INCREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT24); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机M1卡回传命令
/////////////////////////////////////////////////////////////////////
void ComM1Restore()
{
if (MI_OK == PcdRestore(g_cReceBuf[6]))
{ AnswerCommandOk(); }
else
{ AnswerErr(FAULT23); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机M1卡值传送命令
/////////////////////////////////////////////////////////////////////
void ComM1Transfer()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -