📄 c51.c
字号:
//-----------------------------------------------------------------------------
//----如果当前时间与上次停车时间相同的话,说明后面的数据要覆盖前面的数据-------
//-----------------------------------------------------------------------------
if(otherB==0) {SaveRunDevViIndex--;Now_BlankAdd--;}
//3. 比如上一次停车时候时12:10分,当前时间为12:15分,这时,就要将10--15分内的分钟速度全部写为0
for(otherA=1;otherA<otherB;otherA++) //此段为车停止的时间
{
//A1.存贮此时的平均速度
addH= Now_BlankAdd/256; addL= Now_BlankAdd%256;
ICC_DATA=0; IIC_WRITE_ONEBYTE(addH,addL,1);
//A2.存入空白地址及平均速度个数
Now_BlankAdd++;
SaveRunDevViIndex++; //当前一共有好多个平均速度
}
//A3.写入空白地址
SetImportRunInfo7(0x40,Now_BlankAdd);
//A5.读取当前段是不是在停车前已经疲劳驾驶了1
otherInt=Now_StartAdd+10; addH= otherInt/256; addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,2);
if((ICC_DATA==0X0f)&&(ICC_DATA1==0X0F))
{ TooLongBeepTime=0;
IsRunTooLong=1; isTooLongBeep=1;
Disp_SegMentLcd(23,0x08); }
//A6.存入当前的组数的起始地址(变化的)
otherInt=Now_BlankAdd+1; addH= otherInt/256; addL= otherInt%256;
ICC_DATA=Now_StartAdd/256;ICC_DATA1=Now_StartAdd%256;
IIC_WRITE_ONEBYTE(addH,addL,2);
//A7.存入当前的时间,作为本次驾驶的结束时间,驾驶员的卡号,在第二次开始时,以决定是不是需要分配新的空间
otherInt=Now_BlankAdd+3; addH= otherInt/256; addL= otherInt%256;
ICC_DATA =year0; ICC_DATA1 =month0; ICC_DATA2 =day0;
ICC_DATA3 =hour0; ICC_DATA4 =minuts0; ICC_DATA5 =second0;
IIC_WRITE_ONEBYTE(addH,addL,6); //存贮时间
//A8.存入卡号(由于卡号没有变,所以不需要再存入一次了!)
//otherInt=Now_BlankAdd+9; addH= otherInt/256; addL= otherInt%256;
// ICC_DATA =KaHao0; ICC_DATA1 =KaHao1; ICC_DATA2 =KaHao2;
// ICC_DATA3 =KaHao3; IIC_WRITE_ONEBYTE(addH,addL,4); //存贮卡号
//A9.存平均速度的个数
otherInt=Now_BlankAdd+13; //当前结尾的偏移+13处
addH=otherInt/256; addL=otherInt%256;
ICC_DATA =SaveRunDevViIndex/256; ICC_DATA1=SaveRunDevViIndex%256;;
IIC_WRITE_ONEBYTE(addH,addL,2);
goto InitFinish;}
}
}
InitNewRoom:
XBYTE[0X7F45]=XRAM1; XBYTE[0X7F46]=XRAM2; XBYTE[0X7F47]=XRAM3;//时分秒
//------------------------------------------------------------------
//---新的记录开始了,读出新的空白地址在那--在Now_StartAdd地址处-----
//------------------------------------------------------------------
if( Now_BlankAdd>0x171) //至少有一段
{
//由这个now_blankADD查找到超始地址,如果不为0x150,也不用处理
otherInt=Now_BlankAdd+1;
addH=otherInt/256;addL=otherInt%256;
IIC_READ_ONEBYTE(addH,addL,2);
//b.读取上一组的起始地址
Now_StartAdd=ICC_DATA*256+ICC_DATA1;
if(Now_StartAdd>0x150)
{SeekMeBeforeDriverInfo();}
}
ReadBlankAddress();
if(Now_BlankAdd>0x150) {Now_StartAdd=Now_BlankAdd+15;} //将当前的空白地址作为新一组的启动地址
else {Now_StartAdd=0x150;}
Now_BlankAdd= Now_StartAdd+36; //确定当前的空白地址为: 启动地址+36
//A.写入标志位
IIC_SAVEADD=Now_StartAdd;
addH=Now_StartAdd/256; addL=Now_StartAdd%256;
ICC_DATA =0xee; ICC_DATA1 =RunSegment;
IIC_WRITE_ONEBYTE(addH,addL,2);
//B.存入当前的时间,作为本次驾驶的起始时间
IIC_SAVEADD=Now_StartAdd+2; //0x152
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
ICC_DATA =Xother1; ICC_DATA1 =Xother2; ICC_DATA2 =Xother3;
ICC_DATA3 =XRAM1; ICC_DATA4 =XRAM2 ; ICC_DATA5 =XRAM3 ;
IIC_WRITE_ONEBYTE(addH,addL,6);
//C1.累计行驶里程存贮器内清零
BeforeCount0=0;
IIC_SAVEADD=Now_StartAdd+8; //0X158
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
ICC_DATA =0; ICC_DATA1 =0; IIC_WRITE_ONEBYTE(addH,addL,2);
IIC_SAVEADD=Now_StartAdd+0x20; //0X170
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
ICC_DATA =0; ICC_DATA1 =0; IIC_WRITE_ONEBYTE(addH,addL,2);
//C2.超时及超速记录标记清除
IIC_SAVEADD=Now_StartAdd+10; //0X158
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
if(isTooLongBeep==1)
{ICC_DATA=0xf0; ICC_DATA1=0xf0; ICC_DATA2=0; ICC_DATA3=0;}
else
{ICC_DATA=0; ICC_DATA1=0; ICC_DATA2=0; ICC_DATA3=0;}
IIC_WRITE_ONEBYTE(addH,addL,4);
//E.存卡号到该组地址分配区
IIC_SAVEADD=Now_StartAdd+14; //0X15A
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
ICC_DATA =KaHao0; ICC_DATA1 =KaHao1; ICC_DATA2 =KaHao2;
ICC_DATA3 =KaHao3; IIC_WRITE_ONEBYTE(addH,addL,4); //存贮卡号
//存入驾驶证号
otherInt=Now_StartAdd+18; //0x162
IIC_SAVEADD=otherInt+9;
otherA=0;
//DEBUG
//send_char(0xfe);send_char(11);
for(;otherInt<IIC_SAVEADD;otherInt++,otherA++)
{
addH=otherInt/256; addL=otherInt%256;
ICC_DATA= XBYTE[JaShiNoAddress+otherA];
IIC_WRITE_ONEBYTE(addH,addL,1) ;
addH= ICC_DATA;
//DEBUG
// send_char( addH);
}
otherInt=Now_StartAdd+28; //0x16C
addH=otherInt/256; addL=otherInt%256;
ICC_DATA=XBYTE[0X7F45];
ICC_DATA1=XBYTE[0X7F46];
ICC_DATA2=XBYTE[0X7F47];
IIC_WRITE_ONEBYTE(addH,addL,3);
//对剩下的空间进行清除
otherInt=Now_StartAdd+31; //0x162
IIC_SAVEADD= Now_StartAdd +36;
for(;otherInt<IIC_SAVEADD;otherInt++)
{
addH=otherInt/256; addL=otherInt%256;
ICC_DATA= 0; IIC_WRITE_ONEBYTE(addH,addL,1) ;
}
//F.平均速度存贮的个数清除
SaveRunDevViIndex =0;
//IIC_SAVEADD=Now_StartAdd+0x20; //0X170
//Now_BlankAdd=IIC_SAVEADD+4; //平均速度存贮的第一个地址
//addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
//ICC_DATA =0xfb; ICC_DATA1 =0xfb; ICC_DATA2 =0; ICC_DATA3=0; IIC_WRITE_ONEBYTE(addH,addL,4);
//G.存入平均速度的个数为SaveRunDevViIndex:个是在当前结尾的偏移+13处
otherInt=Now_BlankAdd+13; //当前结尾的偏移+13处
addH=otherInt/256; addL=otherInt%256;
ICC_DATA =0; ICC_DATA1=0 ;
IIC_WRITE_ONEBYTE(addH,addL,2);
//H.存入当前的组数的起始地址(变化的)
otherInt=Now_BlankAdd+1;
addH= otherInt/256;
addL= otherInt%256;
ICC_DATA=Now_StartAdd/256;ICC_DATA1=Now_StartAdd%256;
IIC_WRITE_ONEBYTE(addH,addL,2);
//I.存入当前的时间,作为本次驾驶的结束时间,驾驶员的卡号,在第二次开始时,以决定是不是需要分配新的空间
otherInt=Now_BlankAdd+3;
addH= otherInt/256;
addL= otherInt%256;
ICC_DATA =year0; ICC_DATA1 =month0; ICC_DATA2 =day0;
ICC_DATA3 =XRAM1 ; ICC_DATA4 =XRAM2 ; ICC_DATA5 =XRAM3 ;
IIC_WRITE_ONEBYTE(addH,addL,6); //存贮时间
//h.存入卡号
otherInt=Now_BlankAdd+9;
addH= otherInt/256;
addL= otherInt%256;
ICC_DATA =KaHao0; ICC_DATA1 =KaHao1; ICC_DATA2 =KaHao2;
ICC_DATA3 =KaHao3; IIC_WRITE_ONEBYTE(addH,addL,4); //存贮卡号
//J.开始记录新的起始时间-->超时判断
XRAM1= XBYTE[0X7F45]; XRAM2= XBYTE[0X7F46]; XRAM3= XBYTE[0X7F47];//时分秒
IIC_SAVEADD=XRAM1*60+XRAM2 ; //车开始驾驶的时候 ,用来进行超时判断的
startRunTime= IIC_SAVEADD; //将当前的时间作为开车的时间
start_second=XRAM3;
//DEBUG
//send_char(0xfe);send_char(22); send_char( KaHao0); send_char( KaHao1); send_char( KaHao2);send_char( KaHao3);
//J.存入当前的地址作为空白地址(固定地址处)
SetImportRunInfo7(0x40,Now_BlankAdd);
InitFinish:
//------------------------------------------------------------
//-------------K.对总的瞬时速度的数的处理,分配空间--------------
//------------------------------------------------------------
IIC_READ_ONEBYTE(0,0x10,5);
if(ICC_DATA!=0xaa) {PingJunZhuShu=0;goto GetA;}
if(ICC_DATA1!=0xbb) {PingJunZhuShu=0;goto GetA;}
if(ICC_DATA2!=ICC_DATA3) {PingJunZhuShu=0;goto GetA;}
PingJunZhuShu =ICC_DATA2;
GetA:
if( PingJunZhuShu >=10)
{PingJunZhuShu=10;}
//如果当前一共有10组数据的话,就一直将该值设定为10组,只能等于10
else if(PingJunZhuShu<10)
{ PingJunZhuShu++;}
ICC_DATA=0xaa; ICC_DATA1=0xbb;
ICC_DATA2=PingJunZhuShu; ICC_DATA3=PingJunZhuShu;
ICC_DATA4=PingJunZhuShu+PingJunZhuShu;
ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x10,5);
//D.200个瞬时速度移位操作的个数清除
SaveStopCarViIndex=0;
IIC_READ_ONEBYTE(0,0x16,1); addH=ICC_DATA; //读取当前共有好多组瞬时速度了(0--10),以确定存贮的偏移地址
addH++; if(addH>10){addH=1;}
/* while(1)
{
addH++; if(addH>15){addH=1;}
addL=GetSpecialAllocation(addH); //如果该处不是疑点数据,将存贮空间指定在此!!
if(addL==0) {break;}
}*/
ICC_DATA=addH;ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x16,1);
addH--;
IIC_SAVEADD=addH*220;
IIC_SAVEADD+=SaveStopCarViIndex;
SmallViIndexAddress=SmallViBaseAddress+ IIC_SAVEADD; //确定最终的存贮位置:
IIC_SAVEADD= SmallViIndexAddress;
//L.存卡号到瞬时速度移位存贮处
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
ICC_DATA =KaHao0; ICC_DATA1 =KaHao1; ICC_DATA2 =KaHao2;
ICC_DATA3 =0xA0;ICC_DATA4 =0; IIC_WRITE_ONEBYTE(addH,addL,5); //存贮卡号--个数清除为0
ICC_DATA=0xf0; //存贮翻页标记 :F0(no) --FA(yes)
IIC_SAVEADD=SmallViIndexAddress+11;
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_WRITE_ONEBYTE(addH,addL,1);
}
//--------------------------------------------------------------
}
else { //表明车处于停止状态 Stopwxf,并持续5个脉冲以上才为停止状态!
StopWait++;
addL= StopWait;
if ((IsRunState==1)&&(addL>2)) //表明车是从开的状态到停止状态,而不是处于还没有开的状态
{
DoWithStopSegment:
IsRunState=0; Count25For5s=0; BeforeCount0=0;
beep();
if (SoftStop==1) //表明是00点钟的切换
{ XRAM1 =23; XRAM2 =59; XRAM3 =59; } //停止驾驶的时间
else
{ XRAM1 =hour0; XRAM2 =minuts0; XRAM3 =second0;} //停止驾驶的时间
//-----------------------------------------------------------------------------------------
//------------------------------写入总的累计的里程数的小数部分-----------------------------
//-----------------------------------------------------------------------------------------
addH=Count_H; addL=Count_L;
otherInt=addH*256+addL; //开始计数的值
IIC_SAVEADD= TH0*256+TL0; //当前计数器值
if( IIC_SAVEADD> otherInt)
{ IIC_SAVEADD= IIC_SAVEADD-otherInt; }
else
{ IIC_SAVEADD=0;} //异常情况
SmallViIndexAddress =IIC_SAVEADD; //临时借用一下
//读取旧的累计里程小数部分
IIC_READ_ONEBYTE(0,0x71,2);
otherInt=ICC_DATA*256+ ICC_DATA1; //旧的累计里程小数部分
NowIC_StartAddress = otherInt+ IIC_SAVEADD; //总的累计里程 =旧的小数部分+当前定时器内的 部分!
otherInt=TZ_K*8; //640*8=5120;
if( NowIC_StartAddress > otherInt)
{
IIC_SAVEADD= NowIC_StartAddress-otherInt;
//---------------------------------
//---对总的累计行驶里程进行加1----
//---------------------------------
IIC_READ_ONEBYTE(0,0x73,2); otherA=ICC_DATA;otherB=ICC_DATA1;
otherInt=otherA*256+otherB; otherInt++;
ICC_DATA=otherInt/256;ICC_DATA1=otherInt%256;
ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x73,2);
}
else
{IIC_SAVEADD= NowIC_StartAddress; }
ICC_DATA= IIC_SAVEADD/256; ICC_DATA1= IIC_SAVEADD%256;
ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x71,2);
//-------------------------------------------------------------------------------------------
//------------------------------写入此段的累计的里程数的小数部分-----------------------------
//-------------------------------------------------------------------------------------------
TH0=Count_H; TL0=Count_L;
//读取的累计里程小数部分
otherInt=Now_StartAdd+0x20; //0X170
addH=otherInt/256; addL=otherInt%256;
IIC_READ_ONEBYTE(addH,addL,2);
otherInt=ICC_DATA*256+ ICC_DATA1; //旧的累计里程小数部分
NowIC_StartAddress = otherInt+SmallViIndexAddress; //总的累计里程 =旧的小数部分+当前定时器内的 部分!
otherInt=TZ_K*8; //640*8=5120;
if( NowIC_StartAddress > otherInt)
{
//--------------------------------------------
//---对当前存贮组段的累计行驶里程进行加1------
//--------------------------------------------
IIC_SAVEADD=Now_StartAdd+8; //空白地址加上8
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
//a.读取旧的行速里程
IIC_READ_ONEBYTE(addH,addL,2);otherA=ICC_DATA;otherB=ICC_DATA1;
//b.旧的里程数加1,再写回去: //比例应进行更改
otherInt=otherA*256+otherB;
otherInt++;
otherA=otherInt/256;otherB=otherInt%256;
ICC_DATA=otherA;ICC_DATA1=otherB;IIC_WRITE_ONEBYTE(addH,addL,2);
otherInt=TZ_K*8; //640*8=5120;
IIC_SAVEADD= NowIC_StartAddress-otherInt; }
else
{IIC_SAVEADD= NowIC_StartAddress; }
//写入小数部分!
otherInt=Now_StartAdd+0x20;
addH=otherInt/256; addL=otherInt%256;
ICC_DATA=IIC_SAVEADD/256;ICC_DATA1=IIC_SAVEADD%256;
IIC_WRITE_ONEBYTE(addH,addL,2);
//-------------------------------------------------------------------------------------------
//-------------------------写入这一分钟的平均车速(最后一个)----------------------------------
//-------------------------------------------------------------------------------------------
if(BigIndex==0) { BigAddVi=OldVi*10;BigIndex=1;}
if (SoftStop==1) //表明是00点钟的切换
{ BigAddVi=OldVi*10;BigIndex=1;}
otherInt= (BigAddVi/BigIndex);
//A1.存贮此时的平均速度
addH= Now_BlankAdd/256;
addL= Now_BlankAdd%256;
ICC_DATA=otherInt/10;
IIC_WRITE_ONEBYTE(addH,addL,1);
//A2.存入空白地址及平均速度个数
Now_BlankAdd++;
SaveRunDevViIndex++;
//A3.写入空白地址
SetImportRunInfo7(0x40,Now_BlankAdd);
//A4.存入当前的组数的起始地址(变化的)
otherInt=Now_BlankAdd+1; addH= otherInt/256; addL= otherInt%256;
ICC_DATA=Now_StartAdd/256;ICC_DATA1=Now_StartAdd%256;
IIC_WRITE_ONEBYTE(addH,addL,2);
//A5.存入当前的时间,作为本次驾驶的结束时间,驾驶员的卡号,在第二次开始时,以决定是不是需要分配新的空间
otherInt=Now_BlankAdd+3; addH= otherInt/256; addL= otherInt%256;
ICC_DATA =Xother1; ICC_DATA1 =Xother2; ICC_DATA2 =Xother3;
ICC_DATA3 =XRAM1; ICC_DATA4 =XRAM2; ICC_DATA5 =XRAM3;
IIC_WRITE_ONEBYTE(addH,addL,6); //存贮时间
//A6.存入卡号;
otherInt=Now_BlankAdd+9; addH= otherInt/256; addL= otherInt%256;
ICC_DATA =KaHao0; ICC_DATA1 =KaHao1; ICC_DATA2 =KaHao2;
ICC_DATA3 =KaHao3; IIC_WRITE_ONEBYTE(addH,addL,4); //存贮
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -