0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

16進(jìn)制數(shù)轉(zhuǎn)換成8421BCD編碼函數(shù)

PoisonApple ? 來(lái)源:網(wǎng)絡(luò)整理 ? 2018-03-02 10:11 ? 次閱讀

十六進(jìn)制

十六進(jìn)制(英文名稱:Hexadecimal),是計(jì)算機(jī)中數(shù)據(jù)的一種表示方法。同我們?nèi)粘I钪械谋硎痉ú灰粯?。它?-9,A-F組成,字母不區(qū)分大小寫(xiě)。與10進(jìn)制的對(duì)應(yīng)關(guān)系是:0-9對(duì)應(yīng)0-9;A-F對(duì)應(yīng)10-15;N進(jìn)制的數(shù)可以用0~(N-1)的數(shù)表示,超過(guò)9的用字母A-F。

1、BCD碼與十進(jìn)制數(shù)的轉(zhuǎn)換

BCD碼與十進(jìn)制數(shù)的轉(zhuǎn)換關(guān)系很直觀,相互轉(zhuǎn)換也很簡(jiǎn)單,將十進(jìn)制數(shù)75.4轉(zhuǎn)換為BCD碼:7-》0111,5-》0101,4-》0100所以拼成8421BCD碼的結(jié)果是:(0111 0101.0100)BCD;若將BCD碼1000 0101.0101轉(zhuǎn)換為十進(jìn)制數(shù):1000-》8,0101-》5,0101-》5所以結(jié)果是:(85.5)D。

注意:同一個(gè)8位二進(jìn)制代碼表示的數(shù),當(dāng)認(rèn)為它表示的是二進(jìn)制數(shù)和認(rèn)為它表示的是二進(jìn)制編碼的十進(jìn)制數(shù)時(shí),數(shù)值是不相同的。

例如:00011000,當(dāng)把它視為二進(jìn)制數(shù)時(shí),其值為24;但作為2位BCD碼時(shí), 其值為18。

又例如00011100,如將其視為二進(jìn)制數(shù),其值為28,但不能當(dāng)成BCD碼,因?yàn)樵?421BCD碼中,它是個(gè)非法編碼 。

2、BCD碼的格式

計(jì)算機(jī)中的BCD碼,經(jīng)常使用的有兩種格式,即分離BCD碼,組合BCD碼。

所謂分離BCD碼,即用一個(gè)字節(jié)的低四位編碼表示十進(jìn)制數(shù)的一位,例如數(shù)82的存放格式為:

_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示無(wú)關(guān)值。

組合BCD碼,是將兩位十進(jìn)制數(shù),存放在一個(gè)字節(jié)中,例82的存放格式是1000 0010

16進(jìn)制數(shù)轉(zhuǎn)換成8421BCD編碼函數(shù)

3、BCD碼的加減運(yùn)算

由于編碼是將每個(gè)十進(jìn)制數(shù)用一組4位二進(jìn)制數(shù)來(lái)表示,因此,若將這種BCD碼直接交計(jì)算機(jī)去運(yùn)算,由于

計(jì)算機(jī)總是把數(shù)當(dāng)作二進(jìn)制數(shù)來(lái)運(yùn)算,所以結(jié)果可能會(huì)出錯(cuò)。例:用BCD碼求38+49。

解決的辦法是對(duì)二進(jìn)制加法運(yùn)算的結(jié)果采用“加6修正,這種修正稱為BCD調(diào)整。即將二進(jìn)制加法運(yùn)算的結(jié)果修正為BCD碼加法運(yùn)算的結(jié)果,兩個(gè)兩位BCD數(shù)相加時(shí),對(duì)二進(jìn)制加法運(yùn)算結(jié)果采用修正規(guī)則進(jìn)行修正。修正規(guī)則:

(1)如果任何兩個(gè)對(duì)應(yīng)位BCD數(shù)相加的結(jié)果向高一位無(wú)進(jìn)位,若得到的結(jié)果小于或等于9,則該位不需修正;若得到的結(jié)果大于9且小于16時(shí),該位進(jìn)行加6修正。

(2)如果任何兩個(gè)對(duì)應(yīng)位BCD數(shù)相加的結(jié)果向高一位有進(jìn)位時(shí)(即結(jié)果大于或等于16,注意不是修正時(shí)的進(jìn)位),該位進(jìn)行加6修正。

(3)低位修正結(jié)果使高位大于9時(shí),高位進(jìn)行加6修正。

下面通過(guò)例題驗(yàn)證上述規(guī)則的正確性。

a)用BCD碼求35+21

35-》 0011 0101+

21-》 0010 0001=

0101 0110-》56

注意:0101+0001并沒(méi)有滿足上述3條規(guī)則,同時(shí)0011+0010也沒(méi)有滿足上述3條規(guī)則,所以結(jié)果不作處理。

b)BCD碼求25+37

25-》0010 0101+

37-》0011 0111=

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

06-》 0110=

0110 0010-》62

注意:在給低位加0110調(diào)整時(shí)也有向高位進(jìn)位發(fā)生,但是這是在調(diào)整時(shí)的進(jìn)位,故不做處理。

c)用BCD碼求38+49

38-》0011 1000+

49-》01001001=

1000 0001+(低位1000+1001相加時(shí)有進(jìn)位發(fā)生,所以需要給低位加0110-》調(diào)整)

06-》 0110=

10000111-》87

注意調(diào)整后的結(jié)果也不滿足上述(3)的條件所以不再調(diào)整

d)用BCD碼求42+95

42-》0100 0010+

95-》1001 0101=

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

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

00010011 0111-》1 3 7

注意結(jié)果不滿足(3)條件所以不再調(diào)整。

c)用BCD碼求91+83

91-》1001 0001+

83-》1000 0011=

00010001 0100 +(1001+1000有進(jìn)位發(fā)生所以需要給1001+1000相加結(jié)果0001+0110調(diào)整)

06-》0110 =

00010111 0100-》174

注意結(jié)果不滿足(3)條件所以不再調(diào)整。

d)用BCD碼求94+7

94-》1001 0100+

07-》0000 0111=

10011011+(由于結(jié)果的兩位編碼數(shù)滿足上述條件1所以需要給0100+0111+0110調(diào)整)

06-》0110=

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

06-》0110 =

0001 0000 0001-》101

注意:對(duì)于調(diào)整我們只需要關(guān)心結(jié)果是不是滿足上述(3)條件,不滿足不予調(diào)整。

e)用BCD碼求76+45

76-》0111 0110+

45-》0100 0101=

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

06-》01100110=

000100100001-》121

注意結(jié)果滿足上述(3)條件所以不再調(diào)整。(例子補(bǔ)充于2015-1-11)

兩個(gè)組合BCD碼進(jìn)行減法運(yùn)算時(shí),當(dāng)?shù)臀幌蚋呶挥薪栉粫r(shí),由于”借一作十六“與”借一作十“的差別,將比正確的結(jié)果多6,所以有借位時(shí),可采用”減6修正法“來(lái)修正。兩個(gè)BCD碼進(jìn)行加減時(shí),先按二進(jìn)制加減指令進(jìn)行運(yùn)算,再對(duì)結(jié)果用BCD調(diào)整指令進(jìn)行調(diào)整,就可得到正確的十進(jìn)制運(yùn)算結(jié)果。 實(shí)際上,計(jì)算機(jī)中既有組合BCD數(shù)的調(diào)整指令,也有分離BCD數(shù)的調(diào)整指令。另外,BCD碼的加減運(yùn)算,也可以在運(yùn)算前由程序先變換成二進(jìn)制數(shù),然后由計(jì)算機(jī)對(duì)二進(jìn)制數(shù)運(yùn)算處理,運(yùn)算以后再將二進(jìn)制數(shù)結(jié)果由程序轉(zhuǎn)換為BCD碼。

