/*
* @function : 浮点数转字符串,显示动态浮点数
* @para : x,y 起始坐标 ,precison 显示精度,length 数字长度
* @brief : 可显示正负浮点数,字符串允许最大长度length 不需要考虑正负号和小数点
* @authour : Chen xiangyang
* @date : 2017/9/15
* @warning : 此函数包含sprintf,谨慎使用
* @version : 1.0 解决14.999,保留两位,显示14.100 14.000 ,保留两位显示14.0
*/
void LCD_float(u16 x,u16 y,float fnum,u8 precision,u8 length,u8 size)
{
u8 buff[16];u8 len;
#if 1
int integer,decimal;
integer=fnum; //整数部分
if(integer>=0)
{
length++; //小数点占一个字符
decimal=(int)(fnum*LCD_Pow(10,precision)+(float)0.5)-integer*LCD_Pow(10,precision); //小数部分,四舍五入
if(decimal>=LCD_Pow(10,precision))
{
integer++;
decimal=0;
} //进位到个位特别处理
}
else
{
length+=2; //负号和小数点各占一个字符
decimal=-(int)(fnum*LCD_Pow(10,precision)-(float)0.5)+integer*LCD_Pow(10,precision); //小数部分,四舍五入
if(decimal>=LCD_Pow(10,precision))
{
integer--;
decimal=0;
} //进位到个位特别处理
}
len=sprintf((char*)buff,"%d.%d",integer,decimal); //获得字符串长度
if(decimal==0&&precision>1)
{
while(precision-1>0)
{
precision--;
LCD_char(x+len*size/2,y,'0',size); //补零
len++;
}
} //个位为零时进行补零以满足精度
#else
////////////////此方式慎用,keil 地址8字节对齐,此显示方式可能会使程序卡死
// if(precision==1)
// len=sprintf((char*)buff,"%0.1f",fnum);
// else if(precision==2)
// len=sprintf((char*)buff,"%0.2f",fnum);
// else if(precision==3)
// len=sprintf((char*)buff,"%0.3f",fnum);
// else return; //最高显示三位小数
#endif
if(length-len>=0)
{
LCD_str(x,y,buff,size);
while(length-len>0)
{
LCD_char(x+len*size/2,y,' ',size); //清除多余位数
len++;
}
}
else
{
LCD_str(x,y,"Beyond",size); //超过允许最大显示字符串长度
}
} |