huangxinji8 发表于 2012-10-10 23:45:41

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

本帖最后由 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[])
{
        UINT8u8_digit      = 0;                                                   //数据的位数
        UINT8i                  = 0;
        UINT32 int32_temp= 0;
        floatf32_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 = '0';       
                }

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

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



*注:程序中的 UINT8    为 unsigned char 类型
            UINT32为 unsigned long 类型
         

bigallium 发表于 2012-10-10 23:51:49

我以前试图写,直到听说有个函数叫sprintf().....

huangxinji8 发表于 2012-10-10 23:57:15

bigallium 发表于 2012-10-10 23:51 static/image/common/back.gif
我以前试图写,直到听说有个函数叫sprintf().....

{:3_57:} 哦,这么神奇,在kiel里可以用吗?

bigallium 发表于 2012-10-11 00:00:20

huangxinji8 发表于 2012-10-10 23:57 static/image/common/back.gif
哦,这么神奇,在kiel里可以用吗?

标准C库函数..#include "stdio.h"即可

编辑:少了个"."

3050311118 发表于 2012-10-11 00:00:53

huangxinji8 发表于 2012-10-10 23:57
哦,这么神奇,在kiel里可以用吗?

可以用                  

huangxinji8 发表于 2012-10-11 00:11:18

3050311118 发表于 2012-10-11 00:00 static/image/common/back.gif
可以用

{:sweat:} 那我不白花这么多时间写了

as9901 发表于 2012-10-11 08:14:37

你的程序应该比那个小点{:smile:}

huangxinji8 发表于 2012-10-12 08:23:02

as9901 发表于 2012-10-11 08:14 static/image/common/back.gif
你的程序应该比那个小点

呵呵,谢谢

bennyhuang 发表于 2012-10-12 09:06:17

假如输入的float整数部分已经超过了液晶显示长度怎么办?

我觉得倒不如控制它显示几个有效数字比较合适,能完整显示的话就直接显示,不能显示完的话就用科学记数法显示。
例如12345600000000000000.0,明显1602一行不能完整显示,那就显示成1.23456 E19.
假如是123456.0,那就直接显示成123456.
嘛,float类型的话也就只有7位有效数字。。。

另外还有一个问题,对于1.234567,假如你要显示5位小数,那你的输出是1.23456,但是正确来说应该是1.23457
这个需要考虑四舍五入。

devcang 发表于 2012-10-12 17:18:19

先取整数,小数就看有多少位,乘100、1000等转成整数,再显示

huangxinji8 发表于 2012-10-13 02:05:15

devcang 发表于 2012-10-12 17:18 先取整数,小数就看有多少位,乘100、1000等转成整数,再显示

哇,这乃是一个困扰我的问题,非常感谢您的提醒,真是一语惊喜梦中人啊,这样就能精确到小数点后更多的数了

huangxinji8 发表于 2012-10-13 02:06:46

bennyhuang 发表于 2012-10-12 09:06 假如输入的float整数部分已经超过了液晶显示长度怎么办? 我觉得倒不如控制它显示几个有效数字比较合适,能 ...

这些都是我没考虑到的,感谢您的提醒,我会改进的

ansion520 发表于 2013-8-2 20:09:18

本帖最后由 ansion520 于 2013-8-2 20:13 编辑

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

huangxinji8 发表于 2013-9-3 21:47:16

ansion520 发表于 2013-8-2 20:09 static/image/common/back.gif
printf_char 函数做啥用!???在Keil 下无法编译!?

这句调试的时候弄上去的,忘记删掉了,直接删掉得了,建议用sprintf函数
页: [1]
查看完整版本: 发一个浮点数转字符串的函数(用于给单片机1602显示)