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

📄 timecardrecord.c

📁 门禁系统源代码 VC++
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -