我有47,二进制它是0010 1111.我需要拆分47所以我得到4个二进制0000 0100和7个二进制0000 0111。
我看到this answer但是我想知道,因为英特尔8085没有div指令我必须通过连续减法来划分,我如何得到模数呢?
答案 0 :(得分:3)
如果您的处理器没有除法指令(或BCD转换指令,这将是另一种方式),您只需要重复减法。伪代码就像:
val = 47
units = val
tens = 0
loop:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop
done:
;; tens = 4, units = 7.
对于那里相当BASIC编码风格的抱歉,我只是试着让它更接近汇编语言的外观。否则,我会使用while
循环: - )
当units
变量低于10时,它就是 val = 247
units = val
tens = 0
hundreds = 0
loop1:
if units < 100 goto loop2
units = units - 100
hundreds = hundreds + 1
goto loop1
loop2:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop2
done:
;; hundreds = 2, tens = 4, units = 7.
变量中剩下的。
为了完整性(如果这是一个家庭作业,可能需要额外的分数,轻推微调,眨眼眨眼),因为一个八位字节最多可以处理255个:
val = 47
units = val
tens = 0
while units >= 10:
units = units - 10
tens = tens + 1
print "Tens = %d, Units = %d"%(tens,units)
作为此方法的证明,您可以尝试以下Python代码:
Tens = 4, Units = 7
确实输出了:
a
---
f | | b
-g-
e | | c
--- . h
d
就使用这些值来驱动LED设备而言,简单的查找表可能是最简单的。构造一个需要写入两个8位内存地址的值数组,然后使用该数字查找这些值以写入设备。
我会使用简化的七段LED(加小数点),因为它更容易理解:
abcdefgh
在这个例子中,假设你将一个字节 abcdefgh
0 11111100
1 01100000
2 11011010
3 11110010
4 01100110
5 10110110
6 10111110
7 11100000
8 11111110
9 11110110
写入一个内存映射位置,这个字节中的位控制着哪些段。
不同数字(不带小数点)的值是(未经测试,因此可能需要进行一些调整):
01100110
给定值为4,您只需在该表中的偏移量4处查找字节(使用表的基址和值的简单添加),然后从内存中提取该字节并使用它来设置LED段。该值b
将设置细分c
,f
,g
和| |
---
|
,为您提供:
{{1}}
你的特殊情况有点复杂,因为你有一个十五段LED并且必须写一个字而不是一个字节,但理论完全一样。
为每个数字创建一个值表,并使用上面算法计算出的值来偏移到该表中。
答案 1 :(得分:0)
我建议的解决方案是考虑你总是有两个十六进制数字(在你使用4和7的例子中,但它可以是A和E)。 *和7是0111,而不是写成的1111
这是一个提示,1个十六进制数字恰好对应4个二进制数字。 因此,例如0xA245是1010(A)0010(2)0100(4)0101(5)。
最后,我的建议只是执行4位的右旋转以获得高半字节(4)。要获得7,只需在高半字节(0x0F)处将字节屏蔽为0。
在C中它会是这样的: highNibble = value&gt;&gt; 4; lowNibble = Value&amp;为0x0F;
我希望我明确表达,并帮助您解决这个问题。
答案 2 :(得分:0)
你基本上在这里处理BCD representation。从二进制转换为BCD有很多资源,之后获取各个数字非常容易。
例如,使用these instructions将二进制转换为bcd,然后简单地循环遍历BCD数字的子地址,将每个数据作为单个独立字节读取。代码简单,快速,重点突出。