⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 RFID 函数接口的部分设计
💻 C
📖 第 1 页 / 共 3 页
字号:
	/****************************************************************************
	*                                                                           *
	* 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 + -