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

📄 main.c

📁 射频卡读卡头的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  //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;
	  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
// _____________________________________________________________________________
//
//  FUNCTION: M500PcdLoadKeyE2
//        IN: key_type      PICC_AUTHENT1A or PICC_AUTHENT1B
//            sector        key sector number, on which the key should be stored
//                          values from 0 to 15 are valid
//            uncoded_keys  6 bytes key
//       OUT: -
//    RETURN:
//   COMMENT: This function stores the keys in the reader internal E2PROM.
//            These keys are available for the function M500PiccAuthE2.
// ______________________________________________________________________________
//
	  Status = M500PcdLoadKeyE2(SerBuffer[MODE], SerBuffer[SECNR], &SerBuffer[13]);
      ErrNum = Status;
	  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;

	  Status = MI_OK;
	  break;


	case 0x51:					// Clr Control Bit

	  Status = MI_OK;
	  break;


	case 0x52:                  			// Config

	  Status = M500PcdConfig();

#ifdef AUTODELAY
	  DelayRate = 0;
#endif
	  break;


	case 0x53:					// Check Write

	  Status = MIS_CHK_FAILED;

	  if (M500PiccRequest(PICC_REQALL, tt) != MI_OK)
	  {
		if (M500PiccRequest(PICC_REQALL, tt) != MI_OK)
		{
		  break;
		}
	  }
	  if (M500PiccSelect(&SerBuffer[SERNR], &size) != MI_OK)
	  {
		if (M500PiccRequest(PICC_REQALL, tt) != MI_OK)
		{
		  break;
		}
		if (M500PiccSelect(&SerBuffer[SERNR], &size) != MI_OK)
		{
		  break;
		}
	  }
	  memcpy(card_snr,&SerBuffer[SERNR],4);
	  if(SerBuffer[AUTHMODE]&0X04) SerBuffer[AUTHMODE]=PICC_AUTHENT1B; // keyB
	  else SerBuffer[AUTHMODE]=PICC_AUTHENT1A; // keyA

	  //if (Status = M500PiccAuth(SerBuffer[AUTHMODE], card_snr,
	  //			    SerBuffer[ADRCHKWR]>>2, SerBuffer[ADRCHKWR]) != MI_OK)
	  if (Status = M500PiccAuthE2(SerBuffer[AUTHMODE], card_snr,
				    SerBuffer[ADRCHKWR]>>2, SerBuffer[ADRCHKWR]) != MI_OK)
	  {
		break;
	  }

	  if (M500PiccRead(SerBuffer[ADRCHKWR], tmp) != MI_OK)
	  {
		break;
	  }

	  if (memcmp(&SerBuffer[DATACHKWR], tmp, 16) != MI_OK)
	  {
		Status = MIS_CHK_COMPERR;
	  }
	  else
	  {
		Status = MIS_CHK_OK;
	  }
	  break;


	case 0x54:					// Set Port

	  P1 |= (SerBuffer[PORTBYTE]&0x0f);  // set the desired port pin
	  P1 &=  (SerBuffer[PORTBYTE]|0xf0); // clear the desired port pin
	  if (SerBuffer[PORTBYTE]&0x10)
		LED = ON;
	  else
		LED = OFF;
   	  Status = MI_OK;
   	  break;


	case 0x55:					// Get Port

	  SerBuffer[PORTBYTE] = P1&0xf;
	  SerBuffer[LENGTH] = 1;
	  Status = MI_OK;
	  break;

    case 0x56:                  		// Authentication2

	  if(SerBuffer[MODE]&0X04) SerBuffer[MODE]=PICC_AUTHENT1B; // keyB
	  else SerBuffer[MODE]=PICC_AUTHENT1A; // keyA

	  //Status = M500PiccAuth(SerBuffer[MODE], card_snr,
	  //			SerBuffer[SECNR], SerBuffer[AUTHADD]);
   	  Status = M500PiccAuthE2(SerBuffer[MODE], card_snr,
				SerBuffer[SECNR], SerBuffer[AUTHADD]);
   	  break;


	case 0x57:                  		// Decrement+Transfer

	  Status = M500PiccValue(PICC_DECREMENT, SerBuffer[ADR], &SerBuffer[VALUE], SerBuffer[ADR]);
	  break;

        default:

	  Status = MI_NY_IMPLEMENTED;
	  break;


  } // end switch (Command)

  SerBuffer[STATUS] = ~Status+1;

  if (cmd < 0x48 || cmd > 0x4A)
  {
	EnableTransferCmd = FALSE;
  }
  else
  {
	EnableTransferCmd = TRUE;
  }
}


/****************************************************************************
*                                                                           *
* Function:     auto_baud                                                   *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Mi醫 die Zeitspanne zwischen Start- und Stopbit des ersten empfangenen    *
* Zeichens (STX) und ermittelt daraus die Baudrate.                         *
*                                                                           *
****************************************************************************/

void 	auto_baud (void)
{
  //int temp;

  if (AutoBaud && !RXD)	// If autobaud is enable and RXD pin is low
  {
	TR0 = TRUE;     // Start timer0

	do
	{
	  if (RXD)    	// When RXD pin is high
	  {
		Capt_L = TL0;
		Capt_H = TH0;

		do
		{
		  if (!RXD)
		  {
			break;
		  }
		} while (!TF0);
	  }
	} while (!TF0);

	TR0 = FALSE;
	TF0 = FALSE;

	Capt = ((uint)Capt_H << 5) | ((uint)Capt_L & 0x001F);

	for (BaudRate = BAUD_CNT; BaudRate >= 0; BaudRate--)
	{
	  if (Capt >= CmpTable[BaudRate])
	  {
		break;
	  }
	}

	if (BaudRate < 0 || BaudRate == BAUD_CNT) // Error baud count
	{
	  TH0    = 0;
	  TL0    = 0;
	  Capt_L = 0;
	  Capt_H = 0;
	  return;
	}

	TMOD = 0x21;                   	// Timer 0, mode 1, 16-bit counter
	TH1  = BaudRateTable[BaudRate];
	TL1  = TH1;
	TR1  = TRUE;

	TH0  = 0xE0;
	TL0  = 0;
	TR0  = TRUE;
	while (!TF0);                   // Wait 4.4 ms
	TR0  = FALSE;
	TF0  = FALSE;
	ET0  = TRUE;

	AutoBaud = FALSE;		// Baudrate had been choose, disable Autobaud

	SBUF = NAK;
	while (!TI);
	TI   = FALSE;
	RI   = FALSE;
	ES   = TRUE;
  }
}

#pragma noaregs

/****************************************************************************
*                                                                           *
* Function:     delay_50us                                                  *
*                                                                           *
* Input:        _50us                                                       *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Time delay with a resolution of 50 us.                                    *
*                                                                           *
****************************************************************************/

void 	delay_50us (uchar _50us)
{

  RCAP2LH = RCAP2_50us;
  T2LH    = RCAP2_50us;
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer

  while (_50us--)
  {
	while (!TF2);
	TF2 = FALSE;
  }

  TR2 = FALSE;

}


/****************************************************************************
*                                                                           *
* Function:     delay_1ms                                                   *
*                                                                           *
* Input:        _1ms                                                        *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Time delay with a resolution of 1 ms.                                     *
*                                                                           *
****************************************************************************/

void 	delay_1ms (uchar _1ms)
{

  RCAP2LH = RCAP2_1ms;
  T2LH    = RCAP2_1ms;
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer

  while (_1ms--)
  {
	while (!TF2);
	TF2 = FALSE;
  }
  TR2 = FALSE;

}


/****************************************************************************
*                                                                           *
* Function:     delay_10ms                                                  *
*                                                                           *
* Input:        _10ms                                                       *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Time delay with a resolution of 10 ms.                                    *
*                                                                           *
****************************************************************************/

void 	delay_10ms (uint _10ms)
{

  RCAP2LH = RCAP2_10ms;
  T2LH    = RCAP2_10ms;
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer


  while (_10ms--)
  {
	while (!TF2)
	{
	  if (CmdValid || CmdReceived)
	  {
		TR2 = FALSE;
		TF2 = FALSE;
		return;
	  }
	}
	TF2 = FALSE;
  }
  TR2 = FALSE;

}



void test_10ms(uint n_10ms)
{

  RCAP2LH = RCAP2_10ms;
  T2LH    = RCAP2_10ms;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -