📄 main.c
字号:
/****************************************************************************
* *
* File: MAIN.C *
* *
* Version: V1.0 *
* *
* Created: 2003/10/11 *
* Last Change: 2004/6/20 *
* *
* Author: DavidQi *
* *
* Compiler: KEIL C51 V6.23A *
* *
* Description: *
* *
****************************************************************************/
#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 xdata CardSnrNum[6];
uchar xdata SnrErr;
void main (void)
{
init();
test();
M500PcdConfig(); // Initialise the RC500
// must be call in the initialization
// RC500 E2PROM 0x00--0x0f Product Information Field
// 0x08--0x0b Product Serial Number
PcdReadE2(8,4,Snr_RC500); // Read out the MFRC500 serial number and store it
RingOn();
while(1)
{
init();
M500PcdConfig();
// 检测是否有MIFARE卡在读头感应区,有卡将卡号发送到PC机
/*
while(!AccOk)
{
memcpy(SerBuffer,CmdData_1,7);
cmd_execution();
AccOk = FALSE ;
memcpy(SerBuffer,CmdData_2,8);
// 命令码: 0x42: 执行 Anticoll 返回序列号
cmd_execution();
}
AccOk = FALSE ;
TransHexAsi(&SerBuffer[3],SendBuffer,4);//4字节卡序列号
SendDataToPc(SendBuffer,8);//发送8字节ASCII码到PC
*/
AccOk = FALSE ;
//等待PC 发送命令
// while(!FrameOk);
//RingOn();
TransData(PcData,SerBuffer,DataLen);//SerBuffer: PC 与MCU交互数据缓冲区
/*
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字节数据
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字节
cmd_execution();
if(!ErrNum)
{
memcpy(SerBuffer,CmdData_2,8);
cmd_execution();//命令码:0x42: 执行 Anticoll 返回序列号
AccOk = FALSE ;
memcpy(card_snr,&SerBuffer[SERNR],4);
//--------------------------------------------------------------------------
// | 02 | 10 ASCII Data |Characters Checksum | CR | LF | 03 |
//--------------------------------------------------------------------------
SnrErr = CheckSnrNum();
if(SnrErr == 0)
{
SendSnrNum(); //发送序列号:02+10字节(0xff+0x + + + + )+checksum(2字节)+0d + 0a + 03
FlashLED();
}
/*
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;
}
}
}
}
*/
}
}
// delay_10ms(50);
if(ErrNum)
{
delay_10ms(5);
/*
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;
#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;
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;
TH1 = 0xfd ;
TL1 = 0xfd ;
ES = 1 ;
TR1 = 1;
// LED = 0;
// delay_10ms(10);
// LED = 1;
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;
break;
case 0x44: // Authentication
if(SerBuffer[MODE]&0X04) SerBuffer[MODE]=PICC_AUTHENT1B; // keyB
else SerBuffer[MODE]=PICC_AUTHENT1A; // keyA =0x60 MODE =3 key_sector = SerBuffer[4] block = 9 SerBuffer[SECNR]+1)*4-1 SECNR= 4
Status = M500PiccAuth(SerBuffer[MODE], card_snr, SerBuffer[SECNR], (SerBuffer[SECNR]+1)*4-1);
// Status = M500PiccAuthE2(SerBuffer[MODE], card_snr, SerBuffer[SECNR], (SerBuffer[SECNR]+1)*4-1);
AuthOk = Status;
ErrNum = Status;
break;
case 0x45: // Halt
Status = M500PiccHalt();
break;
case 0x46: // Read
Status = M500PiccRead(SerBuffer[ADR], &SerBuffer[ADR]);//ADR = 3
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 16;
}
ErrNum = Status;
break;
case 0x47: // Write
Status = M500PiccWrite(SerBuffer[ADR], &SerBuffer[DATABYTES]);
ErrNum = Status;
break;
case 0x48: // Increment
mode = PICC_INCREMENT;
addr = SerBuffer[ADR];
memcpy(value,&SerBuffer[VALUE],4);
Status = MI_OK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -