📄 htd30v02.c
字号:
fm_send(0xa0);
fm_send(step*(read_len/256));
// fm_send((step==0)?40:0);
fm_send(0);
_nop_();
_nop_();
_nop_();
_nop_();
// for(i=((step==0)?40:0);i<read_len;i++) //如果当前读取的数据是24C64的前2048字节,要把密码区隐藏(内容是随机的)
for(i=0;i<read_len;i++)
{
fm_start();
fm_send(0xa1);
DBUF[i]=fm_take();
}
fm_stop();
}
//write fm_ram,按照load_add指向的缓冲位置的数据作为数据源,由SECTOR确定的扇区地址映射的FM地址写入write_len长度的数据
//void fm_write_dbuf(uchar *load_add,uint write_len,uchar sector)
// {
// fm_start();
// fm_send(0xa0);
// fm_send((sector-36)*2);
// fm_send(0);
// while(write_len--)
// {
// fm_send(*load_add++);
// }
// fm_stop();
// }
//write fm_ram
void fm_write_long(uchar *load_add,uint write_len)
{
fm_start();
fm_send(0xa0);
fm_send(add_start.add_byte[0]);
fm_send(add_start.add_byte[1]);
while(write_len--)
{
fm_send(*load_add++);
}
fm_stop();
}
//write fm_ram
void fm_write(uchar *load_add,uchar write_len)
{
fm_start();
fm_send(0xa0);
fm_send(add_start.add_byte[0]);
fm_send(add_start.add_byte[1]);
while(write_len--)
{
fm_send(*load_add++);
}
fm_stop();
}
void fm_write_fill(uchar write_len,uchar write_contain)
{
fm_start();
fm_send(0xa0);
fm_send(add_start.add_byte[0]);
fm_send(add_start.add_byte[1]);
while(write_len--)
{
fm_send(write_contain);
}
fm_stop();
}
void time_start(void)
{
FM3164_SDA=1;
_nop_();
_nop_();
_nop_();
FM3164_SCL=1;
_nop_();
_nop_();
_nop_();
FM3164_SDA=0;
_nop_();
_nop_();
_nop_();
FM3164_SCL=0;
}
void time_stop(void)
{
FM3164_SDA=0;
_nop_();
_nop_();
_nop_();
FM3164_SCL=1;
_nop_();
_nop_();
_nop_();
FM3164_SDA=1;
_nop_();
_nop_();
_nop_();
FM3164_SCL=0;
_nop_();
_nop_();
_nop_();
FM3164_SDA=0;
}
//void ack_same(void)
// {
// FM3164_SCL=1;
// _nop_();
// _nop_();
// _nop_();
// FM3164_SCL=0;
// }
void time_send(uchar eedata)
{
uchar i;
i=8;
while(i--)
{
FM3164_SCL=0;
_nop_();
_nop_();
_nop_();
if(eedata&0x80)
FM3164_SDA=1;
else
FM3164_SDA=0;
FM3164_SCL=1;
eedata<<=1;
}
FM3164_SCL=0;
}
uchar time_take(void)
{
uchar i=8;
uchar worth=0;
FM3164_SDA=1;
_nop_();
_nop_();
_nop_();
while(i--)
{
FM3164_SCL=0;
_nop_();
_nop_();
_nop_();
FM3164_SCL=1;
_nop_();
_nop_();
_nop_();
worth<<=1;
if(FM3164_SDA)
worth++;
}
FM3164_SCL=0;
_nop_();
_nop_();
_nop_();
return(worth);
}
void wait_ack(void)
{
uchar wait_time;
wait_time=255;
FM3164_SCL=1;
while(FM3164_SDA)
{
wait_time--;
if(wait_time==0)
break;
}
FM3164_SCL=0;
}
void write_realtime(uchar time_number)
{
uchar j;
time_start();
time_send(0xa2);
wait_ack();
time_send(add_start.add_byte[1]); /*read from the address*/
wait_ack();
for(j=0;j<time_number;j++)
{
time_send(eep_buf[j]);
wait_ack();
}
time_stop();
}
void read_realtime(uchar *old_time1) /*old_time give the head of real_time*/
{
uchar i;
time_start();
time_send(0xa2);
wait_ack();
time_send(2); /*read from the address*/
wait_ack();
time_start();
time_send(0xa3);
wait_ack();
for(i=2;i<9;i++)
{
eep_buf[i]=time_take();
if(i!=8)
{
FM3164_SDA=0;
_nop_();
_nop_();
_nop_();
FM3164_SCL=1;
_nop_();
_nop_();
_nop_();
FM3164_SCL=0;
}
}
FM3164_SDA=1;
_nop_();
_nop_();
_nop_();
FM3164_SCL=1;
_nop_();
_nop_();
_nop_();
FM3164_SCL=0;
time_stop();
*old_time1=eep_buf[8]; /*year*/
*(old_time1+1)=eep_buf[7]&0x1f; /*month*/
*(old_time1+2)=eep_buf[5]&0x3f; /*day*/
*(old_time1+3)=eep_buf[4]&0x3f; /*hour*/
*(old_time1+4)=eep_buf[3]&0x7f; /*minute*/
*(old_time1+5)=eep_buf[2]&0x7f; /*second*/
if(old_time[4]!=(eep_buf[3]&0x7f))
{
old_minute_pulse=minute_pulse;
minute_pulse=0;
minute_inc=1;
}
copy_ram_same(old_time1,old_time,6);
}
bit compare_arr(uchar *source,uchar *target,uchar number)
{
uchar i;
for(i=0;i<number;i++)
{
if(*(source+i)!=*(target+i))
return(0);
}
return(1);
}
//judge the card plug_in or not,card_find=0 means plug_in so set card_exist
void judge_card(void)
{
uchar i,temp;
if(have_int!=1)
old_card_type=s_card_type;
// read_in_high();
SEL_OTHERS=0;
SEL_IN_LOW=1;
SEL_IN_HIGH=0;
P0=0xff;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
in_buffer2=P0;
SEL_IN_HIGH=1;
SEL_OTHERS=1;
//verify card number
if((in_buffer2&0x80)==0)
{
SEL_OTHERS=1; //c 使卡在插入后上电
mirror_377=0x7f;
sel_hc377=mirror_377;
card_exist=1;
poll_card_exist=1;
delay_1ms();
temp=0;
add_start.add_word=0;
card_read(eep_buf,32);
for(i=1;i<32;i++)
temp^=eep_buf[i];
for(i=(eep_buf[0]%22+1);i<(eep_buf[0]%22)+9;i++)
temp^=eep_buf[i];
card_right=0;
poll_card_right=0;
if(temp==0)
//如果校验和为0代表本卡确系合法操作软件发出的
{
add_start.add_word=0;
card_read(eep_buf,1);
//合法的卡
card_right=1;
poll_card_right=1;
add_start.add_word=eep_buf[0]%22+9;
card_read(&tempb,1);
//判断插入卡的类型
card_type=0; //是 个人卡
//是管理卡
// if(tempb%2)
// card_type=1;
}
if(old_card_exist==0&&old_second_pulse==0) //显然是卡插入的动作
{
add_start.add_word=_DRIVER_CODE;
card_read(eep_buf,4);
if(compare_arr(eep_buf,now_driver,3)||((eep_buf[0]==0xff)&&(eep_buf[1]==0xff)&&(eep_buf[2]==0xff))) //已经是当前登录的卡号,无须处理
{ }
else //是新的驾驶员卡,先注销原来的驾驶员,再登录新驾驶员
{
//注销老的驾驶员
if(now_log_on==1)
log_off();
if(card_right==1)
log_on();
}
// }
card_in=1;
card_out=0;
old_card_exist=card_exist; //先认为卡是不正确的
add_start.add_word=_DRIVER_PERIOD;
card_read(temp_arr,3);
add_start.add_word=DRIVER1_VALID+24*now_driver_num;
fm_write(temp_arr,3);
}
}
else
{
SEL_OTHERS=1; //c 使卡在拔掉后断电
mirror_377=0xff;
sel_hc377=mirror_377;
SEL_OTHERS=0;
poll_card_exist=0; //卡不存在
card_exist=0;
if(old_card_exist)
{
card_out=1;
card_in=0; //卡拔除动作
poll_card_pass=1; //密码恢复为未通过
old_card_exist=card_exist;
}
}
}
//uchar make_send_sum1(uchar com_lenth)
// {
// uchar i,checksum;
// checksum=0;
// for(i=0;i<com_lenth;i++)
// checksum^=com1_send_buf[i];
// return(checksum);
// }
//////void set_timer(uchar time_lenth)
////// {
////// TH1=0x70;
////// TL1=0;
////// time20ms=time_lenth;
////// dingshi=0;
//////// TR1=1;
////// }
void send_tone(uchar tone_number) //发送命令到显示部分播放指定编号语音信息,还要判断语音开关是否打开
{
if(parameter.para_arr.mute_8_sw&tone_number)
{
//如果允许发出声音位打开就向显示部分发出发声命令
EEPCON=0; //要求使用外部IIC总线,需要延时等待显示部分放弃总线
delay_1ms();
add_start.add_word=S_MUTE_NOW;
show_read(&tempa,1);
tempa|=tone_number;
show_write(&tempa,1);
// tone_flash=1;
delay_2ms();
EEPCON=1;
}
}
//向显示部分发送需要显示的内容
//void send_show(uchar show_number)
// {
// show_number=1;
// }
void load_parameter(void) //载入设定参数
{
add_start.add_word=VCC+1;
// vcc.vcc_word=1000;
// fm_write(vcc.vcc_byte,2);
fm_read(vcc.vcc_byte,2);
add_start.add_word=CYCLE_PULSE;
// tempa=8; // _>
// fm_write(&tempa,2); // _>
fm_read(&tempa,1);
km_pulse.km_word=vcc.vcc_word*tempa;
add_start.add_word=VEHI_PARA;
fm_read(parameter.para_vehi,16);
//检查参数的内容是否有不合规范的数据,如果有需要校正
if(parameter.para_arr.rest_sec==0)
parameter.para_arr.rest_sec=20; //默认的休息时间为20分钟
if(parameter.para_arr.run_sec==0)
parameter.para_arr.run_sec=240; //默认的运行时间为45*4=180分钟
}
void save_realtime(uint time_address)
{
read_realtime(now_time);
add_start.add_word=time_address;
fm_write(now_time,6);
}
void write_flash_byte(uchar write_byte)
{
data union
{
uchar temp[2];
uint temp_arr;
}temp1;
mirror_377&=0xe0;
mirror_377+=flash_high_add;
SEL_OTHERS=1;
sel_hc377=mirror_377;
SEL_OTHERS=0;
temp1.temp[1]=flash_low_add;
temp1.temp[0]=flash_mid_add;
// set_extram;
XBYTE[temp1.temp_arr]=write_byte;
// clr_extram;
SEL_OTHERS=1;
}
uchar read_flash_byte(void)
{
uchar temp;
data union
{
uchar temp[2];
uint temp_arr;
}temp1;
mirror_377&=0xe0;
mirror_377+=flash_high_add;
SEL_OTHERS=1;
sel_hc377=mirror_377;
SEL_OTHERS=0;
temp1.temp[1]=flash_low_add;
temp1.temp[0]=flash_mid_add;
// set_extram;
temp=XBYTE[temp1.temp_arr];
// clr_extram;
SEL_OTHERS=1;
return(temp);
}
void delay_100us(void)
{
uchar i;
for(i=0;i<20;i++)
nop5();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -