📄 main.c
字号:
//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 + -