📄 timecardrecord.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "TimecardRecord.h"
#include "AVR_TWI.h"
void set_eeprom_as(volatile unsigned char *uc_data)
{
if( (*uc_data != 0xA0) && (*uc_data != 0xA4) && (*uc_data != 0xA6) ) goto error;
unsigned int ui_data_addr;
unsigned char uc_device_addr;
unsigned int uc_cycle;
uc_device_addr = *uc_data;
set_buff_as(*(uc_data+1), 128, uc_pc_buff);
for(ui_data_addr=0; ui_data_addr<0xFF80;)
{
uc_cycle = 0;
re_write:
if( uc_cycle++ >= CYCLE_TRY ) goto error;
if( I2C_eeprom_write(uc_device_addr, ui_data_addr, 128, uc_pc_buff) == RW_SUC )
{
ui_data_addr+=128;
}
else
{
goto re_write;
}
}
trans_suc_msg(_SET_EEPROM_AS);
return;
error:
trans_err_msg(_SET_EEPROM_AS);
}
void set_system_time(unsigned char uc_len, volatile unsigned char *uc_data)
{
unsigned char uc_cycle;
uc_cycle=0;
re_write:
if( uc_cycle++ >= CYCLE_TRY ) goto error;
if( RTC_Write(0xA2, 0x02, uc_len, uc_data) )
{
goto re_write;
}
trans_suc_msg(_SET_TIME);
return;
error:
trans_err_msg(_SET_TIME);
}
void read_system_time(unsigned char uc_be_send_to_master)
{
unsigned char uc_temp;
unsigned char uc_cycle;
unsigned char uc_cycle_r;
uc_cycle=0;
begin:
if( uc_cycle++ >= CYCLE_TRY ) goto error;
if( RTC_Read(0xA2, 0x02) == RW_SUC )
{
for(uc_temp=0; uc_temp<7;)
{
uc_cycle_r=0;
re_read:
if( uc_cycle_r++ >= CYCLE_TRY ) goto error;
if( TWI_SLA_R() == 0x50 )
{
uc_systime[uc_temp++] = TWDR;
}
else
{
goto re_read;
}
}
TWI_Stop();
uc_systime[0] = uc_systime[0]&0x7F;
uc_systime[1] = uc_systime[1]&0x7F;
uc_systime[2] = uc_systime[2]&0x3F;
uc_systime[3] = uc_systime[3]&0x3F;
uc_systime[4] = uc_systime[4]&0x07;
uc_systime[5] = uc_systime[5]&0x1F;
uc_systime[6] = uc_systime[6]&0xFF;
if( uc_be_send_to_master == _READ_TIME )
{
trans_msg(_READ_TIME, 7, uc_systime);
}
return;
}
else
{
goto begin;
}
error:
TWI_Stop();
trans_err_msg(_READ_TIME);
}
void set_single_info(unsigned int ui_addr, unsigned int ui_addr_offset, unsigned char uc_be_warrant)
{
unsigned char uc_cycle;
unsigned char uc_cycle_r;
unsigned char uc_read_buff;
uc_cycle=0;
start_step1:
if( uc_cycle++ > CYCLE_TRY ) goto error;
if( I2C_eeprom_read(0xA0, (ui_addr_offset+(ui_addr/8))) == RW_SUC )
{
uc_cycle_r=0;
re_read_step1:
if( uc_cycle_r++ > CYCLE_TRY ) goto error;
if( TWI_SLA_R() == 0x50 )
{
uc_read_buff = TWDR;
TWI_Stop();
}
else
{
goto re_read_step1;
}
}
else
{
goto start_step1;
}
uc_cycle=0;
if( uc_be_warrant == 0x01 )
{
if( bit_is_clear(uc_read_buff, (ui_addr_offset+(ui_addr%8))) )
{
sbi(uc_read_buff, (ui_addr_offset+(ui_addr%8)));
goto start_step2;
}
}
else if( uc_be_warrant == 0x00 )
{
if( bit_is_set(uc_read_buff, (ui_addr_offset+(ui_addr%8))) )
{
cbi(uc_read_buff, (ui_addr_offset+(ui_addr%8)));
goto start_step2;
}
}
trans_suc_msg(_SET_SINGLE);
return;
start_step2:
if( uc_cycle++ > CYCLE_TRY ) goto error;
if( I2C_eeprom_write(0xA0, (ui_addr_offset+(ui_addr/8)), 1, &uc_read_buff) == RW_SUC )
{
trans_suc_msg(_SET_SINGLE);
return;
}
else
{
goto start_step2;
}
error:
trans_err_msg(_SET_SINGLE);
}
void set_single(volatile unsigned char *uc_data)
{
unsigned int ui_addr;
unsigned int ui_offset;
if( ((*(uc_data+5)) != 0x00) && ((*(uc_data+5)) != 0x01) ) goto error;
if( ((*uc_data) >= 'A') && ((*uc_data) <= 'Z') )
{
if( ((*(uc_data+1)) >= 'A') && ((*(uc_data+1)) <= 'Z') )
{
ui_addr = str_to_ui(3, uc_data+2);
if( ui_addr > 255 ) goto error;
ui_offset = (('Z'-'A'+2)*1024) + ((*uc_data)-'A') * 32 * ((*(uc_data+1))-'A') * 32;
set_single_info(ui_addr, ui_offset, (*(uc_data+5)));
return;
}
else if( ((*(uc_data+1)) >= '0') && ((*(uc_data+1)) <= '8') )
{
ui_addr = str_to_ui(4, uc_data+1);
if( ui_addr > 8191 ) goto error;
ui_offset = ((*uc_data)-'A')*1024;
set_single_info(ui_addr, ui_offset, (*(uc_data+5)));
return;
}
else
{
goto error;
}
}
else if( *uc_data == '#' )
{
ui_addr = str_to_ui(4, uc_data+1);
if( ui_addr > 8191 ) goto error;
ui_offset = ('Z'-'A'+1)*1024;
set_single_info(ui_addr, ui_offset, (*(uc_data+5)));
return;
}
else
{
goto error;
}
error:
trans_err_msg(_SET_SINGLE);
}
void read_single_info(unsigned int ui_addr, unsigned int ui_addr_offset, unsigned char uc_be_login)
{
unsigned char uc_cycle;
unsigned char uc_cycle_r;
unsigned char uc_read_buff;
uc_cycle=0;
start:
if( uc_cycle++ > CYCLE_TRY ) goto error;
if( I2C_eeprom_read(0xA0, (ui_addr_offset+(ui_addr/8))) == RW_SUC )
{
uc_cycle_r=0;
re_read:
if( uc_cycle_r++ > CYCLE_TRY ) goto error;
if( TWI_SLA_R() == 0x50 )
{
uc_read_buff = TWDR;
TWI_Stop();
if( uc_be_login == READ_FROM_PC )
{
trans_msg(_READ_SINGLE, 1, &uc_read_buff);
}
else if( uc_be_login == READ_FROM_BC )
{
if( bit_is_set(uc_read_buff, (ui_addr_offset+(ui_addr%8))) )
{
gate_opened();
read_system_time(READ_FROM_BC);
uc_id_buff[5] = uc_systime[0];
uc_id_buff[6] = uc_systime[1];
uc_id_buff[7] = uc_systime[2];
uc_id_buff[8] = uc_systime[3];
uc_id_buff[9] = uc_systime[4];
uc_id_buff[10] = uc_systime[5];
uc_id_buff[11] = uc_systime[6];
trans_msg(_BC_INTERRUPT, 12, uc_id_buff);
sbi(uc_SF, SF_BE_PC_RET);
}
else
{
sbi(PORTC, 6); // 无效ID显示
}
}
return;
}
else
{
goto re_read;
}
}
else
{
goto start;
}
error:
TWI_Stop();
if( uc_be_login == READ_FROM_PC )
{
trans_err_msg(_READ_SINGLE);
}
else if( uc_be_login == READ_FROM_BC )
{
trans_err_msg(_BC_INTERRUPT);
}
}
void read_single_from_pc_or_bc(volatile unsigned char *uc_data, unsigned char uc_pc_or_bc)
{
unsigned int ui_addr;
unsigned int ui_offset;
if( (uc_pc_or_bc != READ_FROM_BC) && (uc_pc_or_bc != READ_FROM_PC) ) goto error;
if( ((*uc_data) >= 'A') && ((*uc_data) <= 'Z') )
{
if( ((*(uc_data+1)) >= 'A') && ((*(uc_data+1)) <= 'Z') )
{
ui_addr = str_to_ui(3, uc_data+2);
if( ui_addr > 255 ) goto error;
uc_id_buff[0] = *(uc_data+0);
uc_id_buff[1] = *(uc_data+1);
uc_id_buff[2] = *(uc_data+2);
uc_id_buff[3] = *(uc_data+3);
uc_id_buff[4] = *(uc_data+4);
ui_offset = (('Z'-'A'+2)*1024) + ((*uc_data)-'A') * 32 * ((*(uc_data+1))-'A') * 32;
read_single_info(ui_addr, ui_offset, uc_pc_or_bc);
return;
}
else if( ((*(uc_data+1)) >= '0') && ((*(uc_data+1)) <= '8') )
{
ui_addr = str_to_ui(4, uc_data+1);
if( ui_addr > 8191 ) goto error;
uc_id_buff[0] = *(uc_data+0);
uc_id_buff[1] = *(uc_data+1);
uc_id_buff[2] = *(uc_data+2);
uc_id_buff[3] = *(uc_data+3);
uc_id_buff[4] = *(uc_data+4);
ui_offset = ((*uc_data)-'A')*1024;
read_single_info(ui_addr, ui_offset, uc_pc_or_bc);
return;
}
else
{
goto error;
}
}
else if( *uc_data == '#' )
{
ui_addr = str_to_ui(4, uc_data+1);
if( ui_addr > 8191 ) goto error;
uc_id_buff[0] = *(uc_data+0);
uc_id_buff[1] = *(uc_data+1);
uc_id_buff[2] = *(uc_data+2);
uc_id_buff[3] = *(uc_data+3);
uc_id_buff[4] = *(uc_data+4);
ui_offset = ('Z'-'A'+1)*1024;
read_single_info(ui_addr, ui_offset, uc_pc_or_bc);
return;
}
else
{
goto error;
}
error:
if( uc_pc_or_bc == READ_FROM_PC )
{
trans_err_msg(_READ_SINGLE);
}
else if( uc_pc_or_bc == READ_FROM_BC )
{
trans_err_msg(_BC_INTERRUPT);
}
}
void format_number_id(volatile unsigned char *uc_data, unsigned char uc_bc_or_file)
{
unsigned char i;
unsigned char uc_bc_temp[6];
uc_bc_temp[0] = '#';
for(i=1;i<5;i++)
{
uc_bc_temp[i] = *uc_data++;
}
if( uc_bc_or_file == READ_FROM_BC )
{
uc_bc_temp[5] = 0x00;
read_single_from_pc_or_bc(uc_bc_temp, uc_bc_or_file);
}
else if( uc_bc_or_file == READ_FROM_FILE )
{
uc_bc_temp[5] = 0x01;
set_single(uc_bc_temp);
}
}
void read_eeprom(volatile unsigned char *uc_data)
{
unsigned int ui_data_addr;
unsigned char uc_device_addr;
unsigned char uc_data_len;
unsigned char uc_cycle;
unsigned char uc_cycle_r;
unsigned char uc_index;
ui_data_addr = (*(uc_data+1))*256 + (*(uc_data+2));
uc_device_addr = *uc_data;
uc_data_len = *(uc_data+3);
if( (uc_device_addr != 0xA0) && (uc_device_addr != 0xA4) && (uc_device_addr != 0xA6) ) goto error;
if( uc_data_len > 128 ) goto error;
if( ((ui_data_addr%128) + uc_data_len) > 128 ) goto error;
uc_cycle=0;
begin:
if( uc_cycle++ >= CYCLE_TRY ) goto error;
if( I2C_eeprom_read(uc_device_addr, ui_data_addr) == RW_SUC )
{
for(uc_index=0; uc_index<uc_data_len; )
{
uc_cycle_r=0;
re_read:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -