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

📄 convations.c

📁 用与信息化的主机程序
💻 C
字号:
/*****************************************************************************************************
//						广东省科学院自动化研制中心重点实验室电子组
//									
//文件名:			convations.c								
//版本	:			V1.0
//作者  :
//日期  :			2006-3-15 
//
//其他  :
//www.autocenter.gd.cn
//																		gdpiao@autocenter.gd.cn
********************************************************************************************************/


#define _IN_CONVATION_
#include "config.h"
#include "math.h"

/*******************************************************************
		HEX_TO_BCD		把一个字节转换成单字节BCD


*******************************************************************/
uint8 HEX_TO_BCD (uint8 dat)
{
	uint8 temp1,temp2;
	temp1=dat/10;
	temp2=dat%10;
	
	return (temp1*16+temp2);

	}

/*******************************************************************
		BCD_TO_HEX		把单字节BCD转换成一个字节二进制


*******************************************************************/
uint8 BCD_TO_HEX (uint8 dat)
{
	uint8 temp1;
	temp1=(dat>>4)*10;
	temp1=temp1+(dat&0x0f);
	
	return temp1;

	}
/*******************************************************************
		HEX_TO_DBCD		把一个字节转换成双字节BCD


*******************************************************************/	
uint16 HEX_TO_DBCD(uint8 data)
{
	uint8 temp;
	uint16 ret_temp;
	temp=data &0x0f;
	ret_temp=temp+'0';
	
	temp=(data & 0xf0)>>4;
	temp+='0';
	ret_temp|=(temp<<8);
	
	return ret_temp;
	}
/*******************************************************************
		HEX_TO_DBCD		把一个字节转换成双字节BCD


*******************************************************************/	
uint16 HEX_TO_DEC(uint8 data)
{
	uint8 temp;
	uint16 ret_temp;
	temp=data &0x0f;
	if(temp>9)
		
		ret_temp=temp+'A'-10;
		
	else 
	
		ret_temp=temp+'0';
		
		
	temp=(data & 0xf0)>>4;
	
	if(temp>9)
		temp=temp+'A'-10;
	else 
		temp=temp+'0';
		
	ret_temp|=(temp<<8);
	
	return ret_temp;
	}
/*******************************************************************
		把一个BCD格式的日期字符串转换成可以显示的数据


*******************************************************************/	
uint8 DATE_TO_STR(uint8 *src,uint8 *dst)
{
	
	uint8 buffer[24];
	uint8 i;
	uint8 fixcode;
	uint16 temp;
	
	#ifdef REDUCE_A0
	fixcode = 0;
	#else
	fixcode = 0xa0;
	#endif
	
	for(i=0;i<5;i++)
	{
	temp=HEX_TO_DBCD((*(src+i)));
	buffer[0+i*2]=temp>>8;
	buffer[1+i*2]=temp;
	}
	
	DBC_TO_CBC(buffer,24);
	
	
	*(dst+0)=	01+fixcode;		//【
	*(dst+1)=	30+fixcode;
	/**(dst+2)=	buffer[0];
	*(dst+3)=	buffer[1];
	*(dst+4)=	buffer[2];
	*(dst+5)=	buffer[3];
	
	*(dst+6)=	36;		//年
	*(dst+7)=	74;
	*/
	*(dst+2)=	buffer[4];
	*(dst+3)=	buffer[5];
	*(dst+4)=	buffer[6];
	*(dst+5)=	buffer[7];	
		
	*(dst+6)=	52+fixcode;		//月
	*(dst+7)=	34+fixcode;
	
	*(dst+8)=	buffer[8];
	*(dst+9)=	buffer[9];
	*(dst+10)=	buffer[10];
	*(dst+11)=	buffer[11];
	*(dst+12)=	40+fixcode;		//日
	*(dst+13)=	53+fixcode;
	
	
	*(dst+14)=	buffer[12];//时
	*(dst+15)=	buffer[13];
	*(dst+16)=	buffer[14];
	*(dst+17)=	buffer[15];
	*(dst+18)=	01+fixcode;	// ':'		
	*(dst+19)=	35+fixcode;
	*(dst+20)=	buffer[16];//分
	*(dst+21)=	buffer[17];//分
	*(dst+22)=	buffer[18];//分
	*(dst+23)=	buffer[19];
	
	*(dst+24)=	01+fixcode;		//】
	*(dst+25)=	31+fixcode;
	
	*(dst+26)=	'\0';
	return 1;
	}

/*******************************************************************
		void HEX_TO_STRING(uint32 in_data,uint8 *p)		
		把一个字节转换成双字节BCD


*******************************************************************/	
void HEX_TO_STRING(uint32 in_data,uint8 *p)
{
		uint8 i;
		uint32 temp=in_data;
		for(i=0;i<10;i++)
			{
				p[9-i]=temp%10+0x30;
				//UART0_SendByte(a);
				temp/=10;				
				}
				p[10]='\0';
	//	for(i=0;i<10;i++)UART0_SendByte(p[i]);
		
	}
//**********半角到全角转换	*+A,0--0x30---0x0316
/*****************************************************************************************************
//函数名:			int8 	DBC_TO_CBC(uint8 *src)								
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint16 	DBC_TO_CBC(uint8 *src,uint16 maxLen)
{
	uint8 *dst;	
	uint16 length,i,j,counter;
	dst=malloc(Content_MAX_LEN);
	length=strlen((char *)src);//获取源串的长度

	counter=0;////需要转换的字符总数
	for(i=0,j=0;i<length;i++,j++)
		{
			if(src[i]>0x20 && src[i]<0x80)
					{
						#ifdef REDUCE_A0
						dst[j]=3;
						j++;
						dst[j]=src[i]-0x20;
						#else
						dst[j]=0xa3;
						j++;
						dst[j]=src[i]-0x20+0xa0;						
						#endif
						counter++;
						}else if(src[i]<0x21 && src[i]>0x1f)//2006-4-26 16:01
										{
											#ifdef REDUCE_A0
											dst[j]=1;
											j++;
											dst[j]=1;
											#else
											dst[j]=0xa1;
											j++;
											dst[j]=0xa1;											
											#endif
											
											counter++;
											}	else if(src[i]==0x02 | src[i]==0x03 | src[i]==0x04)
												{
													memcpy((dst+j),(src+i),4);
													i+=3;
													j+=3;													
													}else
												
														dst[j]=src[i];///end of if
				}	///end of for
	//转换后再从新串copy到源串 
	dst[j+1]='\0';
	length +=  counter;
	if(length >maxLen-1)
		length = maxLen-1;
	memcpy(src,dst,length);//拷贝到源串
	src[length]='\0';
	free(dst);
		
			return length;
		
	
	}	

/*******************************************************************
		uint16 Code_Filtor(uint8 *src,uint16 len)
	去除大于0xa0的数据,匹配终端的字库
//
//
*******************************************************************/
uint16 Code_Filtor(uint8 *src,uint16 len)
{
	
	
	uint16 i;
	for(i=0;i<len;i++)
		{
		
		if(*(src+i)>0xa0)
			{
			#ifdef REDUCE_A0
			*(src+i)=*(src+i)-0xa0;
			#endif
			}
		}	
		*(src+i) = '\0';
	return i;
	}

/*******************************************************************
		void PUT_int(uint16 ch)		发送一个字节到pc显示


*******************************************************************/		
	
void PUT_int(uint16 ch)
{
	uint8 temp;
	uint8 i;
	uint8 a[6];
	temp=ch;
		for(i=0;i<5;i++)
			{
			temp=temp%10;
			//UART0_SendByte(temp+0x30);
			a[6-i]=temp+0x30;
			temp=temp/10;
			}
		a[5]='\0';
UART0_ISendBuf(a);
}	
	


/*************************************************************************************************
//			L_TO_A
//LONG 到 ASIIC 码的转换
//
**************************************************************************************************/	
uint8 *L_TO_A(uint32 data,uint8 *buf)
{
	uint32 dat;
	uint8 temp;
	int8 i;
	uint8 base;
	//返回 8个ascii 码
	dat=data;
	for(i=0;i<8;i++)
		{
			temp=(uint8 )(dat & 0x0f);
			dat>>=4;
			if(temp>9)
				{
					base='A'-10;
					}else 
					{
						base = '0';
					}
			*(buf+7-i)=temp+base;
			
			}
	*(buf+8)='\0';
	return buf;
	}

/*************************************************************************************************
//			A_TO_L
// ASIIC码 到 LONG  的转换
//
**************************************************************************************************/	
uint32 A_TO_L(uint8 *buf)
{
	uint32 dat;
	uint8 temp;
	int8 i;
	uint8 base;
	//返回 8个ascii 码
	dat=0;
	for(i=0;i<8;i++)
		{	
			dat<<=4;
			temp=buf[i];
			if(temp>'F')
				{
					base = 'a' -10;
					}		
					else if(temp>'9')
						{
							base='A'-10;
							}
							else 
							{
								base = '0';
							}
			dat|=((temp-base) & 0x0f);		
			
			}
	
	return dat;
	}
/*************************************************************************************************
//			F_TO_A
//Float 到 ASIIC 码的转换
//
**************************************************************************************************/	

uint8 *F_TO_A(fp64 time,uint8 *buf)
{

	uint8 i;
	uint32 temp;
	fp64 temp_time;	
	temp_time=time;

		
	temp=(uint32)temp_time;
	temp_time-=temp;
	
	for(i=0;i<8;i++)
		{
		*(buf+7-i)=temp%10+'0';
		temp=temp/10;
		}
	///get Int part
	*(buf+8)='.';
	buf+=9;		
	for(i=0;i<8;i++)
	{
	temp_time*=10;
	temp=temp_time;
	*(buf++)=temp%10 +'0';
	//temp=temp/10;
	}
	*(buf++)='\0';
	
	
	return buf;
	}


/************************************************************************************************************
//						异或和校验
//
//
*************************************************************************************************************/
uint8 XOR_checksum(uint8 *s_addr,uint16 len)
{
     uint8 checksum;
     uint16  i;
     checksum=0;
     for(i=0;i<len;i++)
         checksum = checksum ^ *(s_addr+i);
     return(checksum);
}

/*****************************************************************************************************
//函数名:		void getHostAddress(uint8 *dst)									
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/

void getHostAddress(uint8 *dst)
{

	I2C_ReadNByte(AT24C02,ONE_BYTE_SUBA,HOST_ID_ADDR,dst,5);
	delay_ms(100);
	if(*(dst+5)==0xff)
		{
			I2C_WriteNByte(AT24C02,ONE_BYTE_SUBA,HOST_ID_ADDR,(uint8 *)defaultAddr,5);
			}
	
	delay_ms(200);
	}
/*****************************************************************************************************
//函数名:
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
void setHostAddress(uint8 *src)
{
	memcpy(HostAddress,src,5);
	I2C_WriteNByte(AT24C02,ONE_BYTE_SUBA,HOST_ID_ADDR,src,5);
	delay_ms(400);
	}
	
	
/*****************************************************************************************************
//函数名:uint8	TimeToString(DATE *date,uint8 *dst)
//描述  :把一个时间的结构体转换成一个字符串
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint8	TimeToString(DATE *date,uint8 *dst)
{
	uint8 len;
	len = strlen((char *)dst);
	
	dst[0] =	date->sec;
	dst[1] =	date->min;
	dst[2] =	date->hour;
	dst[3] =	date->leap;
	dst[4] =	date->day;
	dst[5] =	date->month;
	dst[6] =	(date->year)>>8;
	dst[7] =	date->year;
	 
	return len;
	}
/*************************************************************************************************
//函数名:		uint16 getCtlCode(uint8 *src,uint16 maxlen)
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint16 getCtlCode(uint8 *src,uint16 maxlen)
{
	uint8 *dst;
	uint8 code[8];
	uint16 i;
	uint16 j;	
	uint32 dat;
	
	dst = malloc(maxlen);
	for(i=0,j=0;i<maxlen;i++,j++)
	{
	if(*(src+i)=='~' && *(src+i+1)=='`')
		{
			memcpy(code,(src+i+2),8);
			dat=A_TO_L(code);
			*(dst+j)		=	(dat>>24)&0xff;
			*(dst+j+1)	=	(dat>>16)&0xff;
			*(dst+j+2)	=	(dat>>8)&0xff;
			*(dst+j+3)	=	dat&0xff;
			i+=9;
			j+=3;		
		}else
			{
				*(dst+j) = *(src+i);				
				}
	}
	
	memcpy(src,dst,j);
	free(dst);
	
return j;
}

/*****************************************************************************************************
//函数名:uint8 setBRate(uint8 ch,uint32 baudrate)											
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint8 setBaudRate(uint8 ch,uint32 baudrate)
{

	
	if(ch==0)
	{
		
		UART0_Init(baudrate);		
		}else
			{
				
				Init_485(baudrate);
				}
	return 1;
	}
/*****************************************************************************************************
//函数名:											
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint8 InitCom(void)
{
	uint8 buf[10];
	uint32 baudrate;
	
	memset(buf,0,10);	
	I2C_ReadNByte(AT24C02,ONE_BYTE_SUBA,BAUDRATE_ADDR,buf,8);
	baudrate = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
	if((baudrate%1200)==0)		
		{
			setBaudRate(COM0,baudrate);
			}else
				{
				setBaudRate(COM0,38400);
					}
	baudrate = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7];
	
	if((baudrate%1200)==0)
		{
			setBaudRate(COM1,baudrate);
		}else
			{
				setBaudRate(COM1,9600);
				}
		return 0;
	}
/*****************************************************************************************************
//函数名:											
//描述  :
//参数  :
//返回  :
//其他  :
********************************************************************************************************/
uint8 configBaudRate(uint8 *strbr)
{	
	return	(I2C_WriteNByte(AT24C02,ONE_BYTE_SUBA,BAUDRATE_ADDR,strbr,8) );
	
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -