发一个浮点数转字符串的函数(用于给单片机1602显示)

2020-01-27 11:21发布

本帖最后由 huangxinji8 于 2012-10-10 23:48 编辑

自己写的,我也是刚学习程序,还是一个菜鸟,故把自己写的程序发出来,欢迎各位大侠指出哪里写的不好的

程序如下:

/**********************************************************
*函数名:  void float32_to_str(float Num, UINT8 n, UINT8 u8Char[])
*功能:    把一个单精度浮点数转化为字符串
*入口参数:float Num, UINT8 n, UINT8 u8Char[]
*返回参数:无
*说明:    Num:预转化的数据;u8Char[]:用于储存转化后的字符串
*               n: 精确到小数点多少位  
***********************************************************/
void float32_to_str(float Num, UINT8 n, UINT8 u8Char[])
{
        UINT8  u8_digit        = 0;                                                     //数据的位数
        UINT8  i                  = 0;
        UINT32 int32_temp  = 0;
        float  f32_temp        = 0.0;

        f32_temp = Num < 0 ? (-Num) : (Num);                         //取出NUM的绝对值存于f32_temp中                                                       
       
        for (i=0; i<n; i++)                                         //将要显示的内容化为整数
        {
                f32_temp *= 10.0;                                         //将浮点数扩大10的n次方倍
        }

        int32_temp = (UINT32)f32_temp;                                 //将扩大后的浮点数转成长整型存于int32_temp中

        printf_char(1, 10, int32_temp + '0');

        /*把浮点数从低位开始转化为字符串*/
        i = 0;
        u8_digit = 0;                               
        do{       
                if ((n != 0) && (i == n))                          //存入小数点
                {
                        u8Char = '.';       
                }
                else
                {
                        u8Char = '0' + int32_temp % 10;         //从最低位储存
                        int32_temp = int32_temp / 10;
                }

                u8_digit++;                                  //计算数据位数即字符串的长度       
                i++;                                                            
        }while (int32_temp != 0);
       
        /*对绝对值小于1的数进行补零*/
        if ((Num > -1.0) && (Num < 1.0))
        {
                for (i=0; i<(n-u8_digit); i++)
                {
                        u8Char[u8_digit + i] = '0';       
                }

                u8Char[u8_digit + i] = '.';                          //补零和小数点(0.)
                u8Char[u8_digit + i + 1] = '0';
               
                u8_digit += 2 + n - u8_digit;
        }

        /*加上符号位*/
        if(Num < 0)
        {
                u8Char[u8_digit] = '-';                                  //在字符串末尾加上负号标志
                u8_digit++;                                  //字符串长度加1
        }
       
        /*把u8Char中的字符串高低位对调*/
        for (i=0; i < (u8_digit / 2); i++)
        {
                UINT8 u8_temp;                                  //中介
                u8_temp = u8Char;
                u8Char = u8Char[u8_digit - i - 1];
                u8Char[u8_digit - i - 1] = u8_temp;        
        }
       
        u8Char[u8_digit] = '';                                    //字符串结尾补充一个''                       
}




*注:程序中的 UINT8    为 unsigned char 类型
              UINT32  为 unsigned long 类型
         
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
huangxinji8
1楼-- · 2020-01-28 17:08
as9901 发表于 2012-10-11 08:14
你的程序应该比那个小点

呵呵,谢谢
bennyhuang
2楼-- · 2020-01-28 20:10
 精彩回答 2  元偷偷看……
devcang
3楼-- · 2020-01-28 23:20
先取整数,小数就看有多少位,乘100、1000等转成整数,再显示
huangxinji8
4楼-- · 2020-01-29 01:03
devcang 发表于 2012-10-12 17:18 先取整数,小数就看有多少位,乘100、1000等转成整数,再显示

哇,这乃是一个困扰我的问题,非常感谢您的提醒,真是一语惊喜梦中人啊,这样就能精确到小数点后更多的数了
huangxinji8
5楼-- · 2020-01-29 04:40
bennyhuang 发表于 2012-10-12 09:06 假如输入的float整数部分已经超过了液晶显示长度怎么办? 我觉得倒不如控制它显示几个有效数字比较合适,能 ...

这些都是我没考虑到的,感谢您的提醒,我会改进的
ansion520
6楼-- · 2020-01-29 06:18
本帖最后由 ansion520 于 2013-8-2 20:13 编辑

printf_char 函数做啥用!???在Keil 下无法编译!?

一周热门 更多>