OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17825|回复: 34

LCD屏显示小数的程序与心得

[复制链接]

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
发表于 2018-9-3 22:26:03 | 显示全部楼层 |阅读模式
最近调程序用到了LCD屏,起初在论坛里找到了坛友分享的显示小数的程序,自己挪过去发现不好用,就在坛友的程序的基础上做了一些小的修改,能满足需求了,但是近几天发现该玩的程序有个BUG,比如说传入显示数据为7.200000,屏幕上显示却变成了7.199999,刚开始怀疑是程序的事,就自己想了一个逐位分离小数部分的函数,后来发现还是时有时坏到最后才发现是自己的形参和局部变量的数据类型不对。现在附上以上提到的两个程序1.这是我根据坛友的帖子改的(在此感谢这位坛友提供的思路,在论坛上搜索“显示小数”第一个就是坛友的帖子)
//小数显示函数
//Int:整数位数  Float:小数位数
void LCD_ShowFloat(u16 x,u16 y,u8 size,float num,u8 Int,u8 Float)
{
        int i,a=1,n,t;        
        n=num;
        printf("n: %d\r\n",n);
        printf("num %lf\r\n",num);
        for(i=0;i<Float;i++)
        {
                a*=10;
                t=(num-n)*a;
                LCD_ShowxNum(x+8+Int*8,y,t,Float,size,0);
        }
        LCD_ShowxNum(x,y,n,Int,size,0);
        LCD_ShowString(x+Int*8,y,200,16,size,".");

}



2.自己想的分离各位的方法(如有雷同,不胜荣幸)
//小数显示函数
//Int:整数位数  Float:小数位数
void LCD_ShowFloat(u16 x,u16 y,u8 size,double num,u8 Int,u8 Float)   //注意传入参数为double
{
        int i,n=0;
        int mid=0;
    double b=0,t=0;
        n=num;   //取出整数位
        mid=(num-n)*10;  //分离出第一位小数
        t=(num-n)*10;   //将小数部分传递给中间变量
        printf("测试 t %lf\r\n",t);  //测试用
        printf("mid %d\r\n",mid);
        LCD_ShowxNum(x+16,y,mid,Float,size,1);  //显示第一位小数
        for(i=1;i<Float;i++)  //显示i+1位小数
        {
                b=t-mid;   //求出当前小数之间的差值
                mid=b*10;  //扩大十倍取整,分离出第i+1位小数
                t=b*10;    //扩大十倍,准备下一次分离
                printf("mid %d\r\n",mid);  //测试用
                LCD_ShowxNum(x+16+i*8,y,mid,Float,size,1);  //显示i+1位小数
        }
        LCD_ShowxNum(x,y,n,Int,size,0);
        LCD_ShowString(x+Int*8,y,200,16,size,".");

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6551
金钱
6551
注册时间
2015-8-25
在线时间
1024 小时
发表于 2018-9-5 09:10:52 | 显示全部楼层
char str[25];
sprintf(str,"%f",float_num);
LCD_ShowString(x,y,25*8,16,size,str);
这样子不是更好用?
你的程序不能显示负小数吧?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 3 反对 0

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-8-31
在线时间
6 小时
发表于 2018-9-5 09:49:05 | 显示全部楼层
我也有一个类似的,保留三位小数

void LCD_PrintFloat(unsigned char x,unsigned char y,float num)
{
unsigned char tmp[8];
num *= 1000;
tmp[7]='\0';
tmp[6]=(unsigned char)((int)num%10+0x30);;
tmp[5]=(unsigned char)((int)num/10%10+0x30);;
tmp[4]=(unsigned char)((int)num/100%10+0x30);
tmp[3]='.';
tmp[2]=(unsigned char)((int)num/1000%10+0x30);
tmp[1]=(unsigned char)((int)num/10000%10+0x30);
tmp[0]='+';
LCD_P6x8Str(x,y,tmp);
}
回复 支持 3 反对 0

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-9-4 15:40:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-9-4 15:40:57 | 显示全部楼层
第一个帖子是你的
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-4 18:23:11 | 显示全部楼层
ssssssssssss 发表于 2018-9-4 15:40
第一个帖子是你的

嗯。。。。。。。。我的答案是第一个
回复 支持 反对

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
发表于 2018-9-5 09:13:01 | 显示全部楼层
5楼牛逼
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2018-9-5 09:22:20 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

4

主题

133

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3860
金钱
3860
注册时间
2016-6-11
在线时间
709 小时
发表于 2018-9-5 09:52:13 | 显示全部楼层
szczyb1314 发表于 2018-9-5 09:10
char str[25];
sprintf(str,"%f",float_num);
LCD_ShowString(x,y,25*8,16,size,str);

我也是采用这样的方法。不用考虑那么多的转换关系。
回复 支持 反对

使用道具 举报

2

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2014-4-8
在线时间
172 小时
发表于 2018-9-5 14:42:17 | 显示全部楼层
我的程序中一般不用浮点数,都使用整数
回复 支持 反对

使用道具 举报

10

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2018-6-30
在线时间
42 小时
发表于 2018-9-5 15:09:11 | 显示全部楼层

刚开始我不用浮点数,主要就是不会送去显示
后来别人告诉我用sprintf函数,才发现是这么简单,也不用研究浮点数的二进制到底是怎 么存储的
回复 支持 反对

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2018-9-5 16:56:56 | 显示全部楼层
szczyb1314 发表于 2018-9-5 09:10
char str[25];
sprintf(str,"%f",float_num);
LCD_ShowString(x,y,25*8,16,size,str);

好用。。。。。
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-5 19:12:41 | 显示全部楼层
szczyb1314 发表于 2018-9-5 09:10
char str[25];
sprintf(str,"%f",float_num);
LCD_ShowString(x,y,25*8,16,size,str);

对的,没考虑到负数这部分。。。
感觉你的程序更好用
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-5 19:14:30 | 显示全部楼层
13969873363 发表于 2018-9-5 19:12
对的,没考虑到负数这部分。。。
感觉你的程序更好用

我不大会使用Sprintf,,,学习学习
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-5 19:18:31 | 显示全部楼层
jackielau 发表于 2018-9-5 14:42
我的程序中一般不用浮点数,都使用整数

为了精度,不得不是用浮点数
回复 支持 反对

使用道具 举报

2

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2014-4-8
在线时间
172 小时
发表于 2018-9-6 20:44:49 | 显示全部楼层
13969873363 发表于 2018-9-5 19:18
为了精度,不得不是用浮点数

整数精度才高,你的理解有问题
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-7 17:04:35 | 显示全部楼层
jackielau 发表于 2018-9-6 20:44
整数精度才高,你的理解有问题

能详细指教一下吗
回复 支持 反对

使用道具 举报

2

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2014-4-8
在线时间
172 小时
发表于 2018-9-8 10:41:20 | 显示全部楼层
13969873363 发表于 2018-9-7 17:04
能详细指教一下吗

你可以把整数当做固定小数位的浮点数,例如长整型4个字节,你可以把前三字节当做整数,最后一字节当做小数,相当于把小数放大了2^8=256倍
回复 支持 反对

使用道具 举报

2

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2014-4-8
在线时间
172 小时
发表于 2018-9-8 10:43:04 | 显示全部楼层
整数和小数在数据上有区别,但是在物理上没有区别,比如10.5V是小数,但是10500mV不就是整数了吗?只是取不同的单位而已
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-8 19:56:26 | 显示全部楼层
jackielau 发表于 2018-9-8 10:43
整数和小数在数据上有区别,但是在物理上没有区别,比如10.5V是小数,但是10500mV不就是整数了吗?只是取不 ...

昂,懂一点了,谢谢
回复 支持 反对

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-9-8 21:42:08 | 显示全部楼层
sprintf比较好用。
回复 支持 反对

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-9-8 21:43:41 | 显示全部楼层
也有用自己实现的格式化显示函数,原型就是lcd_prinrfshow(void  *st r, ...);这样的不定参数的。
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-9 20:41:25 | 显示全部楼层
周易八索连山 发表于 2018-9-8 21:43
也有用自己实现的格式化显示函数,原型就是lcd_prinrfshow(void  *st r, ...);这样的不定参数的。

有例子分享一下吗
回复 支持 反对

使用道具 举报

3

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2018-9-7
在线时间
22 小时
发表于 2018-9-9 20:49:58 | 显示全部楼层
碰到显示小数、字符、汉字等显示,我还是比较喜欢写成带有形参的方式
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-9-10 18:25:59 | 显示全部楼层
Page 发表于 2018-9-9 20:49
碰到显示小数、字符、汉字等显示,我还是比较喜欢写成带有形参的方式

比如说呢??请指教一下呗
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-9-21
在线时间
5 小时
发表于 2018-10-11 13:04:32 | 显示全部楼层
你好,你这个我不能显示小数啊,后面的全是模糊的
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-10-12 21:30:27 | 显示全部楼层
Thisway 发表于 2018-10-11 13:04
你好,你这个我不能显示小数啊,后面的全是模糊的

模糊?具体呢
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-4-20
在线时间
7 小时
发表于 2019-7-24 00:31:52 | 显示全部楼层
啊啊啊啊为什么五楼运行报错了
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-4-20
在线时间
7 小时
发表于 2019-7-24 14:57:12 | 显示全部楼层
能不能告知一下num是什么呢?串口里不是存到了指针嘛?如何从指针到数组呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-7-19
在线时间
1 小时
发表于 2019-11-17 14:50:14 | 显示全部楼层
军哥天天向上 发表于 2018-9-5 09:49
我也有一个类似的,保留三位小数

void LCD_PrintFloat(unsigned char x,unsigned char y,float num)

你的这个现实函数咋写的啊
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2020-6-18
在线时间
32 小时
发表于 2020-9-10 13:36:25 | 显示全部楼层
要传的参数太多了,就不能只传要显示的数字吗
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-12-10
在线时间
13 小时
发表于 2021-12-7 00:49:56 | 显示全部楼层
  1. void LCD_ShowFloat(u16 x,u16 y,u8 size,float num,u8 Int,u8 Float)
  2. {
  3.         int i,n,a;
  4.                                 double        t;  
  5.         n=num;
  6.                                 t=(num-n);
  7.         for(i=0;i<Float;i++)
  8.         {
  9.                                         a=t*10;
  10.                                         t=(t*10)-a;
  11.           LCD_ShowxNum(x+8+i*8+Int*8,y,a,1,size,0);
  12.         }
  13.         LCD_ShowxNum(x,y,n,Int,size,0);
  14.         LCD_ShowString(x+Int*8,y,Int*16,16,size,".");

  15. }
复制代码


上面的函数显示不了小数点后的零,改了一下,这个函数可以显示小数点后的零,调用的参数的作用和上面的一样
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2017-5-5
在线时间
36 小时
发表于 2021-12-30 16:39:40 | 显示全部楼层

5楼的最好用,稍微修改下,让显示小数点后面多少位都行,亲测有效,DHT22显示小数点后一位就可以了
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2021-10-15
在线时间
13 小时
发表于 2021-12-31 13:57:57 | 显示全部楼层
85968011 发表于 2021-12-30 16:39
5楼的最好用,稍微修改下,让显示小数点后面多少位都行,亲测有效,DHT22显示小数点后一位就可以了

我怎么没有看见五楼啊
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2022-7-4
在线时间
2 小时
发表于 2022-7-4 15:14:50 | 显示全部楼层
szczyb1314 发表于 2018-9-5 09:10
char str[25];
sprintf(str,"%f",float_num);
LCD_ShowString(x,y,25*8,16,size,str);

这方法好巧妙
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表