📄 timecardrecord.h
字号:
#ifndef _TIMECARDRECORD_H
#define _TIMECARDRECORD_H
#include "AVR_TWI.h"
#define sbi(Port, Bit) (Port |= (1<<Bit))
#define cbi(Port, Bit) (Port &= ~(1<<Bit))
#define eoi(Port, Bit) (Port ^= (1<<Bit))
#define READ_FROM_FILE 0x02
#define READ_FROM_BC 0x01
#define READ_FROM_PC 0x00
#define BaudRate_BC 9600
#define BaudRate_PC 9600
#define _COMMAND_HEAD 0xEE //'@'
#define _COMMAND_TAIL 0xFE //'#'
#define _REQUEST_ERR 0x00 //'?'
#define _REQUEST_DONE 0xC0 //'='
#define _SET_EEPROM_AS 0xC1 //'!'
#define _SET_TIME 0xC2 //'('
#define _READ_TIME 0xC3 //')'
#define _SET_SINGLE 0xC4 //'['
#define _READ_SINGLE 0xC5 //']'
#define _READ_EEPROM 0xC6
#define _WRITE_EEPROM 0xC7
#define _BC_INTERRUPT 0xC8 //'^'
#define CMD_VALID_TIME 3
#define CYCLE_TRY 200
#define PC_ACK_OVERTIME 2000
volatile unsigned int uc_be_pc_ack;
volatile unsigned char uc_pc_buff[192];
volatile unsigned char uc_pc_counter;
volatile unsigned char uc_pc_valid_time;
volatile unsigned char uc_bc_buff[64];
volatile unsigned char uc_bc_counter;
volatile unsigned char uc_bc_valid_time;
volatile unsigned long ul_list_counter;
volatile unsigned char uc_file_buff[64];
volatile unsigned char uc_file_pos;
volatile unsigned char uc_id_buff[12];
volatile unsigned char uc_SF;
#define SF_BE_PC_RET 0
volatile unsigned char uc_systime[7];
// second
// minute
// hour
// day
// week
// month
// year
#define gate_closed() sbi(PORTC, 1) // 关闭闸机
#define gate_opened() cbi(PORTC, 1) // 打开闸机
#define command_start() sbi(PORTC, 7)
#define command_finish() cbi(PORTC, 7)
void set_buff_as(unsigned char uc_value, unsigned char uc_len, volatile unsigned char *uc_data)
{
while( uc_len )
{
*uc_data++ = uc_value;
--uc_len;
}
}
unsigned int str_to_ui(unsigned char uc_len, volatile unsigned char *uc_data)
{
unsigned int ui_addr = 0;
while( uc_len )
{
ui_addr = ui_addr*10 + ((*uc_data) - 0x30);
++uc_data;
--uc_len;
}
return ui_addr;
}
void printf_char(volatile unsigned char uc_data)
{
loop_until_bit_is_set(UCSR0A, UDRE); // 等待数据寄存器准备就绪(为空)
UDR0 = uc_data; // 将需要发送的数据装载入数据寄存器
loop_until_bit_is_set(UCSR0A, TXC); // 等待发送完毕
}
void printf_string(unsigned char uc_len, volatile unsigned char* uc_string)
{
while( uc_len )
{
printf_char(*uc_string++);
--uc_len;
}
}
void trans_suc_msg(unsigned char uc_cmd_type)
{
printf_char(_COMMAND_HEAD);
printf_char(_REQUEST_DONE);
printf_char(uc_cmd_type);
printf_char(_COMMAND_TAIL);
}
void trans_err_msg(unsigned char uc_cmd_type)
{
printf_char(_COMMAND_HEAD);
printf_char(_REQUEST_ERR);
printf_char(uc_cmd_type);
printf_char(_COMMAND_TAIL);
}
void trans_msg(unsigned char uc_cmd_type, unsigned char uc_len, volatile unsigned char *uc_data)
{
printf_char(_COMMAND_HEAD);
printf_char(_REQUEST_DONE);
printf_char(uc_cmd_type);
while( uc_len )
{
printf_char(*uc_data);
++uc_data;
--uc_len;
}
printf_char(_COMMAND_TAIL);
}
void Init_BarcodeUsart(void)
{
// 9600,8,1,N
UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE1);
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
// U2X=0时的计算公式
UBRR1L = (F_CPU/BaudRate_BC/16-1)%256;
UBRR1H = (F_CPU/BaudRate_BC/16-1)/256;
}
void Init_PCUsart(void)
{
// 38400,8,1,N
UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
// U2X=0时的计算公式
UBRR0L = (F_CPU/BaudRate_PC/16-1)%256;
UBRR0H = (F_CPU/BaudRate_PC/16-1)/256;
}
void Init_Timer1(void)
{
TCCR1A = (1<<COM1A0);
TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10); // f/1024,CTC
OCR1A = 7499; // 1s
TIMSK |= (1<<OCIE1A);
}
/* *** 指令格式 *** *\
设置存储器的所有单元为同一个数据:
PC REQUEST: _COMMAND_HEAD
+ _SET_EEPROM_AS
+ device_addr
+ data
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _SET_EEPROM_AS
_COMMAND_TAIL
单个成员权限设置:
PC REQUEST: _COMMAND_HEAD
+ _SET_SINGLE
+ ID_0
+ ID_1
+ ID_2
+ ID_3
+ ID_4
+ True/False // 能否进出的信息
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _SET_SINGLE
_COMMAND_TAIL
单个成员权限情况读取:
PC REQUEST: _COMMAND_HEAD
+ _READ_SINGLE
+ ID_0
+ ID_1
+ ID_2
+ ID_3
+ ID_4
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _READ_SINGLE
+ data
_COMMAND_TAIL
时间设置:
PC REQUEST: _COMMAND_HEAD
+ _SET_TIME
+ second [BCD]
+ minute [BCD]
+ hour [BCD]
+ day [BCD]
+ week [BCD]
+ month [BCD]
+ year [BCD]
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _SET_TIME
_COMMAND_TAIL
时间读取:
PC REQUEST: _COMMAND_HEAD
+ _READ_TIME
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _READ_TIME
+ second [BCD]
+ minute [BCD]
+ hour [BCD]
+ day [BCD]
+ week [BCD]
+ month [BCD]
+ year [BCD]
_COMMAND_TAIL
读取存储单元数据:
PC REQUEST: _COMMAND_HEAD
+ _READ_EEPROM
+ device_addr
+ data_addr_H
+ data_addr_L
+ data_len // <= 128
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _READ_LIST
+ *data
_COMMAND_TAIL
写存储单元数据:
PC REQUEST: _COMMAND_HEAD
+ _WRITE_EEPROM
+ device_addr
+ data_addr_H
+ data_addr_L
+ data_len // <= 128
+ *data
_COMMAND_TAIL
MCU ACK: _COMMAND_HEAD
+ _REQUEST_DONE / _REQUEST_ERR
+ _WRITE_EEPROM
+ data
_COMMAND_TAIL
barcode id 发送格式:
MCK REQUEST: _COMMAND_HEAD
+ _BC_INTERRUPT
+ id_0 // 5bytes
+ id_1 // 5bytes
+ id_2 // 5bytes
+ id_3 // 5bytes
+ id_4 // 5bytes
+ time_0
+ time_1
+ time_2
+ time_3
+ time_4
+ time_5
+ time_6
_COMMAND_TAIL
PC ACK: _COMMAND_HEAD
+ _BC_INTERRUPT
_COMMAND_TAIL
barcode id 存储格式:
[id_0][id_1][id_2][id_3][id_4][year][month][day][hour][minute][second][week]
\* ******************************* */
/* *** Baudrate 计算公式 *** *\
U2X=0时的公式计算:
UBRRL = (F_CPU/BaudRate/16-1)%256;
UBRR1H = (F_CPU/BaudRate/16-1)/256;
U2X=1时的公式计算(倍速工作模式):
UBRRL = (F_CPU/BaudRate/8-1)%256;
UBRRH = (F_CPU/BaudRate/8-1)/256;
\* ******************************* */
/* *** PINOUT *** *\
Digital Output: L00 - L07 ( PC0 - PC7 )
Digital Input: D00 - D02 ( PE5 - PE7 [INT5 - INT7] )
D03 - D07 ( PF3 - PF7 )
Barcode USART: M64 USART1 ( PD2 [RXD1] , PD3 [TXD1] )
PC USART: M64 USART0 ( PE0 [RXD0] , PE1 [TXD0] )
EEPROM:
EEPR_WE ( PF0 )
24C512 device address: 1010 0 A1 A0 0 --> 0xA0, 0xA2, 0xA4, 0xA6
I2C:
SCL ( PD0 )
SDA ( PD1 )
KEYBOARD:
DAT ( PE3 )
CLK ( PE4 [INT4] )
LCD:
1: GND
2: VCC
3: BK_LIGHT
4: VCC
5: PA7
6: PA6
7: PA5
8: PA4
9: PA3
10: PA2
11: PA1
12: PA0
13: PB5
14: PB4
15: PB3
16: PB2
17: PB1
18: PB0
\* ******************************* */
/* *** ID address List *** *\
EEPROM 24C512 ADDR: 0xA0
所有情况如下
1: A**** - Z**** 26 * 8192 / 8 = 26624 offset=1024
2: AA*** - ZZ*** 676 * 256 / 8 = 21632 offset=32
3: #0000 - #9999 1 * 8192 / 8 = 1024 offset=1024
\* ******************************* */
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -