📄 c51.c
字号:
abc=minuts0A; DispSegmentNumber(5,abc/10,0); DispSegmentNumber(6,abc%10,0);
abc=second0A; DispSegmentNumber(7,abc/10,0); DispSegmentNumber(8,abc%10,0);
}
Disp_SegMentLcd(27,0x0F);
Disp_SegMentLcd(26,1);
if( isNullICCar==1){Disp_SegMentLcd(26,0x09);}
Disp_SegMentLcd(24,0x00);
}
void RunState_TimeDisp()//在运行状态下的时钟显示
{
uchar abc;
abc=hour0; DispSegmentNumber(5,abc/10,0); DispSegmentNumber(6,abc%10,0);
abc=minuts0; DispSegmentNumber(7,abc/10,0);DispSegmentNumber(8,abc%10,0);
//--day0 Nowday
}
void DispICNo(uchar mode);
void BeforeRunStateDis() //进行运行状态的预显示
{
CLSSegMentLcd();
if(IsRunState==1) {
if(isHaveCar==1) {Disp_SegMentLcd(25,0x08); } //IC卡,代码无 [0c --08 ]
}
else
{
if(isHaveCar==0) {DispICNo(0);}
else {DispICNo(1);}
}
//速度:***公里/时
Disp_SegMentLcd(24,0x0d);
//时间 H:M
Disp_SegMentLcd(27,0x0d);
DispSegmentNumber(1,0,0); DispSegmentNumber(2,0,0); DispSegmentNumber(3,0,0);
DispSegmentNumber(5,0,0); DispSegmentNumber(6,0,0);
DispSegmentNumber(7,0,0); DispSegmentNumber(8,0,0);
RunState_TimeDisp();
SeekMenu1Mode=0;
}
/*
void DispRoundTime()
{
uchar addH,addL;
//----------------------------------------------------------
//-------------时间显示-------------------------------------
//----------------------------------------------------------
IsChangeNextDay=0;
if(IsRunState==0) //车辆处于停止状态 时钟显示 **:**:**
{//000
//LCDProtectTime=20;
StopState_TimeDisp();
ES=1;
addH=second0; addL=Nowsecond ;
if(BeiGuang==0)
{//111
if((LCDProtectTime!=0)&&(addH!=addL))
{//222
LCDProtectAdd++;
addH=LCDProtectTime;
if((LCDProtectAdd>addH)) //到达了屏抱的时间
{ LCD_Control=0;BeiGuang=1; } //关闭背光
}//222
}//111
}//000
else// if(addH==1) //车辆处于行驶状态: 时钟显示 **:**
{ RunState_TimeDisp(); BeiGuang=0; LCD_Control=1;LCDProtectAdd=0;
addH=second0; addL=Nowsecond ; ES=0;
if(addH==addL) { Disp_SegMentLcd(27,0x0d);}
else { Disp_SegMentLcd(27,0x0c);}
addH=day0; addL=Nowday ;
if(addH=!addL) { addL= day0; Nowday =addL;
// goto InitNewRoom;
IsChangeNextDay=1;
} //日期切换了,如果车辆处于行驶状态,这时就要重新分配空间
// if(isChangeIC==1) { goto InitNewRoom;} //车在行驶状态下,表示换了驾驶员代码
}
addL= second0; Nowsecond =addL; //秒
addL= day0; Nowday =addL; //日期
}
*/
//在需要进行新的地址分配空间时调用,结果运行后将年月日时分秒--->[0X7F45] 开始的地址处!
//查询我上一段开车的时间,如果上一段的停车时间同现在的时间差小于20分钟,
//则将上一段的"疲劳开始存贮区"写入到当前段的疲劳驾驶区,再清除疲劳驾驶区的标记!
void SeekMeBeforeDriverInfo()
{
uchar addH,addL;
uint otherInt;
//车开时候的当前时间!
NowIC_StartAddress= XRAM1*36;
NowIC_StartAddress= NowIC_StartAddress*10;
NowIC_StartAddress= NowIC_StartAddress*10;
otherInt=XRAM2*60+XRAM3;
NowIC_StartAddress+= otherInt;
StartSeek:
//if(Now_StartAdd==0x150){goto ExitMe;}
if(Now_BlankAdd<0x150) {goto ExitMe;}
//a.读取上一段的停车时间
otherInt=Now_BlankAdd+5; //直接得到
addH= otherInt/256;addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,4); //日-->时分秒
if(ICC_DATA!=day0) //如果这段时间同当前时间不在同一天就直接退了!
{
goto ExitMe;
}
else //是同一天,如果同当前时间大于20分钟的话,也要直接退出!
{
NowIC_BlankAddress = ICC_DATA1*36;
NowIC_BlankAddress = NowIC_BlankAddress *10;
NowIC_BlankAddress = NowIC_BlankAddress *10;
otherInt=ICC_DATA2*60+ICC_DATA3;
NowIC_BlankAddress+= otherInt;
otherInt=SleepTime*60;
NowIC_BlankAddress+=otherInt; //加上20分钟
if( NowIC_StartAddress>NowIC_BlankAddress ) //是超过了20分钟的!退出
{goto ExitMe; }
}
//b.读取卡号-->如果当前组的卡号同当前组的卡号不同,就要找下一组
otherInt=Now_StartAdd+14; //直接得到
addH= otherInt/256;addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,3); //日-->时分秒
//如果是同一个驾驶员的话,就要在此处得到疲劳驾驶区的记录!
if((ICC_DATA== KaHao0)&&(ICC_DATA1== KaHao1)&&(ICC_DATA2== KaHao2))
{
otherInt=Now_StartAdd+28; //直接得到
addH= otherInt/256;addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,3); //日-->时分秒
XBYTE[0X7F45]=ICC_DATA; XBYTE[0X7F46]=ICC_DATA1; XBYTE[0X7F47]=ICC_DATA2;
//清除此段的超时记录标记
otherInt=Now_StartAdd+10; //直接得到
addH= otherInt/256;addL= otherInt%256;
IIC_READ_ONEBYTE(addH,addL,2);
if((ICC_DATA==0X0F)&&(ICC_DATA==0X0F)){
TooLongBeepTime=0;
isTooLongBeep=1;}
ICC_DATA=0; ICC_DATA1=0;
IIC_WRITE_ONEBYTE(addH,addL,2); //日-->时分秒
goto ExitMe;
}
if(Now_StartAdd<=0x150) {goto ExitMe;}
Now_BlankAdd=Now_StartAdd;
otherInt=Now_StartAdd-14;
addH=otherInt/256;addL=otherInt%256; IIC_READ_ONEBYTE(addH,addL,15);
//b.读取上一组的起始地址
Now_StartAdd=ICC_DATA*256+ICC_DATA1;
//c.读取上一组的空白地址
Now_BlankAdd=Now_BlankAdd-15;
goto StartSeek;
ExitMe:
// NowIC_BlankAddress = XBYTE[0X7F45]*3600+XBYTE[0X7F46]*60+XBYTE[0X7F47];
//XRAM1= XBYTE[0X7F45];
//XRAM2= XBYTE[0X7F46];
//XRAM3= XBYTE[0X7F47];//时分秒
addH=0;
}
void DispNowTimeVi()//显示出当前的时间及速度
{
uchar NowVi;
uchar otherA,otherB;
uchar addH,addL;
uint IIC_SAVEADD,otherInt,SmallViIndexAddress;
//unsigned long LONGADDRESS;
float onlyfloat;
//DispRoundTime(); //display----time
//----------------------------------------------------------
//-------------时间显示-------------------------------------
//----------------------------------------------------------
if(IsRunState==0) //车辆处于停止状态 时钟显示 **:**:**
{//000
//LCDProtectTime=20;
StopState_TimeDisp();
ES=1;
addH=second0; addL=Nowsecond ;
if(BeiGuang==0)
{//111
if((LCDProtectTime!=0)&&(addH!=addL))
{//222
LCDProtectAdd++;
addH=LCDProtectTime;
if((LCDProtectAdd>addH)) //到达了屏抱的时间
{ LCD_Control=0;BeiGuang=1; } //关闭背光
}//222
}//111
}//000
else //车辆处于行驶状态: 时钟显示 "252 12:12"
{ RunState_TimeDisp(); BeiGuang=0; LCD_Control=1;LCDProtectAdd=0;
addH=second0; addL=Nowsecond ; ES=0;
if(addH==addL) { Disp_SegMentLcd(27,0x0d);}
else { Nowsecond =second0; Disp_SegMentLcd(27,0x0c);}//秒
if(day0!=Nowday) {
//--------------------------------------------------------------------------------
//------------------------------本段停车------------------------------------------
//--------------------------------------------------------------------------------
SoftStop=1;
goto DoWithStopSegment;
} //日期切换了,如果车辆处于行驶状态,这时就要重新分配空间
}
//----------------------------------------------------------
//----------------------------------------------------------
otherInt=(uint)(SAVE_TH0*256+SAVE_TL0); //结束时候的计数器值
IIC_SAVEADD= (uint)(SAVEBe_TH0*256+SAVEBe_TL0); //开始时的计数器值
ThisCountGD=0;
if(otherInt<IIC_SAVEADD) //0x0001-0xfff0=>[0xffff+0x0001-0xfff0]
{ onlyfloat=TZ_K*8;
onlyfloat= onlyfloat+otherInt;
ThisCountGD=onlyfloat-IIC_SAVEADD ;}// 得到这次处理过程中,又来了好多个光电脉冲
else if(otherInt>IIC_SAVEADD)
{ThisCountGD=otherInt-IIC_SAVEADD;} // 得到这次处理过程中,又来了好多个光电脉冲
//if(ThisCountGD<10) {HowTimes=12;}
//if (ThisCountGD>30) {HowTimes=6;}
HowTimes=6;
//-----------------------------------------------------------------------------------------
//-------1.下面是对车是否处于驾驶状态的判断,如果脉冲每次大于2并持续5S以上即为行驶状态-----
//-----------------------------------------------------------------------------------------
if(ThisCountGD>0)
{Count25For5s++; BeforeCount0+=ThisCountGD;
if((Count25For5s>2)&&( IsRunState==0))//表明车已启动 该处代码只执行一次 startwxf
{
MoveAllSpecial(); //移动所有的特殊事故的数据
CaoShu_Add =0; CaoShu_AddTimes =0; //超速其间的累计速度值及累计次数
StopWait =0;
Nowday =day0; //记录下开车的日期
TooViBeepTimes =0; TooLongBeepTime=0;
// Smallindex=0; SmallAddVi=0; //更新显示的时间次数及累计总和
BigAddVi=0;BigIndex=0; //一分钟的平均速度所累计次数及累计速度值总和
beep();
//在1分钟一共出现了多少个瞬时值;
//出现多少个瞬时值更新一次显示
//得到当前的分钟数
IsSpecialSmallVi=0; OldSmallVi=250; //是否是特殊疑点事故数据
Nowminuts=minuts0; OldGDCount =250; //上一次的光电脉冲计数
isViTooBig=0; IsRunTooLong=0; isTooLongBeep=0; isRecordLongStartTime=0;
XRAM1 =hour0; XRAM2 =minuts0; XRAM3 =second0; //存贮当前的时间
Xother1=year0; Xother2=month0; Xother3=day0; //存贮当前的日期
IsRunState=1; //处于驾驶状态了
BeforeRunStateDis();
NullCartBeepTime=0;
if (WhichIC!=10) //表明没有插入卡,要提示出报警
{
if( SoftStop==0)
{NullCarDriverBeep=1;}
}
else
{NullCarDriverBeep=0;}
SoftStop=0;
//--------------------------------------------------------------------
//-----------得到当前的空白地址指针,及起始地址-----------------------
//--------------------------------------------------------------------
ReadBlankAddress();
if(Now_BlankAdd>0x6a00) {Now_BlankAdd=0x150;}
if(Now_BlankAdd<=0x150) //当前没有行驶数据
{
//总的累计时间及累计行驶里程
ICC_DATA=0; ICC_DATA1=0; ICC_DATA2=0;
ImportInfoEnable =0xaa;IIC_WRITE_ONEBYTE(0,0x70,3); //清除总的累计行驶时间
ImportInfoEnable =0xaa;IIC_WRITE_ONEBYTE(0,0x73,3); //清除总的累计行驶里程
Now_BlankAdd=0x150;
goto InitNewRoom;}
//-----------------------------------------------------------------------
//------如果已经有上一次的数据的话,就要进行判断看是不是换的驾驶员-------
//-----------------------------------------------------------------------
if(Now_BlankAdd!=0x150)
{
IIC_SAVEADD=Now_BlankAdd+9;//读取卡号
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_READ_ONEBYTE(addH,addL,4);
if((ICC_DATA==KaHao0)&&(ICC_DATA1==KaHao1)&&(ICC_DATA2==KaHao2)) //表明是同一驾驶员
{
//读上一次的停车的时间,如果距现在的时间超过20分钟则为新的一组数据,
//如果小于20分钟,下面的超时判断时间的处理上继续住上加
//如果大于20分钟,下面的超时判断时间的处理上累计清除为零
IIC_SAVEADD=Now_BlankAdd+5;
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_READ_ONEBYTE(addH,addL,3); //日---->时--分
addH= ICC_DATA; addL=day0;
if(addH!=addL) { goto InitNewRoom;}
IIC_SAVEADD=ICC_DATA1*60+ICC_DATA2; //Before(时*60+分)
startRunTime=IIC_SAVEADD;
IIC_SAVEADD=hour0*60+minuts0; //Now =(时*60+分)
if(IIC_SAVEADD<startRunTime) //异常处理 : 第二天了如旧的为(23:35)-(01:32)----->(24*60+0)-(23*60+35)+(1*60+32)=117
{
goto InitNewRoom;}
else
{IIC_SAVEADD=IIC_SAVEADD-startRunTime;}
// if(addH=!addL) {IIC_SAVEADD=40;} //不是同一天的话,下面的运行就要直接分配空间!
if(IIC_SAVEADD<SleepTime)
{
otherB= IIC_SAVEADD; //临时保存,在没有到达步骤3时不可用该变量
//1.读取平均速度的个数
IIC_SAVEADD=Now_BlankAdd+13;
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_READ_ONEBYTE(addH,addL,2);
SaveRunDevViIndex =ICC_DATA*256+ICC_DATA1;
//2a.得到上一次存贮数据的基地址
IIC_SAVEADD=Now_BlankAdd+1;
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_READ_ONEBYTE(addH,addL,2);
Now_StartAdd=ICC_DATA*256+ICC_DATA1;
//Now_BlankAdd=Now_StartAdd+0x24+SaveRunDevViIndex; //150H--->174H(当前速度应该存入的值)
//2b.重新读取该行驶段的起始行驶时间:
/*
IIC_SAVEADD= Now_StartAdd+5;
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_READ_ONEBYTE(addH,addL,3);
addH=ICC_DATA; addL=ICC_DATA1;
start_second=ICC_DATA2; //开始的秒
startRunTime=addH*60+addL; //开始行驶的时间(时*60+分)*/
IIC_SAVEADD= Now_StartAdd+28;
addH=IIC_SAVEADD/256; addL=IIC_SAVEADD%256;
IIC_READ_ONEBYTE(addH,addL,3);
addH=ICC_DATA; addL=ICC_DATA1;
start_second=ICC_DATA2; //开始的秒
startRunTime=addH*60+addL; //开始行驶的时间(时*60+分)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -