/*************************************************************************
功能: 把float 型的data 轉換到字符串str_ptr 裏, 小數保留d 位
d=0, 去尾
例如: data=12.3456 , 小數位數d=3 -> "12.345"
*************************************************************************/
#define STR_END '\0'
unsigned char *Trans_Data_To_Disp( unsigned char *str_ptr, float data, unsigned char d )
{
unsigned int integral_part=0; // 整數部分
float decimal_part=0; // 小數部分
unsigned int temp;
unsigned char i,n;
//整數部分
integral_part = (unsigned int )(data);
temp=integral_part;
n=0;
do
{
n++;
temp=(unsigned int)(temp/10); //得到整數部分位數n
}while(temp!=0);
temp=integral_part;
for( i=0; (i<n)&&(i<20); i++)
{
*(str_ptr + n-1-i)=(unsigned char)(temp%10) +'0';
//從低位(str_ptr + n-1)開始,獲取相應位
temp=(unsigned int)(temp/10);
}
//說明:因爲LCD每行最多隻有20個字符,所以有20個字符的限制,實際上float達不到這個精度
if( (d==0) || (i==20) )
{
*(str_ptr + i) = STR_END; //此時 i = n 或20
str_len=n;//取字符串長度
return str_ptr;
}
else
{
*(str_ptr + i) = '.'; //此時 i = n ,且n < 20
}
//小數部分
decimal_part = data - integral_part;
for(i=n+1; (i<d+n+1)&&(i<20); i++)
{
decimal_part = decimal_part * 10;
*(str_ptr + i) = (unsigned char)(decimal_part) +'0';
//從高位(str_ptr + n+1)開始,獲取相應位
decimal_part = decimal_part - (unsigned char)(decimal_part);
}
*(str_ptr + i) = STR_END; //此時 i = d+n+1 或20
str_len=n+1+d; //取字符串長度
return str_ptr;
}