📄 init.c
字号:
#include "paramac.h"
#include "24c01.h"
#include "save.h"
#include "show.h"
#include "debug.h"
// 初始化子程序:
void init(void){
unsigned char i,j;
unsigned char value,dont_die=0;
wait_5ms();
I_init(); //24c01 初始化
timer0_const.high=0xd9;
timer0_const.low=0x0c; //10 mS at 12 MHz
timer0_const.high1=0xf8;
timer0_const.low1=0x5a; //2 mS at 12 MHz
run_time.every_A_seconds=RUN_TIME_EVERY_A_SECONDS;
run_time.every_B_minutes=RUN_TIME_EVERY_B_MINUTES;
test.t_num_c=REFRESH_TIME;
test.t_num_max=TEST_TIME_OVER_TIME;
POWER_DOWN_PIN=1;
POWER_DOWN_PIN=1;
POWER_DOWN_PIN=1;
POWER_DOWN_PIN=1;
if(!KEY_PIN) save.erase_wait_time=200; //开机等待2秒钟
else save.erase_wait_time=0;
if((E_read(0,&i),i)!=SAVE_RIGHT_FLAG){ // ********* 无纪录数据: ********** //
BeepN(1,50); //无纪录数据响1声
for(i=2;i<=15;i++)
{
do //初始化2-15为16-29.这是绝对地址
{ E_write_no_wait(i,i+14);
wait_5ms();
if(++dont_die==0)goto l_bad_eeprom;
}while((E_read(i,&value),value)!=i+14);
do //初始化16-29为0.这是默认的数据
{ E_write_no_wait(i+14,0);
wait_5ms();
if(++dont_die==0)goto l_bad_eeprom;
}while((E_read(i+14,&value),value)!=0);
}
save.next_addr=SAVE_NEW_DATA; //30H
do //初始化1为30H.这是数据新地址
{ E_write_no_wait(1,save.next_addr);
wait_5ms();
if(++dont_die==0)goto l_bad_eeprom;
}while((E_read(1,&value),value)!=save.next_addr);
E_write_no_wait( (E_read(SAVE_FLAG_POINT,&i),i) ,SAVE_A); //存存储状态标志:0xaa
wait_5ms();
do //初始化0为AA.这是使用标志
{ E_write_no_wait(0,SAVE_RIGHT_FLAG);
wait_5ms();
if(++dont_die==0)goto l_bad_eeprom;
}while((E_read(0,&value),value)!=SAVE_RIGHT_FLAG);
}
else // ******** 有纪录数据: ********* //
{
j=0;
for(i=0;i<TIME_LEN;i++)
{
if( (E_read((E_read(i+SAVE_A_POINT,&value),value),&value),value)!=
(E_read((E_read(i+SAVE_B_POINT,&dont_die),dont_die),&dont_die),dont_die) )
{
j=1;
break;
}
} //判断两份数据是否相等
if(j==0) //两份相等,无错
{
for(i=0;i<TIME_LEN;i++) //无错读A或读B
{
E_read((E_read(i+SAVE_A_POINT,&value),value),&work.time[i]);
}
if((E_read((E_read(SAVE_FLAG_POINT,&value),value),
&dont_die),dont_die)!=SAVE_A)SaveFlag(SAVE_A); //保存标志
}
else //不等,有错:
{
E_read( (E_read(SAVE_FLAG_POINT,&value),value) , &dont_die);//有错读存储标志
if( dont_die==SAVE_A )
{
BeepN(2,10); //取A则想2声
for(i=0;i<TIME_LEN;i++) //标志是A,则A未存完,取B
{
E_read((E_read(i+SAVE_B_POINT,&value),value),&work.time[i]);
}
save.rq_save_timeA=0;
SaveA(); //取B后同步A
}
else //标志是B,则A已存完,取A
{ //若标志错,说明开始操作标志,
BeepN(3,10); //取B则想3声
for(i=0;i<TIME_LEN;i++) //那么A已经存完,故以为A正确,也取A
{
E_read((E_read(i+SAVE_A_POINT,&value),value),&work.time[i]);
}
save.rq_save_timeB=0;
SaveB(); //取A后同步B
if((E_read((E_read(SAVE_FLAG_POINT,&value),value),
&dont_die),dont_die)!=SAVE_A)SaveFlag(SAVE_A); //标志不对保存标志为A
}
}
save.rq_save_timeA=TIME_LEN;
save.rq_save_timeB=TIME_LEN;
E_read(SAVE_NEXT_POINT,&save.next_addr); //读新地址
E_read((E_read(SAVE_GEAR_POINT,&i),i),&work.gear_id); //读齿数
}
rom_vivid=TRUE;
goto good_rom;
l_bad_eeprom:
work.error=ERROR_ROM_DO_NOT_EXIST; //存储器不存在或坏的存储器
rom_vivid=FALSE;
good_rom:
work.gear_num=gear_id_list[work.gear_id];
show_gear_show();
black_left_zero_of_run_time();
save.rq_save_timeA=save.rq_save_timeB=TIME_LEN;
save.rq_save_timeB=TIME_LEN;
save.rq_save_timeA=TIME_LEN;
rq_save_time=FALSE; //清除数据存储指令
//============== T0 inittialize:
TMOD=0x11;
TR0=1;
ET0=1;
//============== T1 inittialize:
// TMOD=(TMOD&0x0f)|0x10;
TR1=1;
ET1=1;
//=============== ext0 inittialize
IT0=1; //edge trag.
EX0=1;
//
EA=1; //this line just enable the MCU's interrupt
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -