16進位數轉換成8421BCD編碼函數

2021-01-08 電子發燒友
十六進位

十六進位(英文名稱:Hexadecimal),是計算機中數據的一種表示方法。同我們日常生活中的表示法不一樣。它由0-9,A-F組成,字母不區分大小寫。與10進位的對應關係是:0-9對應0-9;A-F對應10-15;N進位的數可以用0~(N-1)的數表示,超過9的用字母A-F。

1、BCD碼與十進位數的轉換

BCD碼與十進位數的轉換關係很直觀,相互轉換也很簡單,將十進位數75.4轉換為BCD碼:7-》0111,5-》0101,4-》0100所以拼成8421BCD碼的結果是:(0111 0101.0100)BCD;若將BCD碼1000 0101.0101轉換為十進位數:1000-》8,0101-》5,0101-》5所以結果是:(85.5)D。

注意:同一個8位二進位代碼表示的數,當認為它表示的是二進位數和認為它表示的是二進位編碼的十進位數時,數值是不相同的。

例如:00011000,當把它視為二進位數時,其值為24;但作為2位BCD碼時, 其值為18。

又例如00011100,如將其視為二進位數,其值為28,但不能當成BCD碼,因為在8421BCD碼中,它是個非法編碼 。

2、BCD碼的格式

計算機中的BCD碼,經常使用的有兩種格式,即分離BCD碼,組合BCD碼。

所謂分離BCD碼,即用一個字節的低四位編碼表示十進位數的一位,例如數82的存放格式為:

_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示無關值。

組合BCD碼,是將兩位十進位數,存放在一個字節中,例82的存放格式是1000 0010

3、BCD碼的加減運算

由於編碼是將每個十進位數用一組4位二進位數來表示,因此,若將這種BCD碼直接交計算機去運算,由於

計算機總是把數當作二進位數來運算,所以結果可能會出錯。例:用BCD碼求38+49。

解決的辦法是對二進位加法運算的結果採用「加6修正,這種修正稱為BCD調整。即將二進位加法運算的結果修正為BCD碼加法運算的結果,兩個兩位BCD數相加時,對二進位加法運算結果採用修正規則進行修正。修正規則:

(1)如果任何兩個對應位BCD數相加的結果向高一位無進位,若得到的結果小於或等於9,則該位不需修正;若得到的結果大於9且小於16時,該位進行加6修正。

(2)如果任何兩個對應位BCD數相加的結果向高一位有進位時(即結果大於或等於16,注意不是修正時的進位),該位進行加6修正。

(3)低位修正結果使高位大於9時,高位進行加6修正。

下面通過例題驗證上述規則的正確性。

a)用BCD碼求35+21

35-》 0011 0101+

21-》 0010 0001=

0101 0110-》56

注意:0101+0001並沒有滿足上述3條規則,同時0011+0010也沒有滿足上述3條規則,所以結果不作處理。

b)BCD碼求25+37

25-》0010 0101+

37-》0011 0111=

0101 1100+(低位0101+0111=1100-》12》9所以需要調整)

06-》 0110=

0110 0010-》62

注意:在給低位加0110調整時也有向高位進位發生,但是這是在調整時的進位,故不做處理。

c)用BCD碼求38+49

38-》0011 1000+

49-》01001001=

1000 0001+(低位1000+1001相加時有進位發生,所以需要給低位加0110-》調整)

06-》 0110=

10000111-》87

注意調整後的結果也不滿足上述(3)的條件所以不再調整

d)用BCD碼求42+95

42-》0100 0010+

95-》1001 0101=

11010111-》13 7+(1101是一個非法8421BCD碼,事時上0100+1001相加滿足(1)條件)

06-》0110(注意是給1001+0100加0110調整)

00010011 0111-》1 3 7

注意結果不滿足(3)條件所以不再調整。

c)用BCD碼求91+83

91-》1001 0001+

83-》1000 0011=

00010001 0100 +(1001+1000有進位發生所以需要給1001+1000相加結果0001+0110調整)

06-》0110 =

00010111 0100-》174

注意結果不滿足(3)條件所以不再調整。

d)用BCD碼求94+7

94-》1001 0100+

07-》0000 0111=

10011011+(由於結果的兩位編碼數滿足上述條件1所以需要給0100+0111+0110調整)

06-》0110=

1010 0001+(由於結果的高位1010-》10》9所以滿足上述(3)條件給高位加0110調整)

06-》0110 =

0001 0000 0001-》101

注意:對於調整我們只需要關心結果是不是滿足上述(3)條件,不滿足不予調整。

