[英]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.