作者eternal1879 (疯狂米虫)
看板ASM
标题[问题] 8051的一些小问题
时间Sun Mar 21 22:29:25 2010
最近开始在学习8051,现在有一些疑惑 希望有人可以帮我解答 感谢
前提 我的PORT一直在读取一个变数 现在要输出到LCD上
这个我都已经写好了
但是怕误差我想加上一个平均的写法
假设15次平均後在输出一次
问题一
考虑到溢位 我是想说把第一次的先存起来丢旁边
再利用第二次输入的与第一次输入相减
第三次输入的与第一次输入相减...最後累加差值/15 在与第一次相加 可得平均数
可是我看了一下减法的程式跑法 SUBB 如果是负号他是利用CY来标记
那如果我把他们的差值移动到其他地方会不会系统就搞混?(是失真吗?意思是差值变了
就是差值得正负在移动後会不会乱掉
我同学说会可是我感觉应该不会才对@@"
问题二
ADD,ADDC有人可以具体的描述他们的差异吗
有方法可以让我直接把数值拆开然後累加吗
可是我考虑到累积15次...还是会有溢位的可能性
所以有人有更好的方法吗?
能看到这行..真的感谢各位的帮忙..
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.125.93.19
1F:推 odahawk:问题二。用两个记忆区,加一次判断是否大於某值就进位 03/21 22:34
2F:→ eternal1879:判断如果C的话我知道用if写 组合语言判断溢位 有好的 03/21 22:43
3F:→ eternal1879:写法吗? 03/21 22:43
4F:→ mepass:你可以先判断大小 大的放一边 小的放一边 03/22 00:00
5F:→ mepass:要加减的时候再统一取正负 03/22 00:00
6F:→ mepass:比如说 i2>i1就取i2-i1放到正的暂存器 03/22 00:01
7F:→ mepass: i3<i1就取i1-i3放到负的暂存器 03/22 00:02
8F:→ mepass:这边说的正负 是指後面相加减的时候你取的正负号 03/22 00:02
9F:推 mepass:add addc差别是一个溢位後会有旗标 简单讲就是表示进位 03/22 00:05
10F:→ mepass:就好比两个个位数相加超过十会进一位一样 03/22 00:06
11F:→ mepass:如果要把两个8bit暂存器合起来变成一个16bit暂存器 03/22 00:06
12F:→ mepass:你就需要那个进位旗标 详细作法应该书上都会有 03/22 00:07
13F:→ mepass:8051的书找不到就去找8086的看看 03/22 00:07
14F:推 stool100:问题一. 你可以把(新值*14+旧值)/15 放入旧值 03/22 01:45
15F:推 ksmrt0123:你会用8-bit指令做出16-bit加法吗? 03/22 13:59
16F:→ ksmrt0123:平均还是累加後再除比较好做, 最好取2的幂次方个再平均 03/22 14:01
17F:→ ksmrt0123:如除16可用右移4 bit完成 03/22 14:02
感谢大家给我的想法
目前是利用
时脉一直读取 A B C D E...一直跑N个
读取A之後先存到一边
B判断 B>A B-A 得差值存到一边(正)
B<A A-B 得差值存到一边(数值为正,但意义上应该是负)
C D E..等等同B的计算方法
差值正的累加得到X
差值负的累加得到Y
再次判断差值X>Y (X-Y)/N+A
X<Y A-(Y-X)/N
比大小是利用SUBB看CY是1或0来跑 利用JC决定放哪边
有关2的N次方我之前有想过 可是我不会16BIT的加减法 有人要教我一下吗
感觉利用16BIT的写法会比较快一点
之前我是想说如果取2的一次方的数量 RR1次
2的二次方的数量 RR2次
2的三次方的数量 RR3次来计算平均
可是我只知道用ADD来计算 可是这样会使A溢位
也想过利用类似逻设的半加法的方法..可是这样要写很多回圈
16BIT是利用这样写吗..?
应该不是吧...
※ 编辑: eternal1879 来自: 59.125.93.19 (03/22 16:09)
18F:推 kissy:印象中溢不溢位用组语来写的话,可以靠STATUS来判断 ? 03/22 17:16
19F:推 joy830:你读取的是什麽东西? 如果是A/D 03/23 01:56
20F:→ joy830:已经自动平均了 只要把读取频率调低 自然会平均多一点 03/23 01:56