繁体   English   中英

将二进制的2位数字拆分为二进制的一位数字

[英]Split a 2 digits number in binary to single digit in binary

我有47,二进制格式是00101111。我需要拆分47,所以在二进制0000 0100中得到4,在二进制0000 0111中得到7。

我已经看到了这个答案,但是我不知道,由于Intel 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循环:-)

一旦模量降到10以下,它就是units变量中剩下的模数。

为了完整起见(如果这是一项家庭作业,可能还会加分,请轻推,眨眨眼),因为一个八位字节最多可以处理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将设置段bcfg ,给您:

|   |
 ---
    |

您的特定情况稍微复杂一点,因为您有一个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;

希望我能说清楚一点,并能帮助您解决此问题。

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

例如,使用这些指令从二进制转换为bcd,然后简单地循环遍历BCD数字的子地址,将每个读取为单个独立字节。 该代码简单,快速且切合实际。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM