📄 convations.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 + -