e)用BCD碼求76+45

76-》0111 0110+

45-》0100 0101=

1011 1011+(注意這裡0101+1011和0111+0100都滿足上述(1)條件所以需要都調整)

06-》01100110=

000100100001-》121

注意結果滿足上述(3)條件所以不再調整。(例子補充於2015-1-11)

兩個組合BCD碼進行減法運算時,當低位向高位有借位時,由於」借一作十六「與」借一作十「的差別,將比正確的結果多6,所以有借位時,可採用」減6修正法「來修正。兩個BCD碼進行加減時,先按二進位加減指令進行運算,再對結果用BCD調整指令進行調整,就可得到正確的十進位運算結果。 實際上,計算機中既有組合BCD數的調整指令,也有分離BCD數的調整指令。另外,BCD碼的加減運算,也可以在運算前由程序先變換成二進位數,然後由計算機對二進位數運算處理,運算以後再將二進位數結果由程序轉換為BCD碼。

16進位數轉換成8421BCD編碼函數

.INCLUDE hardware.inc

.IRAM

_Led_Out:

.dw 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000

_List_8421_Data: //16進位數轉換成8421碼的位權表,萬位每千位進位,千位每百位進位,百位每十位進位

.dw 0xFFFF,0xEA60,0xC350,0x9C40,0x7530,0x4E20,0x2710

//60000-10000

.dw 0x2328,0x1F40,0x1B58,0x1770,0x1388,0x0FA0,0x0BB8,0x07D0,0x03E8

//9000-1000

.dw 0x0384,0x0320,0x02BC,0x0258,0x01F4,0x0190,0x012C,0x00C8,0x0064

//900-100

.dw 0x005A,0x0050,0x0046,0x003C,0x0032,0x0028,0x001E,0x0014,0x000A

//90-10

//.RAM

//.DATA

.code

//=========================================================================================

//函數: hex_to_8421()

//語法:hex_to_8421(被轉換數,符號標記)

//描述:16進位數轉換成8421碼,存放在C段中定義好的數組當中

//須定義一個下標8位的整數數組,C段中如下書寫

//extern int led_out [8]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};

//參數:被轉換數小於0xFFFF的數,符號標記0或非零的數

//返回:無

//=============================================================================================

.PUBLIC _hex_to_8421;

_hex_to_8421: .PROC

push bp to [sp];

bp=sp+1; //基址重定位,準備取參數

r1=[bp+3]; //備轉換成8421碼的16進位數字

r3=[bp+4]; //符號位標誌,為0,則做無符號整數處理,非1做有符號數處理

R4=_Led_Out; //輸出數據的地址******************************可修改輸出名稱

bp=_List_8421_Data; //基址定位到位權表頭**************************對應.IRAM段,可修改輸入名稱

//--

test R3,0xFFFF; //檢查R3是否非0,如果非零,做有符號數處理,如果為0,做無符號數處理

je _hex_loop0; //為0,做無符號數處理,跳到_hex_loop0

R3=0xF000; //非0,做有符號數處理

[R4]=r3; //表的第1個單元高4位元組存放符號標記,F為負,0為正

R1-=0X0001; //包括下1步,減1後反碼轉換成10進位正數

R1^=0xFFFF;

_hex_loop0:

R2=0X0007; //R2為進位標誌,從9到1循環,R2初置7,進入循環後減1為6做初值

//--

_hex_loop1: //位權表遍歷開始標記

CALL _Clear_WatchDog; // 清看門狗

BP+=0X0001; //基址加1,定位到位權表第一個有效數字

R2-=0X0001; //位權減1,準備輸出位權表第一個有效數字所對應的位數字

cmp r1,[bp]; //比較被轉換數和當前位權的大小

jb _hex_loop2; //如果被轉換數小於當前位權,則跳到「_hex_loop1」,繼續比較

jmp _hex_loop3; //如果被轉換數大於當前位權,則跳到「_hex_loop3」,進行轉換

_hex_loop2: //R2進位循環處理的標記

CMP R2,0X0002;

JB _hex_loop4; //包括上1步,如果R2小於2,跳到_hex_loop4,將R2置為10

JMP _hex_loop1; //如果R2大於等於2,跳到「_hex_loop1」,繼續比較

_hex_loop4:

R2=0x000A; //包括下1步,將R2置為10,跳到「_hex_loop1」,繼續比較

JMP _hex_loop1;

//--

_hex_loop3: //判斷並輸出數據的標記

cmp r1,0x2710;

jnb _hex_2710; //包括上1步,如果R1大於等於0x2710(10000),跳到_hex_2710處理

cmp r1,0x03e8;

jnb _hex_03e8; //包括上1步,如果R1大於等於0x03E8(1000),跳到_hex_03E8處理

cmp r1,0x0064;

jnb _hex_0064; //包括上1步,如果R1大於等於0x0064(100),跳到_hex_0064處理

cmp r1,0x000a;

jnb _hex_000a; //包括上1步,如果R1大於等於0x000A(10),跳到_hex_000A處理

//--

R3=R4+5; //包括下2步,輸出10進位第1位,跳到「_hex_000」,結束轉換

[R3]=R1;

jmp _hex_over;

_hex_2710:

R3=R4+1; //包括下3步,輸出10進位第5位,被轉換數減位權,做被轉換數,跳到「_hex_loop1」,繼續比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_03e8:

R3=R4+2; //包括下3步,輸出10進位第4位,被轉換數減位權,做被轉換數,跳到「_hex_loop1」,繼續比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_0064:

R3=R4+3; //包括下3步,輸出10進位第3位,被轉換數減位權,做被轉換數,跳到「_hex_loop1」,繼續比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_000a:

R3=R4+4; //包括下3步,輸出10進位第2位,被轉換數減位權,做被轉換數,跳到「_hex_loop1」,繼續比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_over:

pop bp from [sp];

RETF

.ENDP;

.PUBLIC _Clear_WatchDog;

_Clear_WatchDog: .PROC

PUSH R1 TO [SP];

R1 = 0x0001;

[ASM_Port_Watchdog_Clear] = R1;

POP R1 FROM [SP];

RETF

.ENDP;

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 餘3碼至8421BCD碼的轉換_8421BCD碼轉換成餘3碼
    >一:8421BCD碼 二進位編碼的十進位數,簡稱BCD碼(Binarycoded Decimal)。 將十進位數75.4轉換為BCD碼如: 75.4=(0111 0101.0100)BCD 若將BCD碼1000 0101.0101轉換為十進位數如: (1000 0101.0101)BCD=85.5 注意:同一個8位二進位代碼表示的數,當認為它表示的是二進位數和認為它表示的是二進位編碼的十進位數時,數值是不相同的。
  • 8421bcd碼轉換二進位
    8421BCD碼 算機內毫無例外地都使用二進位數進行運算,但通常採用8進位和十六進位的形式讀寫。對於計算機技術專業人員,要理解這些數的含義是沒問題,但對非專業人員卻不那麼容易的。由於日常生活中,人們最熟悉的數制是十進位,因此專門規定了一種二進位的十進位碼,稱為BCD碼,它是一種以二進位表示的十進位數碼。
  • 十進位數的編碼與運算
    4位基2碼有16種不同的組合,怎樣從中選擇出10個組合來表示十進位數位的0-9,有非常多的可行方案,下面介紹其中的最常用的幾種。  ① 十進位有權碼  是指表示一個十進位數位的4位基2碼的每一位有確定的位權。  用得最普遍的是8421碼,即4個基2碼位的權從高向低分別為8、4、2和1,使用基2碼的0000、0001、…1001這10種組合,分別表示0到9這十個值。
  • 16進位數轉換成10進位整數的VC++程序
    二進位數據很少直接用在Visual C++++程序中,因為C++通常被視作高級語言。然而,對於要在兩類不同設備間傳輸信息的通信網絡而言,二進位數或十六進位數的傳輸過程比十進位數更為簡單。
  • 二進位、八進位、十進位、十六進位之間的轉換
    反過來,當我們看到 FD時,如何迅速將它轉換為二進位數呢?先轉換F:        看到F,我們需知道它是15(可能你還不熟悉A~F這六個數),然後15如何用8421湊呢?應該是8 + 4 + 2 + 1,所以四位全為1 :1111。接著轉換 D:        看到D,知道它是13,13如何用8421湊呢?
  • C# 16進位轉換10進位相關函數詳解
    C# 16進位轉換10進位相關函數詳解 在C#中可以對整型運算對象按位進行邏輯運算,同時也可以實現C# 16進位轉換10進位,C#10進位轉換2進位等功能。
  • 如何實現二進位轉十進位的設計
    二進位數的運算法則少,運算簡單,使計算機運算器的硬體結 構大大簡化。由於二進位 0 和 1 正好和邏輯代數的假(false)和 真(true)相對應,有邏輯代數的理論基礎,用二進位表示二值 邏輯很自然。電子器件中,所有的數據都是用二進位來表示的。 2.
  • 進位轉換方法
    10進位轉換成其他的都是除以要轉換成的那個數,也就是說轉換成二進位的就除以2,轉換成八進位的就除以8,轉換成十六進位的就除以16,然後倒取餘數。
  • 單片機進位轉換
    十 ----> 八  10進位數轉換成8進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成8。   來看一個例子,如何將十進位數120轉換成八進位數。十 ----> 十六   10進位數轉換成16進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成16。
  • 二進位、八進位、十進位和十六進位數之間的轉換方法
    6)二進位數與十六進位數的相互轉換二進位數與十六進位數的相互轉換方法和二進位數與八進位數的轉換類似。二進位數轉換成十六進位數,只要把每4位分成一組,再分別轉換成十六進位數碼中的一個數字,不足4位的分別向高位或低位補0湊成4位,全部連接起來即可。反之,十六進位數轉換成二進位數,只要將每一位十六進位數轉換成4位二進位數,依次連接起來即可。
  • 二進位與十六進位之間互相轉換
    通過上節課的學習,我們掌握了二進位與八進位互相轉換的方法(我們介紹的是421法),我們進行知識遷移,二進位數轉換成十六進位數的方法我們用
  • 介紹「十六進位數字符串至數值轉換」函數
    有幾點需要注意:本文引用地址:http://www.eepw.com.cn/article/201701/337016.htm1:雖然該函數的輸入端子「string」的值可以是十六進位數、字符串(ASCII)或其他進位數,但是「string」的值流入該函數中時,先轉換成字符串(ASCII)。
  • 四位二進位計數器這樣組成8421BCD碼十進位計數器,原理簡單
    十進位計數器與4位二進位計數器有些相似,但4位二進位計數器需要計數到1111然後 才能返回到0000,而十進位計數器要求計數到1001 (相當於9)就返回0000。8421BCD碼 十進位計數器是一種最常用的十進位計數器。8421BCD碼十進位計數器如圖所示。
  • 二進位、十進位、八進位、十六進位間的相互轉換函數
    二進位、十進位、八進位、十六進位間的相互轉換函數1、輸入任意一個十進位的整數,將其分別轉換為二進位、八進位、十六進位。{int num;char a[39];//定義一個字符數組,用於存儲字符串cout<<"Entre num:"<<endl;cin>>num;cout<<"二進位
  • 工程函數 DEC2HEX將十進位數轉換為十六進位數
    第一步:根據「DEC2HEX」函數的提示,在excel表格中創建模板,分別輸入一以下信息:「十進位數、字符數、結果」。第二步:給這個函數的模板進行賦值,分別:「十進位數:10.5、11.5、12.5、13.5;字符數:1、2、3、4」。
  • 二進位、八進位、十進位、十六進位數的轉換方法
    例如,將(30)10轉換成二進位數。1 ----最左位∴ (30)10 =(1E)163、將P進位數轉換為十進位數把一個二進位轉換成十進位採用方法:把這個二進位的最後一位乘上20,倒數第二位乘上21,……,一直到最高位乘上2n,然後將各項乘積相加的結果就它的十進位表達式。
  • 計算機的語言——二進位,十進位、八進位、十六進位與二進位之間的轉換
    而C程序代碼中的整數常量,為了書寫方便,用十進位、八進位、十六進位表示,比如:十進位整數123、-23、+99等。而無論十進位、八進位還是十六進位數據在計算機中表示是轉換成二進位編碼表示,計算機中只存在二進位。
  • 如何實現不同進位數的轉換(PHP代碼)
    轉換在這裡分享一個進位數互相轉換的例子:如何快速實現進位數之間的轉換,代碼可以解決。,decbin為十進位轉二進位,decoct為十進位轉八進位,dechex為十進位轉十六進位,bin2hex為二進位轉十六進位。
  • 從輸入法的全形、半角聊起:計算機的那些字符編碼
    但是二進位的EDVAC卻需要使用二進位「0101」這些數字表示十進位數字,這時計算機就使用了第一種編碼——BCD碼。BCD碼是用4位二進位數來表示十進位數中的0到9這10個數中的任意一位。比如8421 BCD碼0010表示2,0100表示4。那麼什麼是編碼呢?
  • 51單片機整數二一十進位轉換的快速算法
    摘要 旨在提高89C51系列單片機鯿程中經常用到的整數二十進位轉換的代碼執行效率。提出的快速算法思路是,首先求出整數中包含的1000的個數,方法是採用二進位整數的高6位作為其預估,再通過2次校正得到準確值。