分享一下自己写的LCD显示浮点数函数,效果还不错

2019-07-20 11:58发布

/*
*  @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);            //超过允许最大显示字符串长度
        }
}

上图



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。