[英]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
将设置段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;
希望我能说清楚一点,并能帮助您解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.