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有取余和取整指令。涉及到的浮点运算才会专门优化下。

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等方法也都可以。

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系列芯片,有除法和乘法指令,很快的。

@若水 发表于 2017-5-2 13:14

STM8处理这点代码不可能用30ms的,肯定是其它代码占时间

菜鸟同学 发表于 2017-5-2 14:30

30ms 这个你怎么测试出来的。

泰国博 发表于 2017-5-2 15:10

66666

ningling_21 发表于 2017-5-2 15:50

30ms 怎么测出来的

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。你可以查看对应的汇编代码,可以计算出时间。

icecut 发表于 2017-5-2 17:45

没有除法可以用减法...还可以用比较,二分法,比如大于5000否,大于就减去,然后大于3000否,大于就减去,大于2000否,大于就减去,大于1000否,大于就减去.于是千位就出来了...

宇容创行 发表于 2017-5-2 17:47

这是设计问题,和算法无关,算的再慢都不应该影响到显示

ayb_ice 发表于 2017-5-2 18:56

stm8有除法指令,并且支持16位的,就算没有也不可能要30ms,除非你的时钟很慢,查找其它地方问题

JerryWu75 发表于 2017-5-2 19:39

LED刷新放到定时器中断中, 计算过程放到主循环中. 再作一个互斥锁.

zyj9490 发表于 2017-5-2 21:06

这段代码完全可以优化,NUM%1000,可以作为中间变量进行保存,

雪山飞狐D 发表于 2017-5-2 23:37

本帖最后由 雪山飞狐D 于 2017-5-2 23:39 编辑

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

whirt_noob 发表于 2017-5-3 08:32

xyz549040622 发表于 2017-5-2 12:01
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。 ...

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

whirt_noob 发表于 2017-5-3 08:33

xyz549040622 发表于 2017-5-2 12:01
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。 ...

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

whirt_noob 发表于 2017-5-3 08:38

xyz549040622 发表于 2017-5-2 12:01
这种运算其实还好点,因为51有取余和取整指令。涉及到的浮点运算才会专门优化下。 ...

比较大的浮点运算怎么处理比较好一点
页: [1] 2 3
查看完整版本: 单片机处这种数字比较大的取余和除法运算怎么处理?