打印

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

[复制链接]
408|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaloulin|  楼主 | 2018-7-15 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
*  @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);            //超过允许最大显示字符串长度
        }
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

448

帖子

0

粉丝