0

我有 47,二进制是 0010 1111。我需要拆分 47,所以我得到二进制 0000 0100 中的 4 和二进制 0000 0111 中的 7。

我已经看到了这个答案,但我想知道,由于英特尔 8085 没有 div 指令,我必须通过连续减法进行除法,我如何获得模数?

4

3 回答 3

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.

为那里相当基本的编码风格道歉,我只是试图让它更接近它在汇编语言中的样子。否则,我会使用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,并为您提供:fg

|   |
 ---
    |

你的特殊情况有点复杂,因为你有一个 15 段 LED 并且必须写一个字而不是一个字节,但理论是完全一样的。

有一个你需要为每个数字写的值表,并使用从我上面的算法计算的值偏移到该表中。

于 2011-10-21T01:04:52.047 回答
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 >> 4; lowNibble = 值 & 0x0F;

我希望我说清楚了,它可以帮助您解决这个问题。

于 2011-10-21T01:19:10.390 回答
0

您基本上在这里处理BCD 表示。有很多关于从二进制转换为 BCD 的资源,之后获取单个数字非常容易。

例如,使用这些指令将二进制转换为 bcd,然后简单地循环 BCD 数字的子地址,将每个子地址作为单个独立字节读取。代码简单、快速、切中要害。

于 2011-10-21T04:55:44.377 回答