打印
[程序源码]

单片机处这种数字比较大的取余和除法运算怎么处理?

[复制链接]
9687|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whirt_noob|  楼主 | 2017-5-2 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
num=(u16)ucdata;
Thousand=num/1000;
Hundred=num%1000/100;
Ten=num%1000%100/10;
One=num%1000%100%10;

最近需要做一个4位数码管的显示程序,用两片595驱动,但是发现STM8单片机全速处理这种比较大的取余和除法运算也非常的慢,运算一次需要30ms的时间,严重影响了数码管的刷新,数码管出现微微的闪烁感,求大神告知怎么处理这样的问题?
有什么好的方法没有?

相关帖子

沙发
whirt_noob|  楼主 | 2017-5-2 09:43 | 只看该作者
本帖最后由 whirt_noob 于 2017-5-2 09:51 编辑

手动置顶

使用特权

评论回复
板凳
dirtwillfly| | 2017-5-2 10:42 | 只看该作者
尽量用移位操作代替除法和取模。或者num不要用数字,直接用字符串来储存数字,显示的时候就方便了

使用特权

评论回复
地板
xyz549040622| | 2017-5-2 12:01 | 只看该作者
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。

使用特权

评论回复
5
linqing171| | 2017-5-2 12:48 | 只看该作者
首先是这个运算不会有1ms,肯定不会有。你的代码其它地方有耗时的。
其次是你可以一次运算好,存起来,后面用,没有必要每次现算。如果是别人发给你的,你让别人先算好。这个是在上面假设不成立的情况下。
最后,
num=(u16)ucdata;
Thousand=num/1000;
num = num %1000;
Hundred=num/100;
num = num%100;
Ten=num/10;
One=num%10;
;
再进一步优化,还有内联函数提高一倍,再然后就是非常规的手段了。

其实汇编和printf等方法也都可以。

使用特权

评论回复
6
gx_huang| | 2017-5-2 12:55 | 只看该作者
应该用中间变量
uchar temp;
temp=num/100;
Thousand=temp/10;
Hundred=temp%10;
temp=num%100;
Ten=temp/10;
One=temp%10;
如果是51系列芯片,有除法和乘法指令,很快的。

使用特权

评论回复
7
@若水| | 2017-5-2 13:14 | 只看该作者
STM8处理这点代码不可能用30ms的,肯定是其它代码占时间

使用特权

评论回复
8
菜鸟同学| | 2017-5-2 14:30 | 只看该作者
30ms 这个你怎么测试出来的。

使用特权

评论回复
9
泰国博| | 2017-5-2 15:10 | 只看该作者
66666

使用特权

评论回复
10
ningling_21| | 2017-5-2 15:50 | 只看该作者
30ms 怎么测出来的

使用特权

评论回复
11
jackhwang| | 2017-5-2 16:43 | 只看该作者
num=(u16)ucdata;
Thousand=num/1000;
Hundred=num%1000/100;
Ten=num%1000%100/10;
One=num%1000%100%10;
修改为:
num=(u16)ucdata;
Thousand=num/1000;
Hundred=num%1000/100;
Ten=num%100/10;
One=num%10;

就使用你原来的计算,不可能需要30ms。你可以查看对应的汇编代码,可以计算出时间。

使用特权

评论回复
12
icecut| | 2017-5-2 17:45 | 只看该作者
没有除法可以用减法...还可以用比较,二分法,比如大于5000否,大于就减去,然后大于3000否,大于就减去,大于2000否,大于就减去,大于1000否,大于就减去.于是千位就出来了...

使用特权

评论回复
13
宇容创行| | 2017-5-2 17:47 | 只看该作者
这是设计问题,和算法无关,算的再慢都不应该影响到显示

使用特权

评论回复
14
ayb_ice| | 2017-5-2 18:56 | 只看该作者
stm8有除法指令,并且支持16位的,就算没有也不可能要30ms,除非你的时钟很慢,查找其它地方问题

使用特权

评论回复
15
JerryWu75| | 2017-5-2 19:39 | 只看该作者
LED刷新放到定时器中断中, 计算过程放到主循环中. 再作一个互斥锁.

使用特权

评论回复
16
zyj9490| | 2017-5-2 21:06 | 只看该作者
这段代码完全可以优化,NUM%1000,可以作为中间变量进行保存,

使用特权

评论回复
17
雪山飞狐D| | 2017-5-2 23:37 | 只看该作者
本帖最后由 雪山飞狐D 于 2017-5-2 23:39 编辑

  直接用掩码和移位取最低位就行了把,然后把数码管的数字高低电平做成数组,比如你要显示1234,第一部掩码XXX4,形成0004,直接在数码管位输出字符 abc[4]; 第二部右移,掩码,形成XXX3,也就是0003,剩下你懂的

使用特权

评论回复
18
whirt_noob|  楼主 | 2017-5-3 08:32 | 只看该作者
xyz549040622 发表于 2017-5-2 12:01
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。 ...

比较大的浮点数要怎么样优化比较好?

使用特权

评论回复
19
whirt_noob|  楼主 | 2017-5-3 08:33 | 只看该作者
xyz549040622 发表于 2017-5-2 12:01
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。 ...

比较大的浮点数要怎么样优化比较好?

使用特权

评论回复
20
whirt_noob|  楼主 | 2017-5-3 08:38 | 只看该作者
xyz549040622 发表于 2017-5-2 12:01
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。 ...

比较大的浮点运算怎么处理比较好一点

使用特权

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

本版积分规则

个人签名:永远保持一颗充满激情的心

16

主题

286

帖子

8

粉丝