16進(jìn)制數(shù)轉(zhuǎn)換成8421BCD編碼函數(shù)

.INCLUDE hardware.inc

.IRAM

_Led_Out:

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

_List_8421_Data: //16進(jìn)位數(shù)轉(zhuǎn)換成8421碼的位權(quán)表,萬(wàn)位每千位進(jìn)位,千位每百位進(jìn)位,百位每十位進(jìn)位

.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

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

//函數(shù): hex_to_8421()

//語(yǔ)法:hex_to_8421(被轉(zhuǎn)換數(shù),符號(hào)標(biāo)記)

//描述:16進(jìn)位數(shù)轉(zhuǎn)換成8421碼,存放在C段中定義好的數(shù)組當(dāng)中

//須定義一個(gè)下標(biāo)8位的整數(shù)數(shù)組,C段中如下書(shū)寫(xiě)

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

//參數(shù):被轉(zhuǎn)換數(shù)小于0xFFFF的數(shù),符號(hào)標(biāo)記0或非零的數(shù)

//返回:無(wú)

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

.PUBLIC _hex_to_8421;

_hex_to_8421: .PROC

push bp to [sp];

bp=sp+1; //基址重定位,準(zhǔn)備取參數(shù)

r1=[bp+3]; //備轉(zhuǎn)換成8421碼的16進(jìn)位數(shù)字

r3=[bp+4]; //符號(hào)位標(biāo)志,為0,則做無(wú)符號(hào)整數(shù)處理,非1做有符號(hào)數(shù)處理

R4=_Led_Out; //輸出數(shù)據(jù)的地址******************************可修改輸出名稱

bp=_List_8421_Data; //基址定位到位權(quán)表頭**************************對(duì)應(yīng).IRAM段,可修改輸入名稱

//------------------------------------------

test R3,0xFFFF; //檢查R3是否非0,如果非零,做有符號(hào)數(shù)處理,如果為0,做無(wú)符號(hào)數(shù)處理

je _hex_loop0; //為0,做無(wú)符號(hào)數(shù)處理,跳到_hex_loop0

R3=0xF000; //非0,做有符號(hào)數(shù)處理

[R4]=r3; //表的第1個(gè)單元高4字節(jié)存放符號(hào)標(biāo)記,F(xiàn)為負(fù),0為正

R1-=0X0001; //包括下1步,減1后反碼轉(zhuǎn)換成10進(jìn)位正數(shù)

R1^=0xFFFF;

_hex_loop0:

R2=0X0007; //R2為進(jìn)位標(biāo)志,從9到1循環(huán),R2初置7,進(jìn)入循環(huán)后減1為6做初值

16進(jìn)制數(shù)轉(zhuǎn)換成8421BCD編碼函數(shù)

//------------------------------------------

_hex_loop1: //位權(quán)表遍歷開(kāi)始標(biāo)記

CALL _Clear_WatchDog; // 清看門(mén)狗

BP+=0X0001; //基址加1,定位到位權(quán)表第一個(gè)有效數(shù)字

R2-=0X0001; //位權(quán)減1,準(zhǔn)備輸出位權(quán)表第一個(gè)有效數(shù)字所對(duì)應(yīng)的位數(shù)字

cmp r1,[bp]; //比較被轉(zhuǎn)換數(shù)和當(dāng)前位權(quán)的大小

jb _hex_loop2; //如果被轉(zhuǎn)換數(shù)小于當(dāng)前位權(quán),則跳到“_hex_loop1”,繼續(xù)比較

jmp _hex_loop3; //如果被轉(zhuǎn)換數(shù)大于當(dāng)前位權(quán),則跳到“_hex_loop3”,進(jìn)行轉(zhuǎn)換

_hex_loop2: //R2進(jìn)位循環(huán)處理的標(biāo)記

CMP R2,0X0002;

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

JMP _hex_loop1; //如果R2大于等于2,跳到“_hex_loop1”,繼續(xù)比較

_hex_loop4:

R2=0x000A; //包括下1步,將R2置為10,跳到“_hex_loop1”,繼續(xù)比較

JMP _hex_loop1;

//------------------------------------------

_hex_loop3: //判斷并輸出數(shù)據(jù)的標(biāo)記

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進(jìn)制第1位,跳到“_hex_000”,結(jié)束轉(zhuǎn)換

[R3]=R1;

jmp _hex_over;

_hex_2710:

R3=R4+1; //包括下3步,輸出10進(jìn)制第5位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到“_hex_loop1”,繼續(xù)比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_03e8:

R3=R4+2; //包括下3步,輸出10進(jìn)制第4位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到“_hex_loop1”,繼續(xù)比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_0064:

R3=R4+3; //包括下3步,輸出10進(jìn)制第3位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到“_hex_loop1”,繼續(xù)比較

[R3]=R2;

r1-=[bp];

jmp _hex_loop1;

_hex_000a:

R3=R4+4; //包括下3步,輸出10進(jìn)制第2位,被轉(zhuǎn)換數(shù)減位權(quán),做被轉(zhuǎn)換數(shù),跳到“_hex_loop1”,繼續(xù)比較

