📄 c51.c
字号:
uchar GetSpecialAllocation(uchar index) //返回第index位上是1不是0;
{
uchar a;
IIC_READ_ONEBYTE(0,0x17,2);
if(index<9)
{
a=ICC_DATA; // uchar code SetBits[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
index=8-index;
a=SetBits[index]&a;
if(a==0) {return 0xa0; }
else {return 0xa1;}
}
else
{
a=ICC_DATA1; // uchar code SetBits[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
index=index-8;
index=8-index;
a=SetBits[index]&a;
if(a==0) {return 0xa0; }
else {return 0xa1;}
}
}
//得到一共有好多组特殊事故数据
uchar GetSpecialAll()
{
uchar a;
uchar c;
uchar b;
IIC_READ_ONEBYTE(0,0x17,2);
b=0;
for(a=0;a<8;a++)
{ c=SetBits[7-a]&ICC_DATA;
if(c!=0) {b++;}
}
for(a=0;a<8;a++)
{ c=SetBits[7-a]&ICC_DATA1;
if(c!=0) {b++;}
}
a=b;
return a;
}
*/
/*
//处理出正确的特殊事故分配序列:需要将当前的记录改为特殊事故处理,将可能要将另一组去掉一组特殊事故值,
void DowithSpecialAllocation()
{
uchar a,b,c,d;
uint abc;
b=GetSpecialAll(); //得到一共有好多组特殊事故
if(b<5) //直接将该处地置为特殊事故处理!
{
IIC_READ_ONEBYTE(0,0x16,1);b=ICC_DATA;
SetSpecialAllocation (b,0Xa1); //1.设置分配列表中的值
abc= SmallViBaseAddress+(b-1)*220; //2.设置存贮组中对应的标志位
abc+=3;
a=abc/256;b=abc%256 ;
ICC_DATA=0xa1; IIC_WRITE_ONEBYTE(a,b,1);
}
else
{//00000
//寻找离自己最远的一个序列号,将其置为非特殊疑点数据!!!
IIC_READ_ONEBYTE(0,0x16,1);b=ICC_DATA;
SetSpecialAllocation (b,0Xa1); //1.设置分配列表中的值
abc= SmallViBaseAddress+(b-1)*220; //2.设置存贮组中对应的标志位
abc+=3;
a=abc/256;b=abc%256 ;
ICC_DATA=0xa1; IIC_WRITE_ONEBYTE(a,b,1);
c=0;
if(PingJunZhuShu>10) //表明翻页: 如果当前序列为8,这时7--1查询,再从15--8;
{//2222
d=b;
for(b=d;b>=1;b--)
{
a= GetSpecialAllocation(b);
if(a==0xa1) { c++;}
if(c>=6)
{ SetSpecialAllocation (b,0Xa0); }//1.清除分配列表中的值
}
for(b=d+1;b<=15;b++)
{
a= GetSpecialAllocation(b);
if(a==0xa1) { c++;}
if(c>=6) { SetSpecialAllocation (b,0Xa0); } //1.设置分配列表中的值
}//for
} //2222
else //表明未翻页: 如果当前序列为8,这时8-->1查询
{//1111
for(;b>0;b--)
{
a= GetSpecialAllocation(b);
if(a==0xa1) { c++;}
if(c>=6) { SetSpecialAllocation (b,0Xa0); }
} // forB
} //1111
} //0000
IIC_READ_ONEBYTE(0,0x16,3);
c=0;b=0;
} //function
*/
void MoveToSpecial(uchar index)
{
uchar a,b,c;
uint abc_S,abc_T;
//1.源的存贮起始地址
abc_S= SmallViBaseAddress+index*220;
abc_T=abc_S+3;
a=abc_T/256;b=abc_T%256 ;
ICC_DATA=0xa0; IIC_WRITE_ONEBYTE(a,b,1);
for(c=0;c<220;c++,abc_S++)
{
a=abc_S/256;b=abc_S%256;
IIC_READ_ONEBYTE(a,b,1);
XBYTE[XDATAUSBBuffer+c]=ICC_DATA;
}
//2.特殊事故数据的序列号处理
//b=共有好多组事故数据,a=当前应该存贮的序列号
IIC_READ_ONEBYTE(0,0x19,2);b=ICC_DATA; a=ICC_DATA1;
if(b>=5)
{ ICC_DATA=5; ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x1a,1); }
else
{ICC_DATA=a+1; ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x1a,1); }
a++;
ICC_DATA=a; ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x19,1);
a--;
//3.目标的存贮起始地址
abc_T= SpecialViBaseAddress +a*220;
for(c=0;c<220;c++,abc_T++)
{
ICC_DATA=XBYTE[XDATAUSBBuffer+c];
a=abc_T/256;b=abc_T%256;
IIC_WRITE_ONEBYTE(a,b,1);
}
}
/*
IIC_READ_ONEBYTE(0,0x1a,1); otherA=ICC_DATA; //有好多组特殊事故的数据
addAll=220*otherA+SpecialViBaseAddress ; //最高地址
for(otherInt=SpecialViBaseAddress ;otherInt<addAll;otherInt++)
{
otherA=otherInt/256;otherB=otherInt%256;
IIC_READ_ONEBYTE(otherA,otherB,1); otherA=ICC_DATA; send_char(otherA);}
*/
void MoveAllSpecial() //移动所有的特殊事故数据
{
uchar a,AA1;
uchar c;
IIC_READ_ONEBYTE(0,0x17,1);AA1=ICC_DATA;
for(a=0;a<8;a++)
{ c=SetBits[7-a]&AA1;
if(c!=0) {MoveToSpecial(a); }
}
IIC_READ_ONEBYTE(0,0x18,1);AA1=ICC_DATA;
for(a=0;a<8;a++)
{ c=SetBits[7-a]&AA1;
if(c!=0) {MoveToSpecial(a+8);}
}
//清除所有的特殊事故记录
ICC_DATA=0;ICC_DATA1=0; ImportInfoEnable =0xaa;
IIC_WRITE_ONEBYTE(0,0x17,2);
}
//设置重要的信息:启始地址,存贮的总个数,写入的数据
void SetImportRunInfo5(uchar StartAdd,uchar WriteDate)
{
if((StartAdd==0x10)&&(WriteDate==0)) //表明是清除当前记录中所有的瞬时速度记录(一共有15条)
{
ICC_DATA =0; //瞬时速度存贮序列号
ICC_DATA1=0; //特殊事故分配序列 [1-->8]
ICC_DATA2=0; //特殊事故分配序列 [9-->15]
ICC_DATA3=0; //特殊事故存贮序列号
ICC_DATA4=0; //特殊事故总组数
ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x16,5);
}
ICC_DATA=0xaa; ICC_DATA1=0xbb;
ICC_DATA2=WriteDate; ICC_DATA3=WriteDate;
ICC_DATA4=WriteDate+WriteDate;
ImportInfoEnable =0xaa;IIC_WRITE_ONEBYTE(0,StartAdd,5);
}
//设置重要的信息:启始地址,存贮的总个数,写入的数据
void SetImportRunInfo7(uchar StartAdd,uint WriteDate)
{
ICC_DATA=0xaa; ICC_DATA1=0xbb;
ICC_DATA2=WriteDate/256; ICC_DATA3=ICC_DATA2;
ICC_DATA4=WriteDate%256; ICC_DATA5=ICC_DATA4;
ICC_DATA6=ICC_DATA2+ICC_DATA3+ICC_DATA4+ICC_DATA5;
ImportInfoEnable =0xaa;IIC_WRITE_ONEBYTE(0,StartAdd,7);
}
void ResetAllSet()
{
/*
//车辆信息:VIN号[17]--车牌号码[12]--车牌分类[1]
for(commName=0;commName<41;commName++)
{ICC_DATA =XBYTE[XDATAUSBBuffer +commName];ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(1,commName,1);}
//1-3:驾驶员代码; 4-12:共9个BYTE-->18位
for(commName=0;commName<21;commName++)
{ICC_DATA =XBYTE[XDATAUSBBuffer +commName+41]; ImportInfoEnable =0xaa;IIC_WRITE_ONEBYTE(0,0x80+commName,1);}
//设置记录仪的编号:
for(commName=0;commName<9;commName++)
{ICC_DATA =XBYTE[XDATAUSBBuffer +commName+62]; ImportInfoEnable =0xaa;IIC_WRITE_ONEBYTE(0,commName+0x76,1); }
*/
SetImportRunInfo5(0x60,60); StudentTime=60; //学时时长(1小时/学时)
SetImportRunInfo5(0x68,20); StudentBeep=20; //路练报警门限(15分钟)
SetImportRunInfo7(0x30,640); TZ_K=640; //特征系数
SetImportRunInfo5(0x4a,90); UserSetMaxViBeep=90; //起速报警门限
SetImportRunInfo5(0x3a,100); UserSetMaxViRecord=100; //超速记录门限
SetImportRunInfo5(0x20,180); UserSetMaxRunTime=180; //设置车辆超时驾驶时长 3小时
ICC_DATA =15;MaxSmallViDiff=15; //急刹车条件
ICC_DATA1 =30;LCDProtectTime=30; //屏抱时长
ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x5a,2);
//开关取反的状态
ICC_DATA =0xfa; switch_neg=0xfa; ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x59,1);
//重新设置安装的日期:
ICC_DATA=0xaa;ICC_DATA1=0xbb;ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x26,2);
ICC_DATA=year0;ICC_DATA1=month0;ICC_DATA1=day0;ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x28,3);
}
void CLSAllData()
{
SetImportRunInfo5(0x10,0); //瞬时速度的总组数
SetImportRunInfo7(0X40,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); //清除累计行驶里程
ICC_DATA=0; ICC_DATA1=0;IIC_WRITE_ONEBYTE(0x7f,0x00,2); //清除所有的设置清单记录
ICC_DATA=0; ICC_DATA1=0; IIC_WRITE_ONEBYTE(0,0x1e,2); //整点校时的时期记录进行清除
//重新写入新的标志
if (RunSegment==0xdd) {RunSegment++;}
else if (RunSegment==0xde) {RunSegment++;}
else if (RunSegment==0xdf) {RunSegment=0xdd;}
else {RunSegment=0xdd;}
ICC_DATA=RunSegment; ImportInfoEnable =0xaa; IIC_WRITE_ONEBYTE(0,0x5c,1);
CLSALLSetRecord(); //清除全部的设置时间记录
ResetAllSet(); //复位所有的设置
}
//读取重要的信息:启始地址,存贮的总个数
void ReadImportRunInfo(uchar StartADD,uchar All_N)
{
//uchar adjustAll;
//uint idata return_value=0;
//adjustAll= StartADD;
IIC_READ_ONEBYTE(0,StartADD,All_N);
if(All_N==5)
{
//IIC_READ_ONEBYTE(0,adjustAll,1); XBYTE[0x7f80]=ICC_DATA;
StartADD=ICC_DATA2+ICC_DATA3;
if(ICC_DATA!=0xaa) {ReturnIntValue =0;}
if(ICC_DATA1!=0xbb) {ReturnIntValue =0;}
if(ICC_DATA2!=ICC_DATA3 ) {ReturnIntValue =0;}
if(StartADD!=ICC_DATA4) {ReturnIntValue =0;}
ReturnIntValue = ICC_DATA2;
// return ICC_DATA2;
}
else if(All_N==7)
{
StartADD=ICC_DATA2+ICC_DATA3+ICC_DATA4+ICC_DATA5;
if(ICC_DATA!=0xaa) {ReturnIntValue =0;}
if(ICC_DATA1!=0xbb) {ReturnIntValue =0;}
if(ICC_DATA2!=ICC_DATA3 ) {ReturnIntValue =0;}
if(ICC_DATA4!=ICC_DATA5 ) {ReturnIntValue =0;}
if(StartADD!=ICC_DATA6) {ReturnIntValue =0;}
ReturnIntValue =ICC_DATA2*256+ICC_DATA5;
// return return_value;
}
}
void send_char(unsigned char my_char)
{
uchar a,b;
b=0;
for(a=0;a<8;a++)
{ if (SetBits[a]&my_char!=0x00) {b++;}}
if(b%2==0) {TB8=1;
}
else {TB8=0;}
SBUF=my_char; while(TI==0);TI=0;
ClsWDT();
}
void beep()
{
BEEP_CTL =0;
//OtherOutState(3,10);
delay(6000);
BEEP_CTL =1;
//OtherOutState(3,20);
//OtherOutState(3,10); delay(5000);//delay(40000); //delay(40000);
//OtherOutState(3,20); // delay(20000);//delay(40000);//delay(40000);
}
void sendReturnInfo(uchar mode,uchar ReturnCommand)
{
uchar a0;
//delay(20000);
if (mode==0xee) //
{}
else //发送正确
{
for(a0=0;a0<1;a0++)
{
TB8=0; send_char(0x55); mode=0x55;
TB8=1; send_char(0x7a); mode^=0x7a;
TB8=1;send_char(ReturnCommand); mode^=ReturnCommand;
TB8=0;send_char(0); mode^=0;
TB8=0;send_char(0); mode^=0;
TB8=0;send_char(0); mode^=0; //备用字
TB8=0;send_char(mode); //mode^=0xf0; //正确
}}
}
void StopState_TimeDisp() //在停止状态下显示时钟
{
uchar abc;
DispSegmentNumber(1,0xF0,0); DispSegmentNumber(2,0xF0,0);
if (BeiGuang==0) //未关闭背光!!
{
abc=hour0; DispSegmentNumber(3,abc/10,0); DispSegmentNumber(4,abc%10,0);
abc=minuts0; DispSegmentNumber(5,abc/10,0); DispSegmentNumber(6,abc%10,0);
abc=second0; DispSegmentNumber(7,abc/10,0); DispSegmentNumber(8,abc%10,0);
}
else
{
abc=hour0A; DispSegmentNumber(3,abc/10,0); DispSegmentNumber(4,abc%10,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -