📄 lib.c
字号:
{
if (*ptr != 0x30)
return i;
ptr++;
}
return (i-1);
}
uint8 BCD_ASC16 (uint8 x, uint8 *ptr) //x为十六进制数,ptr为要存放的ascii码地址
{ //因为程序中不会出现3位数,故不翻译百位
* ptr++ = HEX_ASC8 ((x%0x100)/0x10); //十位
* ptr = HEX_ASC8 ((x%0x100)%0x10); //个位
}
uint8 HEX_ASC8 (uint8 x) //二进制转ASCII码
{
if (x<0x0a) return (x+0x30);
else return (x+0x37);
}
//十六进制转换为ASC码
uint8 HEX_ASC16 (uint8 x, uint8 *ptr) //x为十六进制数,ptr为要存放的ascii码地址
{ //因为程序中不会出现3位数,故不翻译百位
* ptr++ = HEX_ASC8 ((x%100)/10); //十位
* ptr = HEX_ASC8 ((x%100)%10); //个位
}
uint8 HEX16_ASC3 (uint8 x, uint8 *ptr) //x为十六进制数,ptr为要存放的ascii码地址
{ //翻译百位
* ptr++ = HEX_ASC8 (x/100); //百位
* ptr++ = HEX_ASC8 ((x%100)/10); //十位
* ptr = HEX_ASC8 ((x%100)%10); //个位
}
uint8 HEX_ASC32 (uint16 x, uint8 *ptr) //x为十六进制数,ptr为要存放的ascii码地址
{
* ptr++ = HEX_ASC8 (x/0x1000); //千位
* ptr++ = HEX_ASC8 ((x%0x1000)/0x100); //百位
* ptr++ = HEX_ASC8 (((x%0x1000)%0x100)/0x10); //十位
* ptr = HEX_ASC8 (((x%0x1000)%0x100)%0x10); //个位
}
uint8 BCD_ASC32 (uint16 x, uint8 *ptr) //x为十六进制数,ptr为要存放的ascii码地址
{
* ptr++ = HEX_ASC8 (x/1000); //千位
* ptr++ = HEX_ASC8 ((x%1000)/100); //百位
* ptr++ = HEX_ASC8 (((x%1000)%100)/10); //十位
* ptr = HEX_ASC8 (((x%1000)%100)%10); //十位
}
//--------------------------------------------------------------------------------------------------
//======================================================================
//CRC-16 表
const uint16 Lookup[256]={
0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,
0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,
0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,
0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,
0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,
0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,
0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,
0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,
0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,
0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,
0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,
0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,
0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,
0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,
0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,
0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,
0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,
0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,
0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,
0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,
0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,
0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,
0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,
0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,
0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,
0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,
0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,
0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,
0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,
0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,
0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,
0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040
};
const uint8 crc8_tab[]=
{
0x00,0x07,0x0e,0x09,0x1c,0x1b,0x12,0x15,0x38,0x3f,0x36,0x31,0x24,0x23,0x2a,0x2d,
0x70,0x77,0x7e,0x79,0x6c,0x6b,0x62,0x65,0x48,0x4f,0x46,0x41,0x54,0x53,0x5a,0x5d,
0xe0,0xe7,0xee,0xe9,0xfc,0xfb,0xf2,0xf5,0xd8,0xdf,0xd6,0xd1,0xc4,0xc3,0xca,0xcd,
0x90,0x97,0x9e,0x99,0x8c,0x8b,0x82,0x85,0xa8,0xaf,0xa6,0xa1,0xb4,0xb3,0xba,0xbd,
0xc7,0xc0,0xc9,0xce,0xdb,0xdc,0xd5,0xd2,0xff,0xf8,0xf1,0xf6,0xe3,0xe4,0xed,0xea,
0xb7,0xb0,0xb9,0xbe,0xab,0xac,0xa5,0xa2,0x8f,0x88,0x81,0x86,0x93,0x94,0x9d,0x9a,
0x27,0x20,0x29,0x2e,0x3b,0x3c,0x35,0x32,0x1f,0x18,0x11,0x16,0x03,0x04,0x0d,0x0a,
0x57,0x50,0x59,0x5e,0x4b,0x4c,0x45,0x42,0x6f,0x68,0x61,0x66,0x73,0x74,0x7d,0x7a,
0x89,0x8e,0x87,0x80,0x95,0x92,0x9b,0x9c,0xb1,0xb6,0xbf,0xb8,0xad,0xaa,0xa3,0xa4,
0xf9,0xfe,0xf7,0xf0,0xe5,0xe2,0xeb,0xec,0xc1,0xc6,0xcf,0xc8,0xdd,0xda,0xd3,0xd4,
0x69,0x6e,0x67,0x60,0x75,0x72,0x7b,0x7c,0x51,0x56,0x5f,0x58,0x4d,0x4a,0x43,0x44,
0x19,0x1e,0x17,0x10,0x05,0x02,0x0b,0x0c,0x21,0x26,0x2f,0x28,0x3d,0x3a,0x33,0x34,
0x4e,0x49,0x40,0x47,0x52,0x55,0x5c,0x5b,0x76,0x71,0x78,0x7f,0x6a,0x6d,0x64,0x63,
0x3e,0x39,0x30,0x37,0x22,0x25,0x2c,0x2b,0x06,0x01,0x08,0x0f,0x1a,0x1d,0x14,0x13,
0xae,0xa9,0xa0,0xa7,0xb2,0xb5,0xbc,0xbb,0x96,0x91,0x98,0x9f,0x8a,0x8d,0x84,0x83,
0xde,0xd9,0xd0,0xd7,0xc2,0xc5,0xcc,0xcb,0xe6,0xe1,0xe8,0xef,0xfa,0xfd,0xf4,0xf3
};
/*******************************************************
*函数原型:byte crc8(byte p,m);
*功能:crc8校验.注:要设地址指针,后期补上
********************************************************/
uint8 crc8(uint8 *pt,uint8 len)
{
uint8 i,CRC8,k;
CRC8=0;
for (i=0;i<len;i++)
{
k=CRC8^(*pt);
CRC8=crc8_tab[k];
pt++;
Intdog_clear(); // 清除内部看门狗
Extdog_clear(); // 清除外部看门狗
}
CRC8=~CRC8;
return (CRC8);
}
//======================================================================
//压缩BCD测试
bool IsBcd(uint8 b)
{
if(((b&0xf)<0x0a)&&((b&0xf0)<0xa0))return true;
return false;
}
//16位 BCD与16进制的转换函数
uint16 BcdHex(uint16 b)
{
uint16 h;
h=(b&0xf)+(b&0xf0)/0x10*10;
h+=(b&0xf00)/0x100*100+(b&0xf000)/0x1000*1000;
return h;
}
//8位 BCD与8进制的转换函数
uint8 Bcd_Hex(uint8 b)
{
uint8 h;
h=(b&0xf)+(b&0xf0)/0x10*10;
return h;
}
//8位 16进制与BCD的转换函数
uint8 Hex_Bcd(uint8 h)
{
uint8 b,t;
if(h>99)return 0x99;
t=h;
t%=100;
b=t/10*0x10+t%10;
return b;
}
uint16 HexBcd(uint16 h)
{
uint16 b,t;
if(h>9999)return 0x9999;
t=h;
b=t/1000*0x1000,t%=1000;
b+=t/100*0x100,t%=100;
b+=t/10*0x10+t%10;
return b;
}
uint32 HexBcd5(uint16 h)
{
uint32 b,t;
t=h;
b=t/10000*0x10000,t%=10000;
b+=t/1000*0x1000,t%=1000;
b+=t/100*0x100,t%=100;
b+=t/10*0x10+t%10;
return b;
}
//BCD小数与16进制小数的转换函数
uint16 FraHex(uint16 f)
{
return (uint16)(((uint32)BcdHex(f)*0x10000L+5000)/10000);
}
uint16 HexFra(uint16 h)
{
// return HexBcd((uint16)(((uint32)h*10000+0x08000L)/0x10000L));
return HexBcd((uint16)(((uint32)h*10000)/0x10000L));
}
//BCD定点数与16进制定点数的转换函数
uint32 FixHex(uint32 f)
{
uint16 t1,t2;
t1=(uint16)(f>>16),t2=(uint16)f;
return (((uint32)BcdHex(t1)<<16)+FraHex(t2));
}
uint32 HexFix(uint32 h)
{
uint16 t1,t2;
t1=(uint16)(h>>16),t2=(uint16)h;
return (((uint32)HexBcd(t1)<<16)+HexFra(t2));
}
//Crc-16 转换函数
void CrcCh(uint8 ch,uint16 *crc)
{
*crc=Lookup[((*crc)&0xff)^ch]^((*crc)>>8);
}
//Crc 码放在数据区末尾
bool CrcStr(uint8 *p)
{
uint16 crc,cnt;
cnt=(uint16)*p;
if(cnt==0)return FALSE;
*p+=2,p++;
for(crc=0;cnt>0;cnt--)crc=Lookup[(crc&0xff)^(*p++)]^(crc>>8);
*p++=(uint8)crc;
*p++=(uint8)(crc>>8);
return TRUE;
}
//Crc 校验函数
// lSize 不包括两个字节的校验码长度
bool CrcOk( uint8* pSrc, long lSize )
{
uint16 wTemp;
uint16 crc;
crc= CrcCalc( pSrc, lSize );
wTemp=pSrc[lSize];
wTemp+=((uint16)pSrc[lSize+1])*256;
return (wTemp == crc);
}
//Crc 码计算函数
//lSize 不包括两个字节的校验码长度
uint16 CrcCalc( uint8* pSrc, long lSize )
{
uint16 crc=0,j=0;
long i;
Intdog_clear();
Extdog_clear();
for( i=0; i<lSize ; i++ )
{
CrcCh(*pSrc++,&crc);
j++;
if(j>=5000)
{
j=0;
Intdog_clear(); // 清除内部看门狗
Extdog_clear(); // 清除外部看门狗
}
}
return crc;
}
//Crc 码生成函数
//lSize 不包括两个字节的校验码长度
//Crc 码放置在数据区末尾
void CrcMake( uint8* pSrc, long lSize )
{
uint16 crc;
crc= CrcCalc( pSrc, lSize );
pSrc[lSize]= (uint8)crc;
pSrc[lSize+1]= (uint8) ( crc>>8 );
}
//***********************************************************************************
uint16 CalSum16(uint8 *pBuff,uint8 uLen) //8位和校验
{
uint8 i;
uint16 wSum;
wSum=0;
for(i=0;i<uLen;i++)
wSum +=*pBuff++;
return wSum;
}
//固化定值
bool GH_Value(uint8 uSource,uint8 uSection)
{
uint8 *ptr,*pBuff,i,uLen,uSum,j,k;
FixValueBuff Run_FixVal_Buff;
FixStatus CurFixVal_Manage; //2002,11,10,sdg
if((Cur_FixVal_Buff.uSur==uSource)&&(Cur_FixVal_Buff.wStatus==SetSts))
{
Cur_FixVal_Buff.FixTimer=Rsys_clock; //写修改时间
Cur_FixVal_Buff.Set_Buff.wStatus=SetSts;
// Cur_FixVal_Buff.wStatus=SetSts;//Available;2002,11,10,sdg
// Cur_FixVal_Buff.uSur=uSource; //2002,11,10,sdg
Cur_FixVal_Buff.uSectionNo=uSection;
//计算校验和
ptr=(uint8 *)&Cur_FixVal_Buff;
ptr +=4;
uLen=sizeof(Cur_FixVal_Buff);
uLen -=4;
Cur_FixVal_Buff.wCrc=CalSum16(ptr,uLen); //8位和校验 按字节校验??
j=0;
while(j++<3)
{
Eep_Write_FixValue(&Cur_FixVal_Buff); //将定值写到EEPROM
for(k=0;k<255;k++);
Run_FixVal_Buff.uSectionNo=Cur_FixVal_Buff.uSectionNo;
Eep_Read_FixValue(&Run_FixVal_Buff); //将EEPROM定值读到Run_FixVal_Buff
//
//Run_FixVal_Buff.uSectionNo=Cur_FixVal_Buff.uSectionNo; //2002,11,10,sdg
if(memcmp(&Cur_FixVal_Buff,&Run_FixVal_Buff,sizeof(FixValueBuff))) // 比较EEPROM的内容和下发的定值是否一样
{
for(k=0;k<255;k++);
continue; //不等
}
else //等
break;
}
if(j==3)
{
Cur_FixVal_Buff.wStatus=ClearSts; //清暂存区状态
return false;
}
if(FixVal_Manage.uCurSection==Cur_FixVal_Buff.uSectionNo)
//if (Run_Mode.uMode==0x5a) //安全模式
{
RUN_SET=Run_FixVal_Buff.Set_Buff;
BAK_SET=RUN_SET;
SET_JS();
}
FixVal_Manage.uSectionS[Cur_FixVal_Buff.uSectionNo]=Available; //修改定值管理单元2002,11,10,sdg
FixVal_Manage.uVaildNum=Stat_uSectionS(); //统计有效定值区
j=0;
while(j++<3)
{
Eep_Write_FixValueMag(&FixVal_Manage); //将定值管理单元写入EEPROM
for(k=0;k<255;k++);
Eep_Read_FixValueMag(&CurFixVal_Manage);
if(memcmp(&CurFixVal_Manage,&FixVal_Manage,sizeof(FixStatus))) // 比较EEPROM的内容和下发的定值是否一样
{
for(k=0;k<255;k++);
continue; //不等
}
else //等
break;
}
if(j==3)
{
Cur_FixVal_Buff.wStatus=ClearSts; //清暂存区状态
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -