2011-10-21 145 views

回答

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. 

道歉的,而BASIC編程風格在那裏,我只是試圖讓它更近些它會怎樣看彙編語言。否則,我會用一個while循環:-)

芹苴模量是什麼在units可變左一旦低於10 MB。

爲了完整(以及可能的加分,如果這是一個家庭作業,眉來眼去,卿卿我我的),因爲一個字節可以處理多達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該表(使用表格的基地址和值的簡單添加),然後從內存中提取該字節並使用它來設置LED段。這個值01100110將設置段bcfg,給你:

| | 
--- 
    | 

你的特殊情況是有點複雜,因爲你有一個十五段LED,並有寫一個字,而不是字節,但理論是完全一樣的。

有你需要寫每個數字,用我上面的算法計算出的值,以抵消成表值的表。

+0

謝謝你,但是這並沒有回答我的問題有關的連續減法僞師歌廳一模... – Ashir

+1

@Ashir:我建議你再看看。模數是所有重複減法後單位變量中剩下的。 – paxdiablo

+0

是的,你是對的,但我沒有十進制數(47)我把它作爲8位二進制(0010 1111)在累加器中。我需要拆分0010 1111,以便在15段顯示器上顯示4(0000 0100)和7(0000 0111)。您的解決方案適用於不是二進制的十進制數,另外,我不知道將在累加器中存儲什麼數字。 – Ashir

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 =值>> 4; lowNibble =值& 0x0F;

我希望我明確自己,並幫助您解決此問題。

+0

這就是我剛開始時的難處,但正如我在我的問題中所說,最快方式(在這裏找到)將做一個分區,並把模數放在一個堆棧上。我的問題是,我不能分開,所以我必須減去,直到我得到零作僞分割。我怎樣才能得到一個模數做這樣的事情?噢,我會寫下來的,47是二進制的,它是0010 1111,而7是0111。我只是把這些比特放在4比特的塊中。 – Ashir

+0

@osmar oxcf,你預先假設BCD存儲,但它實際上是二元的。如果是BCD,那麼很容易就可以用位掩碼和位移來實現,但不幸的是,情況並非如此。 – paxdiablo

0

你基本上處理BCD representation這裏。從二進制轉換到BCD有很多資源,在這之後,獲得單個數字非常容易。

例如,使用these instructions將二進制轉換爲bcd,然後簡單地遍歷BCD數字的子地址,將每個數字讀取爲一個獨立的字節。代碼簡單,快速,重點突出。