簡體   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