⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib.c

📁 各种实用的子程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		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 + -