打印
[51单片机]

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

[复制链接]
8635|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
651927693|  楼主 | 2014-5-3 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
天风立马| | 2014-5-3 19:21 | 只看该作者
位寻址呗.

使用特权

评论回复
板凳
651927693|  楼主 | 2014-5-3 19:30 | 只看该作者
天风立马 发表于 2014-5-3 19:21
位寻址呗.

能说得详细点儿吗?

使用特权

评论回复
地板
天风立马| | 2014-5-3 19:36 | 只看该作者
651927693 发表于 2014-5-3 19:30
能说得详细点儿吗?

The bdata memory type may be used to declare variables only. You may not declare bdata functions. This memory is directly accessed using 8-bit addresses and is the on-chip bit-addressable RAM of the 8051. Variables declared with the bdata type are bit-addressable and may be read and written using bit instructions.

unsigned char bdata bdata_var;

使用特权

评论回复
5
651927693|  楼主 | 2014-5-3 19:54 | 只看该作者
天风立马 发表于 2014-5-3 19:36
The bdata memory type may be used to declare variables only. You may not declare bdata functions.  ...

我知道位寻址的意思,只是不知道该怎么实现我所说的功能。

使用特权

评论回复
6
天风立马| | 2014-5-3 20:06 | 只看该作者
......你知道sbit CY    = PSW^7;吧.你定义bdata后就可以直接位寻址.比如 unsigned char bdata ucTime;sbit SECON_LOW = ucTime^0;sbit SECON_HIGH = ucTime^1;..............

使用特权

评论回复
7
menfiss| | 2014-5-3 20:11 | 只看该作者
本帖最后由 menfiss 于 2014-5-3 20:20 编辑

从您的程序来看可以用BCD码进行计算,可以方便的得到个十百千位。
不过BCD码进行其它的运算就费一些时间了,但是看您的程序或许不大碍事;将很多的++运算分到很多时间片中,对定时的影响不大吧。

此外在您的程序中:
                if(1 == flag_half_second)
                {
                        flag_half_second = 0;
                        num ++;
                        if(999 == num)
                                num = 0;
                       
                }
感觉关于num ++开始的3行应该更改为:
if(999 == num)num = 0;     //相当于加1后千位溢出。
                      else num ++;
  
否则num会从998短暂的变为999后,马上在循环内更新为0,我想这不是您的本意;

如果timer0可以延时更长一些,或者使用能够重装载16位的timer2(不知有没有),对调度或许更好一些,只是不知是否有其它因素限制,仅供参考。

使用特权

评论回复
8
651927693|  楼主 | 2014-5-3 20:28 | 只看该作者
天风立马 发表于 2014-5-3 20:06
......你知道sbit CY    = PSW^7;吧.你定义bdata后就可以直接位寻址.比如 unsigned char bdata ucTime;sbit ...

对的,这个我我是知道的,可是我还是没有抓住您的point

使用特权

评论回复
9
651927693|  楼主 | 2014-5-3 20:32 | 只看该作者
menfiss 发表于 2014-5-3 20:11
从您的程序来看可以用BCD码进行计算,可以方便的得到个十百千位。
不过BCD码进行其它的运算就费一些时间了 ...

谢谢您,非常细致呢。不过我写的这段代码只是用于测试数码管而已。需要计算的是别的地方。
我之所以把我的时间限制的那么小,是因为我要产生2.5kHz的方波,不得已而为之。

使用特权

评论回复
10
天风立马| | 2014-5-3 20:43 | 只看该作者
本帖最后由 天风立马 于 2014-5-3 20:44 编辑
651927693 发表于 2014-5-3 20:28
对的,这个我我是知道的,可是我还是没有抓住您的point


我晕.你要不就是个位 十位 百位吗? 假设你的数据A的存储结构是这样的: xxxx x百十个;你现在的做法是算出A,然后 A%10......取个位;如果A可以位寻址你不就可以直接A^0取个位吗.这不就避免用%了吗?同理不用/.

使用特权

评论回复
11
江枫渔火| | 2014-5-3 21:17 | 只看该作者
用减法和乘法咯~

大多数程序应该不是卡在这个除法运算上的吧。要优化这个前,感觉还有别的地方可以值得先优化。

使用特权

评论回复
12
651927693|  楼主 | 2014-5-3 21:19 | 只看该作者
天风立马 发表于 2014-5-3 20:43
我晕.你要不就是个位 十位 百位吗? 假设你的数据A的存储结构是这样的: xxxx x百十个;你现在的做法是算出A ...

不好意思,还是没有理解。:'(
A^0,取的不是A的各位,而是A的第0位,是一个二进制数值啊。我这里所说的是十进制的呀

使用特权

评论回复
13
651927693|  楼主 | 2014-5-3 21:23 | 只看该作者
江枫渔火 发表于 2014-5-3 21:17
用减法和乘法咯~

大多数程序应该不是卡在这个除法运算上的吧。要优化这个前,感觉还有别的地方可以值得先 ...

那比如1234这个数字,应该怎么通过加法和乘法得到1、2、3、4呢?
恩,对的,确实别的地方可能耗时更多。我只是想和大家探讨探讨。

使用特权

评论回复
14
qq986433936| | 2014-5-3 21:37 | 只看该作者
1234,循环一次减1000,判断结果为零后中止;循环的次数减1,这个就是千位数。

使用特权

评论回复
15
651927693|  楼主 | 2014-5-3 21:49 | 只看该作者
qq986433936 发表于 2014-5-3 21:37
1234,循环一次减1000,判断结果为零后中止;循环的次数减1,这个就是千位数。 ...

恩,这个确实可以。

使用特权

评论回复
16
通宵敲代码| | 2014-5-3 23:50 | 只看该作者
可以用加减法、移位去算。
比如10的二进制是1010,12是1100。
可以将1010存为常量,12-10就是1100-1010=0010,也就是2了,这样速度能提高不少。

使用特权

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

使用特权

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

使用特权

评论回复
19
李冬发| | 2014-5-4 09:51 | 只看该作者
先转换成BCD,剩下就好办了。BCD可以用嵌入汇编,没几行代码的。

使用特权

评论回复
20
wh6ic| | 2014-5-4 11:03 | 只看该作者
这个问题在汇编中很简单,在C里面就麻烦了

使用特权

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

本版积分规则

26

主题

544

帖子

1

粉丝