OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 912|回复: 26

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

[复制链接]

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-4-9
在线时间
83 小时
发表于 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,".");

}


回复

使用道具 举报

  离线 

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);
}
回复 支持 1 反对 0

使用道具 举报

  离线 

80

主题

776

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

80

主题

776

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

12

主题

799

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2087
金钱
2087
注册时间
2015-8-25
在线时间
362 小时
发表于 2018-9-5 09:10:52 | 显示全部楼层
char str[25];
sprintf(str,"%f",float_num);
LCD_ShowString(x,y,25*8,16,size,str);
这样子不是更好用?
你的程序不能显示负小数吧?
回复 支持 反对

使用道具 举报

  离线 

10

主题

67

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  在线 

34

主题

1979

帖子

0

精华

资深版主

Rank: 8Rank: 8

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

使用道具 举报

  离线 

3

主题

107

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2601
金钱
2601
注册时间
2016-6-11
在线时间
508 小时
发表于 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

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

7

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

  离线 

85

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
685
金钱
685
注册时间
2016-8-25
在线时间
427 小时
发表于 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);

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-4-9
在线时间
83 小时
 楼主| 发表于 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);

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

2

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

2

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

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

使用道具 举报

  离线 

2

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

2

主题

166

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

2

主题

166

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

3

主题

82

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-4-9
在线时间
83 小时
 楼主| 发表于 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 | 显示全部楼层
你好,你这个我不能显示小数啊,后面的全是模糊的
回复 支持 反对

使用道具 举报

  离线 

13

主题

65

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

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

本版积分规则




关闭

正点原子STM32/FPGA资料免费洗澡上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-12-19 16:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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