📄 main.c
字号:
/****************************************************************************
* *
* File: MAIN.C *
* *
* Version: v1.1 *
* *
* Created: 2003/10/11 *
* Last Change: 2005/01/12 *
* *
* Author: DavidQi *
* *
* Compiler: KEIL C51 V6.23A *
* *
* Description: 该程序用于复旦电子 FM1702 *
* *
****************************************************************************/
#pragma large
#define __SRC
#include <main.h>
#undef __SRC
#include <string.h>
#include <intrins.h>
#include <stdio.h>
#include <m500a.h>
#include <w77e58.h>
#include <rdio.h>
#define MIS_CHK_OK (0)
#define MIS_CHK_FAILED (-1)
#define MIS_CHK_COMPERR (-2)
// Function: mifs_request
#define IDLE 0x00
#define ALL 0x01
// PC Debug Data: 02 30 31 32 03 33 checksum =33 (30^31^32)
// Release Number of the Firmware
uchar code SW_Rel[] = "\n\r MFRC500 V1.0 8.03.2003 \n\r";
uchar code ms[4][2] = {{0x0,0x0},{0x0,0x0},{0x0,0x0},{0x0,0x0}};
// Serial Number of the MFRC500
//uchar Snr_RC500[4];
uchar xdata Snr_RC500[4];
//static uint Crc;
// Local Prototypes
void init(void);
void cmd_execution(void);
// Interrupt Service Routines
void isr_timer0(void);
void isr_UART(void);
//uchar card_snr[4];
uchar xdata card_snr[4];
char xdata ErrNum;
unsigned char code CmdData_1[]={0x7f,0x40,0x05,0x0,0x0,0x0,0x0};
unsigned char code CmdData_2[]={0x7f,0x42,0x08,0x0,0x0,0x0,0x0,0x0};
uchar xdata SectorNum, BlockNum,CommandNum,Key[6],CardData[16],KeyData[6];
uchar data ComeCard = 0,GoCard = 0;ChkSum1 = 0;
void main (void)
{
init();
test();
WDTC = WDTC|0x01; // start WDT
M500PcdConfig(); // Initialise the RC500
// must be call in the initialization
// RC500 E2PROM 0x00--0x0f Product Information Field
// 0x08--0x0b Product Serical Number
PcdReadE2(8,4,Snr_RC500); // Read out the MFRC500 serial number and store it
RingOn();
while(1)
{
LED = OFF;
// 检测是否有MIFARE卡在读头感应区,等待POS 终端发送命令
M500PcdConfig();
ChkSum = 0;
while(!FrameOk)
{
// memcpy(SerBuffer,CmdData_1,7);
SerBuffer[1] = 0x40;
cmd_execution();
if(AccOk )
{
ComeCard++;
if(ComeCard == 3)
{
P1_6 = 1;
ComeCard = 0;
}
AccOk = FALSE ;
GoCard = 0;
}
else
{
GoCard++;
if(GoCard == 3)
{
P1_6 = 0;
GoCard = 0;
}
ComeCard = 0;
}
SerBuffer[1] = 0x45;
cmd_execution();
delay_10ms(5);
WDTC = WDTC|0x02; // refresh watchdog timer
WDTD = 0x0a0; // 3s Reload timer
}
WDTC = WDTC|0x02; // refresh watchdog timer
WDTD = 0x0a0; // 3s Reload timer
// SerBuffer[1] = 0x45;
// cmd_execution();
// RingOn();
TransData(PcData,SerBuffer,DataLen);//SerBuffer: PC 与MCU交互数据缓冲区
M500PcdConfig();
/*
cmd_execution() 命令执行程序
命令码: 命令功能:
0x40: // PICC_REQALL
0x41: // Request
0x42: // Anticoll
0x43: // Select
0x44: // Authentication
0x45: // Halt
0x46: // Read
0x47: // Write
0x48: // Increment
0x49: // Decrement
0x4A: // Restore
0x4B: // Transfer
0x4C: // Load Key
0x4D: // comm check char
0x4E: // Reset
0x4F: // Get Info
0x50: // Set Control Bit
0x51: // Clr Control Bit
0x52: // Config
0x53: // Check Write
0x54: // Set Port
0x55: // Get Port
0x56: // Authentication2
0x57: // Decrement+Transfer
*/
CommandNum = SerBuffer[0]; //命令码
SectorNum = SerBuffer[1]; //mifare1卡:扇区号
BlockNum = SerBuffer[2]; //mifare1卡:块号
memcpy(KeyData,&SerBuffer[3],6);//mifare1卡:块密码6字节
memcpy(CardData,&SerBuffer[3],16);//mifare1卡:待写的16字节数据
if(CommandNum == 0x47)
{
//RingOn();
;
}
FrameOk = 0;
if(CommandNum == 0x4c)
{
SerBuffer[1] = 0x4c;
SerBuffer[MODE] = PICC_AUTHENT1A; //MODE = 3
SerBuffer[SECNR] = SectorNum; //SECNR = 4
memcpy(&SerBuffer[13],KeyData,6);
cmd_execution();
if(!ErrNum)
{
SerBuffer[3] = 0x0;
TransHexAsi(&SerBuffer[3],SendBuffer,1);
SendDataToPc(SendBuffer,2);
RingOn();
}
}
else
{
//memcpy(SerBuffer,CmdData_1,7); //命令码:0x40 执行PICC_REQALL 返回卡型2字节
SerBuffer[1] = 0x40;
cmd_execution();
if(!ErrNum)
{
// memcpy(SerBuffer,CmdData_2,8);
SerBuffer[1] = 0x42;
SerBuffer[3] = 0;
cmd_execution();//命令码:0x42: 执行 Anticoll 返回序列号
AccOk = FALSE ;
if(!ErrNum)
{
SerBuffer[1] = 0x43;
cmd_execution();// 命令码: 0x43: 选择卡片 返回卡片的 SIZE 字节 0x88h
AccOk = FALSE ;
SerBuffer[1] = 0x44;
SerBuffer[2] = BlockNum;
SerBuffer[3] = 0 ;
SerBuffer[4] = SectorNum; //卡扇区号(0-15):= 2(含块8,9,10)
cmd_execution();//命令码:0x44: 密码认证操作
if(!ErrNum)
{
if(AuthOk == 0)
{
switch (CommandNum)
{
case 0x46:
SerBuffer[1] = 0x46; //读卡命令
SerBuffer[3] = BlockNum ; //卡块号(0-63): =8(8,9,10)
cmd_execution();
TransHexAsi(&SerBuffer[3],SendBuffer,16);
SendDataToPc(SendBuffer,32);
break;
case 0x47:
SerBuffer[1] = 0x47; //写卡命令
SerBuffer[3] = BlockNum ; //卡块号
memcpy(&SerBuffer[4],CardData,16);// 16字节 写卡数据
cmd_execution();
if(!ErrNum)
{
SerBuffer[3] = 0x0;
TransHexAsi(&SerBuffer[3],SendBuffer,1);
SendDataToPc(SendBuffer,2);
RingOn();
}
break;
default:
break;
}
}
}
}
}
}
if(ErrNum)
{
SerBuffer[3] = ErrNum ;
TransHexAsi(&SerBuffer[3],SendBuffer,1);
SendDataToPc(SendBuffer,2);
}
}
}
/****************************************************************************
* *
* Function: init *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void init (void)
{
AuthOk = 0xff;
AccOk = FALSE;
//EnOnChipSram(); // Enable w77e58 on chip 1k sram
#ifdef w77e58
DME0 = TRUE;
PMR = 0x41;
#endif
#ifdef sst89e554
AUXR = 0;
WDTD = 0x0a0; // 3s
WDTC = 0x1a;//00011010b;
#endif
LED = ON;
BEEP = BeepOn;
BEEP = BeepOff;
RC500RST = FALSE;
RC500_CS = TRUE; // Enable the CS for RC500
CmdReceived = FALSE;
CmdValid = FALSE;
Quit = FALSE;
LLfReady = TRUE;
SendReady = TRUE;
Idle = TRUE;
RepCnt = 0;
P1_6 = 0;
RecvState = RECV_STX;
EnableTransferCmd = FALSE;
CheckByteCnt = BCC_CHECKBYTECNT;
#ifdef AUTODELAY
DelayRate = 0;
DelayRateLocked = TRUE;
#endif
FrameEnd = 0;
FrameHead = 0;
FrameOk = 0;
DataNum = 0;
ChkSum = 0;
PCON = 0x00; // SMOD = 1;
SCON = 0x50; // Mode 1, 8-bit UART, enable receiption
// EIE = 0x0 ;
// AutoBaud = TRUE;
TMOD = 0x20; // Timer 1, mode 2, 8-bit auto reload,
// Timer 0, mode 0, 13-bit counter
Capt_L = 0;
Capt_H = 0;
//PCON = 0X80;
TH1 = 0xfd ;
TL1 = 0xfd ;
//TH1 = 0xf4 ;
//TL1 = 0xf4 ;
PS = 1;
ES = 1 ;
TR1 = 1;
// LED = OFF;
//PX1 = 1;
IT1 = 1; // Config ext1 as edge trigger for RC500
EX1 = 1; // Enable ext1 interrupt for RC500
RC500RST = TRUE;
EIE = 0x0;
EA = TRUE; // Enable all interrupts
OpenIO();
}
/****************************************************************************
* *
* Function: cmd_execution *
* *
* Input: SerBuffer[] *
* Output: SerBuffer[] *
* *
* Description: *
* *
* *
****************************************************************************/
void cmd_execution ( void )
{
uchar xdata Status;
uchar xdata len;
uchar xdata cmd;
uchar xdata adr;
uchar xdata tmp[16];
//uchar xdata snr[4];
uchar xdata size;
uchar xdata tt[2];
static uchar xdata mode,value[4],addr;
Temp = SerBuffer;
cmd = SerBuffer[COMMAND]; //COMMAND == 1
switch (cmd)
{
case 0x40: //PICC_REQALL
Status = M500PiccRequest(PICC_REQALL, tt); //Get Picc tt[]: Tagtype 2 Byte
ErrNum = Status;
if (Status != MI_OK)
{
AccOk = 0;
}
else
{
// RingOn();
AccOk = 1;
}
ErrNum = Status;
break;
case 0x41: // Request
if(SerBuffer[MODE]&0X01) SerBuffer[MODE]=PICC_REQALL; // ALL
else SerBuffer[MODE]=PICC_REQSTD; // IDLE
Status = M500PiccRequest(SerBuffer[MODE], &SerBuffer[TAGTYPE]);
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 2;
}
ErrNum = Status;
break;
case 0x42: // Anticoll
Status = M500PiccAnticoll(SerBuffer[BCNT], &SerBuffer[SERNR]);
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 4;
// RingOn();
AccOk = 1;
}
ErrNum = Status;
break;
case 0x43: // Select
memcpy(card_snr,&SerBuffer[SERNR],4); // store serial number in globle var
//输入: 卡片序列号 输出:卡片容量 SIZE = 0X88H
Status = M500PiccSelect(&SerBuffer[SERNR], &SerBuffer[SIZE]);
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 1;
}
// RingOn();
AccOk = 1;
ErrNum = Status;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -