打印
[51单片机]

51单片机中不使用“/”、“%”如何得到千位、百位、十位、个位?

[复制链接]
楼主: 651927693
手机看帖
扫描二维码
随时随地手机跟帖
21
651927693|  楼主 | 2014-5-4 13:17 | 只看该作者 回帖奖励 |倒序浏览
李冬发 发表于 2014-5-4 09:51
先转换成BCD,剩下就好办了。BCD可以用嵌入汇编,没几行代码的。

哦, 用BCD码确实也可以的。

使用特权

评论回复
22
651927693|  楼主 | 2014-5-4 13:18 | 只看该作者
ayb_ice 发表于 2014-5-4 05:54
用汇编写,
有个算法是循移位,然后用BCD加法,具体可以百度一下

能具体点码?这样我都不知道应该怎么搜索。

使用特权

评论回复
23
651927693|  楼主 | 2014-5-4 13:19 | 只看该作者
zhonggx 发表于 2014-5-4 08:53
在你计时计数的时候直接算出来啊,用4个BYTE分别存个十百千。

我那个只是调试程序,实际需要使用的时候不是这样计算出来的。

使用特权

评论回复
24
icecut| | 2014-5-4 14:31 | 只看该作者
用bit的回复是扯淡...
用乘法代替除法的,也不宜.
建议你根据bit的位权对每一位的bcd码相加.即是结果.
比如bit x = 128
那就是1,2,8
bit 有= 32
那么2+3,8+2进位=1, 6, 0

使用特权

评论回复
25
ayb_ice| | 2014-5-4 14:40 | 只看该作者
651927693 发表于 2014-5-4 13:18
能具体点码?这样我都不知道应该怎么搜索。

网上一大把
搜索51 HEX转BCD码

使用特权

评论回复
26
ocon| | 2014-5-4 16:17 | 只看该作者
现在的编译器足够聪明,如果用直接除不够快,说明你的单片机速度不够应付你的用法,解决的办法只有两个:换更快的单片机或改变你的用法。
换单片机暂不讨论,改变用法最常见的办法是在LED扫描中断外做大运算,还不够则降低数据更新率,人眼识别数据其实很慢的。

使用特权

评论回复
27
天风立马| | 2014-5-4 16:44 | 只看该作者
本帖最后由 天风立马 于 2014-5-4 16:46 编辑
651927693 发表于 2014-5-3 21:19
不好意思,还是没有理解。
A^0,取的不是A的各位,而是A的第0位,是一个二进制数值啊。我这里所说的是 ...


我这个例子举得不妥.你可以看下时钟芯片的数据存储样子.也许会对你有启发.
就是BCD位权算出十进制.
另外,你可以看看ato#系列函数,兴许你会发现点什么.还有,你确定你一定要用/ & %?有没有其他方**你想过?

使用特权

评论回复
28
651927693|  楼主 | 2014-5-4 16:45 | 只看该作者
ayb_ice 发表于 2014-5-4 14:40
网上一大把
搜索51 HEX转BCD码

哦,了解,多谢。

使用特权

评论回复
29
651927693|  楼主 | 2014-5-4 16:50 | 只看该作者
ocon 发表于 2014-5-4 16:17
现在的编译器足够聪明,如果用直接除不够快,说明你的单片机速度不够应付你的用法,解决的办法只有两个:换 ...

在中断外做大运算可能是大家都会采用的做法。

使用特权

评论回复
30
651927693|  楼主 | 2014-5-4 16:55 | 只看该作者
icecut 发表于 2014-5-4 14:31
用bit的回复是扯淡...
用乘法代替除法的,也不宜.
建议你根据bit的位权对每一位的bcd码相加.即是结果.

恕我愚钝,没有理解。你能说得再详细点儿吗?

使用特权

评论回复
31
天风立马| | 2014-5-4 17:22 | 只看该作者
你知道十进制转BCD码的算法吗?你想避免乘除法就逆转一下.(其中的乘除2用 左右移来实现.)

使用特权

评论回复
32
icecut| | 2014-5-4 18:18 | 只看该作者
假定 0x32 = 0----0----1----1____0----0----1----0
位权:_______0----0----32---16---0----0----2----0//查表
需要计算32+16+2 //查表
=[3,2]+[1,6]+[0,2]=[4,10]因为十进制=[5,0]==>段码显示

使用特权

评论回复
33
coody| | 2014-5-4 18:24 | 只看该作者
那就嵌入汇编 吧

使用特权

评论回复
34
coody| | 2014-5-4 18:24 | 只看该作者
那就嵌入汇编 吧

使用特权

评论回复
35
tuzihog| | 2014-5-4 19:21 | 只看该作者
关注以下

使用特权

评论回复
36
ZG11211| | 2014-5-4 21:13 | 只看该作者
我又要多一句嘴啦,其实没这么复杂,既然能/和%,那就是有它存在的道理,至于如何使用,那就需要整合资源,广开思路了,干嘛非得要钻牛角尖呢,按正常思维来考虑问题,需要大数值/或%的,一般对时间要求不严,一般对时序要求苛刻的,又不一定非要用10的整数倍,这也是计算机语言自发明以来,一般都是2或8的整数倍,而非10的整数倍,否则的话,你的设计就违反了规则,到最后就是自己挖坑埋自己。
扯远了,按楼主说的,50us是时序需要的,肯定不能改了,而求/和%只是为了满足显示的习惯而不得已的,这个对时间要求不是很严格,完全可以拆分成几个步骤,比如采集AD值,每个中断只采集一次并计数和累加,如果8次,那就用8个周期,用case0~7的方式调度程序执行,到8时计算一次/1000得到千位,到9时计算一次%1000/100得到百位,到10时。。。最后将得到的个十百千送给显示部分,这样就能保证每个中断周期能完成各自的任务,如果还无法满足需要,那只有提高时钟频率了。

使用特权

评论回复
37
651927693|  楼主 | 2014-5-4 23:48 | 只看该作者
ZG11211 发表于 2014-5-4 21:13
我又要多一句嘴啦,其实没这么复杂,既然能/和%,那就是有它存在的道理,至于如何使用,那就需要整合资源, ...

恩,现在完全理解您的意思。
我现在的方法就是每隔一段时间计算一次,以求对时标影响最小。

使用特权

评论回复
38
651927693|  楼主 | 2014-5-5 00:06 | 只看该作者
icecut 发表于 2014-5-4 18:18
假定 0x32 = 0----0----1----1____0----0----1----0
位权:_______0----0----32---16---0----0----2----0// ...

还是没有明白您具体什么意思。
0x32转换成十进制吗?您的步骤好像是在说这个。但是16进制转换成十进制应该是编译器自动完成的吧。

使用特权

评论回复
39
ayb_ice| | 2014-5-5 08:44 | 只看该作者
651927693 发表于 2014-5-5 00:06
还是没有明白您具体什么意思。
0x32转换成十进制吗?您的步骤好像是在说这个。但是16进制转换成十进制应 ...

哪有自动完成的说法

调试期间查看变量是调试器驱动完成的,这与这里说的完全是两码事情

使用特权

评论回复
40
icecut| | 2014-5-5 09:12 | 只看该作者
651927693 发表于 2014-5-5 00:06
还是没有明白您具体什么意思。
0x32转换成十进制吗?您的步骤好像是在说这个。但是16进制转换成十进制应 ...

我只能说这么多了....自动完成...那你就等着慢吧...

使用特权

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

本版积分规则