[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;

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 16進(jìn)制
    +關(guān)注

    關(guān)注

    1

    文章

    13

    瀏覽量

    8794
  • BCD碼
    +關(guān)注

    關(guān)注

    1

    文章

    52

    瀏覽量

    18342
  • 8421碼
    +關(guān)注

    關(guān)注

    1

    文章

    8

    瀏覽量

    4064
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常用編碼(BCD編碼、余3碼、格雷反射碼、奇偶校驗(yàn)碼)

    使用8421BCD碼時(shí)一定要注意其有效的編碼僅十個(gè),即:0000~1001。四位二進(jìn)制數(shù)的其余六個(gè)編碼1010,1011,1100,1101
    發(fā)表于 04-11 10:00

    什么是BCD碼、8421碼、余三碼、格雷碼

    的是8421BCD碼,無(wú)權(quán)碼用得較多的是余三碼和格雷碼,我們通常所說(shuō)的BCD碼指的是8421BCD碼。這些編碼跟十進(jìn)制
    發(fā)表于 11-03 17:36

    Labview將4字節(jié)16進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制數(shù)小程序

    Labview將4字節(jié)16進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制數(shù)小程序
    發(fā)表于 10-29 16:47

    用FPGA設(shè)計(jì)將BCD轉(zhuǎn)換成進(jìn)制數(shù)電路

    用FPGA設(shè)計(jì)將BCD轉(zhuǎn)換成進(jìn)制數(shù)電路
    發(fā)表于 03-11 20:37

    關(guān)于兩位十進(jìn)制數(shù)轉(zhuǎn)換成進(jìn)制數(shù)的仿真 求助啊

    求助,不怎么懂這題該怎么做。求教。用兩片四位全加器74283和必要的邏輯門(mén)設(shè)計(jì)一個(gè)數(shù)制轉(zhuǎn)換電路,實(shí)現(xiàn)將輸入的兩位十進(jìn)制數(shù)轉(zhuǎn)換成進(jìn)制
    發(fā)表于 07-01 20:13

    怎么將16位二進(jìn)制數(shù)轉(zhuǎn)換成進(jìn)制數(shù)函數(shù)?

    有沒(méi)有人建立一個(gè)將16位二進(jìn)制數(shù)轉(zhuǎn)換成進(jìn)制數(shù)函數(shù)
    發(fā)表于 03-26 11:21

    C語(yǔ)言中十進(jìn)制轉(zhuǎn)8421BCD碼是用的什么方法?

    今天FPGA的同事問(wèn)我C語(yǔ)言中十進(jìn)制轉(zhuǎn)8421BCD碼是用的什么方法?第一時(shí)間我在想除了除10取余還能有什么辦法?過(guò)了一會(huì)兒,突然想起有沒(méi)有辦法從移位上解決這個(gè)問(wèn)題呢?于是乎就看到這個(gè)鏈接。然后就
    發(fā)表于 07-15 09:21

    8421BCD碼與二進(jìn)制原碼的相互轉(zhuǎn)換

    8421BCD碼與二進(jìn)制原碼的相互轉(zhuǎn)換。九層妖塔?起于壘土【藍(lán)橋杯】—{模板Template}—{Part7:DS18B20溫度傳感器}一、基本模板1、`頭文件`● 改編自國(guó)信長(zhǎng)天藍(lán)橋杯官方藍(lán)皮書(shū)
    發(fā)表于 01-17 07:13

    在FPGA中實(shí)現(xiàn)一種二進(jìn)制轉(zhuǎn)BCD碼的電路設(shè)計(jì)

    字邏輯設(shè)計(jì)課程中,我們已經(jīng)學(xué)過(guò)了BCD碼的相關(guān)知識(shí),它用4位二進(jìn)制數(shù)來(lái)表示1位十進(jìn)制數(shù)中的09,是二進(jìn)制
    發(fā)表于 07-12 16:41

    進(jìn)制BCD轉(zhuǎn)換資料

    6位二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼的的快速算法-51單片機(jī)2010-02-18 00:43在做而論道上篇博文中,回答了一個(gè)16位二
    發(fā)表于 08-19 17:42 ?96次下載

    單字節(jié)BCD碼小數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制小數(shù)

    單字節(jié)BCD碼小數(shù)轉(zhuǎn)換成單字節(jié)十六進(jìn)制小數(shù) 入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼數(shù)在累加器A中。出口信息:轉(zhuǎn)換后的單字節(jié)十六
    發(fā)表于 01-19 22:50 ?1695次閱讀

    常用編碼(BCD編碼、余3碼、格雷反射碼、奇偶校驗(yàn)碼)

    常用編碼1、BCD編碼    例 寫(xiě)出十進(jìn)數(shù)563.97D對(duì)應(yīng)的8421BCD碼。     563.97D=0101 0110
    發(fā)表于 09-19 11:23 ?9561次閱讀

    余3碼至8421BCD碼的轉(zhuǎn)換_8421BCD轉(zhuǎn)換成余3碼

    進(jìn)制編碼的十進(jìn)制數(shù),簡(jiǎn)稱BCD碼。這種方法是用4位二進(jìn)制碼的組合代表十
    的頭像 發(fā)表于 03-02 09:38 ?19.4w次閱讀
    余3碼至<b class='flag-5'>8421BCD</b>碼的<b class='flag-5'>轉(zhuǎn)換</b>_<b class='flag-5'>8421BCD</b>碼<b class='flag-5'>轉(zhuǎn)換成</b>余3碼

    8421BCD轉(zhuǎn)換成5421BCD

    5421BCD碼,是二—十進(jìn)制代碼(BCD碼)的一種;二—十進(jìn)制代碼(BCD碼)的一種;5421BCD
    的頭像 發(fā)表于 03-02 13:48 ?8w次閱讀
    <b class='flag-5'>8421BCD</b>碼<b class='flag-5'>轉(zhuǎn)換成</b>5421<b class='flag-5'>BCD</b>碼

    函數(shù)轉(zhuǎn)換BCD編碼進(jìn)制數(shù)為整型數(shù)

    BCD碼亦稱二進(jìn)碼十進(jìn)數(shù)或二-十進(jìn)制代碼。用4位二進(jìn)制數(shù)來(lái)表示1位十進(jìn)制數(shù)中的0~9這10個(gè)數(shù)碼
    的頭像 發(fā)表于 03-14 10:15 ?6583次閱讀