我有 47,二进制是 0010 1111。我需要拆分 47,所以我得到二进制 0000 0100 中的 4 和二进制 0000 0111 中的 7。
我已经看到了这个答案,但我想知道,由于英特尔 8085 没有 div 指令,我必须通过连续减法进行除法,我如何获得模数?
如果您的处理器没有除法指令(或 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.
为那里相当基本的编码风格道歉,我只是试图让它更接近它在汇编语言中的样子。否则,我会使用while
循环:-)
units
一旦模数降到 10 以下,它就会留在变量中。
为了完整(如果这是家庭作业,可能还有额外的分数,轻推轻推,眨眼眨眼),因为单个八位字节最多可以处理 255:
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.
为证明此方法有效,您可以尝试以下 Python 代码:
val = 47
units = val
tens = 0
while units >= 10:
units = units - 10
tens = tens + 1
print "Tens = %d, Units = %d"%(tens,units)
确实输出:
Tens = 4, Units = 7
就使用这些值来驱动 LED 设备而言,一个简单的查找表可能是最简单的。构造一个需要写入两个 8 位内存地址的值数组,然后使用该数字查找这些值以写入设备。
我将使用简化的七段 LED(加上小数点),因为它更容易理解:
a
---
f | | b
-g-
e | | c
--- . h
d
假设在此示例中,您将单个字节写入abcdefgh
内存映射位置,并且此字节中的位控制哪些段在上。
不同数字的值(没有小数点)是(未经测试,因此可能需要一些调整):
abcdefgh
0 11111100
1 01100000
2 11011010
3 11110010
4 01100110
5 10110110
6 10111110
7 11100000
8 11111110
9 11110110
给定值 4,您只需在该表中查找偏移量 4 处的字节(使用表的基地址和值的简单相加),然后从内存中提取该字节并使用它来设置 LED 段。该值01100110
将设置 segment b
、和c
,并为您提供:f
g
| |
---
|
你的特殊情况有点复杂,因为你有一个 15 段 LED 并且必须写一个字而不是一个字节,但理论是完全一样的。
有一个你需要为每个数字写的值表,并使用从我上面的算法计算的值偏移到该表中。
我建议的解决方案是考虑到您始终有两个十六进制数字(在示例中您使用 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 >> 4; lowNibble = 值 & 0x0F;
我希望我说清楚了,它可以帮助您解决这个问题。