📄 main.c
字号:
/****************************************************************************
* *
* File: MAIN.C *
* *
* Version: *
* *
* Created: 30.08.2001 *
* Last Change: 30.08.2001 *
* *
* Author: Chua Joo Ming *
* *
* Compiler: KEIL C51 V4.10 *
* *
* Description: 89C52RD2-Firmware for MFRC500 Demo Serial Reader *
* *
****************************************************************************/
#define __SRC
#include "main.h"
#undef __SRC
#include <string.h>
#include <intrins.h>
#include <stdio.h>
#include <m500a.h>
#include <p89c51rx.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
sbit RC500RST = P3^3;
sbit RC500_CS = P2^7;
sbit LED = P3^5;
//sbit LED = P3^4;
// Release Number of the Firmware
uchar code SW_Rel[] = "\n\r MFRC500 V1.0 30.08.01 \n\r";
// Serial Number of the MFRC500
uchar 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];
//KEY code Nkey_a[6] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5};
//KEY code Nkey_b[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
/****************************************************************************
* *
* Function: main *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void main (void)
{
unsigned char mfout=2;//readbuf[16];
init();
M500PcdConfig(); // Initialise the RC500
// must be call in the initialisation
PcdReadE2(8,4,Snr_RC500); // Read out the MFRC500 serial number and store it
auto_baud();
while (1)
{
M500PcdMfOutSelect(mfout);
auto_baud();
if (CmdValid)
{
CmdValid = FALSE;
cmd_execution();
CALL_isr_UART();
Idle = FALSE;
}
else if (Idle)
{
auto_baud();
idle_request();
auto_baud();
}
else
{
delay_10ms(10);
}
auto_baud();
}
}
/****************************************************************************
* *
* Function: init *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* *
****************************************************************************/
void init (void)
{
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
PCON = 0x80; // SMOD = 1;
SCON = 0x50; // Mode 1, 8-bit UART, enable receiption
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;
LED = OFF;
delay_10ms(50);
LED = ON;
IT0 = 1; // Config ext0 as edge trigger for RC500
EX0 = 1; // Enable ext0 interrupt for RC500
EA = TRUE; // Enable all interrupts
}
/****************************************************************************
* *
* Function: cmd_execution *
* *
* Input: SerBuffer[] *
* Output: SerBuffer[] *
* *
* Description: *
* *
* *
****************************************************************************/
void cmd_execution (void)
{
uchar Status;
uchar len;
uchar cmd;
uchar adr;
uchar tmp[16];
//uchar snr[4];
uchar size;
uchar tt[2];
static uchar mode,value[4],addr;
len = SerBuffer[LENGTH];
SerBuffer[LENGTH] = 0;
cmd = SerBuffer[COMMAND];
switch (cmd)
{
case 0x40: // HL-Authentication
Status = M500PiccRequest(PICC_REQALL, tt);
if (Status != MI_OK)
{
break;
}
memcpy(card_snr,&SerBuffer[HL_SERNR],4);
Status = M500PiccSelect(&SerBuffer[HL_SERNR], &size);
if (Status != MI_OK)
{
break;
}
if(SerBuffer[HLAUTHMODE]&0X04) SerBuffer[HLAUTHMODE]=PICC_AUTHENT1B; // keyB
else SerBuffer[HLAUTHMODE]=PICC_AUTHENT1A; // keyA
//Status = M500PiccAuth(SerBuffer[HLAUTHMODE], card_snr, SerBuffer[HLSECNR],
// (SerBuffer[HLSECNR]+1)*4-1);
Status = M500PiccAuthE2(SerBuffer[HLAUTHMODE], card_snr, SerBuffer[HLSECNR],
(SerBuffer[HLSECNR]+1)*4-1);
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;
}
break;
case 0x42: // Anticoll
Status = M500PiccAnticoll(SerBuffer[BCNT], &SerBuffer[SERNR]);
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 4;
}
break;
case 0x43: // Select
memcpy(card_snr,&SerBuffer[SERNR],4); // store serial number in globle var
Status = M500PiccSelect(&SerBuffer[SERNR], &SerBuffer[SIZE]);
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 1;
}
break;
case 0x44: // Authentication
if(SerBuffer[MODE]&0X04) SerBuffer[MODE]=PICC_AUTHENT1B; // keyB
else SerBuffer[MODE]=PICC_AUTHENT1A; // keyA
//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);
break;
case 0x45: // Halt
Status = M500PiccHalt();
break;
case 0x46: // Read
Status = M500PiccRead(SerBuffer[ADR], &SerBuffer[ADR]);
if (Status == MI_OK)
{
SerBuffer[LENGTH] = 16;
}
break;
case 0x47: // Write
Status = M500PiccWrite(SerBuffer[ADR], &SerBuffer[DATABYTES]);
break;
case 0x48: // Increment
mode = PICC_INCREMENT;
addr = SerBuffer[ADR];
memcpy(value,&SerBuffer[VALUE],4);
Status = MI_OK;
break;
case 0x49: // Decrement
mode = PICC_DECREMENT;
addr = SerBuffer[ADR];
memcpy(value,&SerBuffer[VALUE],4);
Status = MI_OK;
break;
case 0x4A: // Restore
mode = PICC_RESTORE;
addr = SerBuffer[ADR];
memset(value,0,4);
Status = MI_OK;
break;
case 0x4B: // Transfer
if (EnableTransferCmd)
{
Status = M500PiccValue(mode, addr, value, SerBuffer[ADR]);
}
else
{
Status = MI_CODEERR;
}
break;
case 0x4C: // Load Key
if(SerBuffer[MODE]&0X04) SerBuffer[MODE]=PICC_AUTHENT1B; // keyB
else SerBuffer[MODE]=PICC_AUTHENT1A; // keyA
//Status = M500PcdLoadMk(SerBuffer[MODE], SerBuffer[SECNR], &SerBuffer[13]);
Status = M500PcdLoadKeyE2(SerBuffer[MODE], SerBuffer[SECNR], &SerBuffer[13]);
break;
case 0x4D: // comm check char
if (SerBuffer[MODE] == SER_BCC)
{
CheckByteCnt = BCC_CHECKBYTECNT;
}
else
{
CheckByteCnt = CRC_CHECKBYTECNT;
}
Status = MI_OK;
break;
case 0x4E: // Reset
M500PcdRfReset(SerBuffer[TIME]);
Status = MI_OK;
break;
case 0x4F: // Get Info
if ((len == 0) || (len == 1 && SerBuffer[MODE] == 1))
{
for (adr = INFO; adr < INFO_CNT + INFO; adr++)
{
SerBuffer[adr] = SW_Rel[adr-INFO];
}
SerBuffer[adr++] = ' ';
SerBuffer[adr++] = '0';
SerBuffer[adr++] = 'x';
SerBuffer[adr++] = xtoa_h(Snr_RC500[0]);
SerBuffer[adr++] = xtoa_l(Snr_RC500[0]);
SerBuffer[adr++] = xtoa_h(Snr_RC500[1]);
SerBuffer[adr++] = xtoa_l(Snr_RC500[1]);
SerBuffer[adr++] = xtoa_h(Snr_RC500[2]);
SerBuffer[adr++] = xtoa_l(Snr_RC500[2]);
SerBuffer[adr++] = xtoa_h(Snr_RC500[3]);
SerBuffer[adr++] = xtoa_l(Snr_RC500[3]);
SerBuffer[adr++] = '\0';
SerBuffer[LENGTH] = adr - INFO;
}
else
{
if (SerBuffer[MODE] == 2)
{
SerBuffer[INFO] = (uchar) Capt;
SerBuffer[INFO + 1] = (uchar)(Capt >> 8);
SerBuffer[INFO + 2] = BaudRate;
SerBuffer[INFO + 3] = DelayRate;
}
else
{
SerBuffer[INFO] = Snr_RC500[0];
SerBuffer[INFO + 1] = Snr_RC500[1];
SerBuffer[INFO + 2] = Snr_RC500[2];
SerBuffer[INFO + 3] = Snr_RC500[3];
}
SerBuffer[LENGTH] = 4;
}
Status = MI_OK;
break;
case 0x50: // Set Control Bit
if (SerBuffer[INFO]&0x01)
Status = MI_OK;
if (SerBuffer[INFO]&0x02)
Status = MI_OK;
if (SerBuffer[INFO]&0x04)
Status = MI_OK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -