***************************************************************************
??: ???????(?RFID)
??: STC12C5A60S2
MFRC522: SPI??
??: ???????????
****************************************************************************/
#include "stc12.h"
#include "mfrc522.h"
#include "lcd1602.h"
#include <string.h>
#include "uart.h"
// ????
void delay10ms(unsigned int tt);
void card_num_dis(void);
void iccardcode(void);
void InitializeSystem(void);
void uart1_command_scan(void);
bit rfid_reconnect(void);
#define START_CHAR 0X02
#define END_CHAR 0X03
#define MAX_RETRY 3
// ????
#define CMD_BORROW 0x01
#define CMD_RETURN 0x02
#define CMD_QUERY 0x03
// RFID????
typedef enum {
RFID_IDLE,
RFID_AUTH_SUCCESS,
RFID_WRITE_SUCCESS
} RfidStatus;
// ???????
unsigned char xdata uart1_buffer[10];
unsigned char xdata wptr1;
unsigned char xdata cmd_rec_buffer[5];
unsigned char xdata cmd_cnt;
bit cmd_rec_start_flag;
bit cmd_rec_end_flag;
unsigned char xdata uart1_cmd;
unsigned char xdata uart_para;
sbit SPK = P3^6;
// ???????
typedef struct {
unsigned char book_id[3];
unsigned char status;
unsigned char borrower[5];
} BookInfo;
BookInfo xdata books[10];
unsigned char xdata current_book_id[3];
unsigned char xdata card_id[5];
unsigned char code ERR[] = {"ERR"};
unsigned char code DefaultKey[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
unsigned char xdata MLastSelectedSnr[4]; // ??xdata??,????????
unsigned char xdata RevBuffer[10]; // ??xdata??
unsigned char xdata COMBuffer[5]; // ??xdata??
unsigned char code asc_code[] = "0123456789ABCDEF";
// ???????
void init_book_info() {
unsigned char i;
for (i = 0; i < 10; i++) {
books[i].book_id[0] = '0' + i / 10;
books[i].book_id[1] = '0' + i % 10;
books[i].book_id[2] = '\0';
books[i].status = 0;
memset(books[i].borrower, 0, 5);
}
}
// ??????
void display_book_status(unsigned char book_id) {
unsigned char xdata status_msg[11] = {0};
if (book_id < 10) {
strcpy(status_msg, books[book_id].status ? "Borrowed " : "Available");
} else {
strcpy(status_msg, "Invalid ID");
}
DisplayListChar(0, 1, status_msg);
}
// RFID????
bit rfid_reconnect(void) {
unsigned char retry = 0;
for (retry = 0; retry < MAX_RETRY; retry++) {
PcdHalt();
delay10ms(20);
if (PcdRequest(PICC_REQIDL, RevBuffer) != MI_OK) continue;
if (PcdAnticoll(&RevBuffer[2]) != MI_OK) continue;
memcpy(MLastSelectedSnr, &RevBuffer[2], 4);
if (PcdSelect(MLastSelectedSnr) != MI_OK) continue;
if (PcdAuthState(PICC_AUTHENT1A, 4, DefaultKey, MLastSelectedSnr) == MI_OK) {
return 1;
}
delay10ms(10);
}
return 0;
}
// ????
void borrow_book() {
unsigned char book_id = (current_book_id[0] - '0') * 10 + (current_book_id[1] - '0');
unsigned char retry = 0;
if (book_id >= 10) { DisplayListChar(0, 1, "Invalid ID"); return; }
if (books[book_id].status == 1) { DisplayListChar(0, 1, "Already borrowed"); return; }
RevBuffer[2] = book_id;
for (retry = 0; retry < MAX_RETRY; retry++) {
if (!rfid_reconnect()) {
DisplayListChar(10, 1, "Recon ERR");
continue;
}
delay10ms(5);
if (PcdWrite(4, &RevBuffer[2]) == MI_OK) {
delay10ms(5);
if (PcdRead(4, &RevBuffer[2]) == MI_OK && RevBuffer[2] == book_id) {
books[book_id].status = 1;
// ????,??????
memcpy(books[book_id].borrower, MLastSelectedSnr, 4);
Uart_Send_String("Borrow success!");
DisplayListChar(0, 1, "Borrow success");
uart1_cmd = 0x03;
return;
}
}
DisplayListChar(2, 1, "Try:");
DisplayListChar(4, 1, '0' + retry + 1);
delay10ms(50);
}
DisplayListChar(2, 1, "Write error!");
}
// ????
void return_book() {
unsigned char book_id = (current_book_id[0] - '0') * 10 + (current_book_id[1] - '0');
unsigned char retry = 0;
if (book_id >= 10) { DisplayListChar(0, 1, "Invalid ID"); return; }
if (books[book_id].status == 0) { DisplayListChar(0, 1, "Not borrowed"); return; }
// ????,??????
if (memcmp(books[book_id].borrower, MLastSelectedSnr, 4) != 0) {
DisplayListChar(0, 1, "Not your book"); return;
}
RevBuffer[2] = 0;
for (retry = 0; retry < MAX_RETRY; retry++) {
if (!rfid_reconnect()) {
DisplayListChar(10, 1, "Recon ERR");
continue;
}
delay10ms(5);
if (PcdWrite(4, &RevBuffer[2]) == MI_OK) {
delay10ms(5);
if (PcdRead(4, &RevBuffer[2]) == MI_OK && RevBuffer[2] == 0) {
books[book_id].status = 0;
memset(books[book_id].borrower, 0, 5);
Uart_Send_String("Return success!");
DisplayListChar(0, 1, "Return success");
uart1_cmd = 0x03;
return;
}
}
DisplayListChar(2, 1, "Try:");
DisplayListChar(4, 1, '0' + retry + 1);
delay10ms(50);
}
DisplayListChar(2, 1, "Write error!");
}
// 10ms????
void delay10ms(unsigned int tt) {
unsigned int i;
for(i = 0; i < tt; i++)
Dly10ms();
}
// ????
void card_num_dis(void) {
unsigned char i;
if(uart_para == 0x06) {
Sent_UART(0x0d); Sent_UART(0x0a);
Uart_Send_String("Card num:");
for (i = 0; i < 4; i++) {
Sent_UART(asc_code[(MLastSelectedSnr[i]>>8)&0X0f]);
Sent_UART(asc_code[(MLastSelectedSnr[i])&0X0f]);
}
Sent_UART(0x0d); Sent_UART(0x0a);
// ????,??????
memcpy(card_id, MLastSelectedSnr, 4);
}
}
// RFID???
void iccardcode() {
if( PcdRequest( PICC_REQIDL, RevBuffer ) != MI_OK ){
if( PcdRequest( PICC_REQIDL, RevBuffer ) != MI_OK )
return;
}
if( PcdAnticoll( &RevBuffer[2] ) != MI_OK ) {
DisplayListChar(10,1,ERR);
return;
}
memcpy(MLastSelectedSnr, &RevBuffer[2], 4);
if( PcdSelect(MLastSelectedSnr) != MI_OK ) {
DisplayListChar(10,1,ERR);
return;
}
if(PcdAuthState(PICC_AUTHENT1A, 4, DefaultKey, MLastSelectedSnr) != MI_OK) {
DisplayListChar(10,1,ERR);
return;
}
// ????
if(uart1_cmd == CMD_BORROW) borrow_book();
else if(uart1_cmd == CMD_RETURN) return_book();
else if(uart1_cmd == CMD_QUERY) {
card_num_dis();
unsigned char bid = (current_book_id[0] - '0') * 10 + (current_book_id[1] - '0');
display_book_status(bid);
}
if(PcdRead(4, &RevBuffer[2]) != MI_OK) {
DisplayListChar(10,1,ERR);
return;
}
PcdHalt();
DisplayListChar(0, 0, "Library System");
DisplayListChar(0, 1, "Ready");
SPK = 0; delay10ms(50); SPK = 1;
}
// ?????
void InitializeSystem() {
delay10ms(80);
LCDInit();
DisplayListChar(0, 0, "Library System");
DisplayListChar(0, 1, "Ready");
init_book_info();
cmd_rec_buffer[0] = 0x03;
cmd_cnt = 0;
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
Uart_Init();
SPK = 0; delay10ms(50); SPK = 1;
}
// ??1????
void uart1_command_scan(void) {
if((wptr1 > 0) && (uart1_buffer[0] != 0x02)) wptr1 = 0;
if(wptr1 > 3) {
wptr1 = 0;
if(uart1_buffer[3] == 0x03) {
uart1_cmd = uart1_buffer[1];
uart_para = uart1_buffer[2];
if (uart1_cmd == CMD_BORROW || uart1_cmd == CMD_RETURN || uart1_cmd == CMD_QUERY) {
current_book_id[0] = '0' + (uart_para / 10);
current_book_id[1] = '0' + (uart_para % 10);
current_book_id[2] = '\0';
Uart_Send_String("Please place card:");
}
}
}
}
// ???
void main( ) {
InitializeSystem( );
while (1) {
uart1_command_scan();
iccardcode();
}
}
// UART????
void InterruptUART() interrupt 4 {
if(RI) {
RI = 0;
uart1_buffer[wptr1++] = SBUF;
if(wptr1 > 5) wptr1 = 0;
}
if (TI) TI = 0;
}Rebuild target 'Target 1'
compiling lcd1602.c...
compiling MAIN.C...
MAIN.C(139): error C214: illegal pointer conversion
compiling RC522.C...
compiling uart.c...
Target not created.
Build Time Elapsed: 00:00:01