把二進(jìn)制數(shù)轉(zhuǎn)換成 BCD 碼,是很常見的,小編以前也發(fā)表過這樣的程序。
但是,過去都是用寄存器,如果要求用片內(nèi)RAM單元,就少見了。
當(dāng)然,也可以把片內(nèi)RAM單元的數(shù)據(jù),先傳送到寄存器,再利用以前寫的程序進(jìn)行轉(zhuǎn)換。轉(zhuǎn)換完畢后,再把結(jié)果傳送到片內(nèi)RAM單元。
如果直接用片內(nèi)RAM單元來進(jìn)行轉(zhuǎn)換呢?
這也是可以的,只是速度會(huì)慢一些。
以前,從來沒有見過有誰(shuí)編寫出來直接使用片內(nèi)RAM轉(zhuǎn)換的程序。
沒有人編寫,大概就是速度的原因吧。
小編現(xiàn)在就編寫一個(gè),大家看看,和使用寄存器相比,速度有多少降低。
下面就是這樣的題目。
編寫一段程序,將存放于片內(nèi)RAM 40H、41H單元中的 16 位二進(jìn)制數(shù)轉(zhuǎn)化為壓縮BCD碼存放到 38H~3AH 中。
小編的回答如下:
;
TO_BCD:
MOV R2, #16 ;轉(zhuǎn)換16位
CLR A
MOV 38H, A ;先清零
MOV 39H, A
MOV 3AH, A
LOOP:
MOV A, 41H ;取被轉(zhuǎn)換二進(jìn)制數(shù)
RLC A
MOV 41H, A
MOV A, 40H
RLC A ;最高位移動(dòng)到C
MOV 40H, A
;---------------------
MOV A, 3AH ;取數(shù)
DA A ;轉(zhuǎn)為BCD碼
MOV 3AH, A ;保存
MOV A, 39H
ADDC A, 39H
DA A
MOV 39H, A
MOV A, 38H
ADDC A, 38H
MOV 38H, A
DJNZ R2, LOOP ;循環(huán)16次
RET
本程序已經(jīng)經(jīng)過試驗(yàn),保證正確。
===============================
下面,是另外一個(gè)問題,問的就是相反轉(zhuǎn)換的問題。
這樣的程序,小編以前就編寫出來,并且使用過很多年了。
只是在網(wǎng)上、書上,從來也沒有見過這樣的轉(zhuǎn)換程序。
----
編寫一段程序,將存放于片內(nèi) RAM 30H~32H 單元中的5位壓縮BCD數(shù)(小于65536)轉(zhuǎn)化為二進(jìn)制數(shù)存放到 40H、41H 單元中。
小編的回答如下:
TO_BIN:
MOV A, 32H
SWAP A
ANL A, #0FH ;得到十位數(shù)字
MOV B, #10
MUL AB
MOV B, 32H
ANL B, #0FH ;得到個(gè)位數(shù)字
ADD A, B
MOV 41H, A ;(41H)=十位*10+個(gè)位
;---------------------
MOV A, 31H
SWAP A
ANL A, #0FH ;得到千位數(shù)字
MOV B, #10
MUL AB
MOV B, 31H
ANL B, #0FH ;得到百位數(shù)字
ADD A, B ;(A)=千位*10+百位
MOV B, #100
MUL AB ;(B A)=千位*1000+百位*100
;---------------------
ADD A, 41H
MOV 41H, A
CLR A
ADDC A, B
MOV 40H, A ;(40H 41H)=千位*1000+百位*100+十位*10+個(gè)位
;---------------------
MOV A, #10H ;2710H=1萬
MOV B, 30H ;萬位
MUL AB
MOV R2, B
MOV R3, A
MOV A, #27H
MOV B, 30H ;萬位
MUL AB
ADD A, R2
MOV R2, A ;R2 R3=萬位*10000
;---------------------
MOV A, R3
ADD A, 41H
MOV 41H, A
MOV A, R2
ADDC A, 40H
MOV 40H, A
RET
本程序已經(jīng)通過了試驗(yàn)驗(yàn)證,保證正確。
后記:
針對(duì)這個(gè)問題,提問者采納了一個(gè)錯(cuò)誤的程序。
這個(gè)錯(cuò)誤程序,不僅有錯(cuò),長(zhǎng)度還差不多達(dá)到本程序的兩倍。
小編編寫的程序,不僅正確,基本上就是最精簡(jiǎn)的,大家可以比較看一下。
其實(shí),小編還有更為精簡(jiǎn)的,僅僅才 35 行指令,可以說是世上最精練轉(zhuǎn)換程序。只是技巧太高,不易理解,就不公布了。
用 C 語(yǔ)言編程,不太合乎題目的要求。
但是,也有人編寫的很好,收錄在下面:
viod BcdHex(viod)
{
unsigned short int *OutAdd, *SrcAdd, x;
SrcAdd = 0x30;
OutAdd = 0x40;
*OutAdd = 0; x = 1;
*OutAdd += (SrcAdd[0] & 0x0F) * x; x *= 10;
*OutAdd += (SrcAdd[0] 》》 4) * x; x *= 10;
*OutAdd += (SrcAdd[1] & 0x0F) * x; x *= 10;
*OutAdd += (SrcAdd[1] 》》 4) * x; x *= 10;
*OutAdd += (SrcAdd[2] & 0x0F) * x;
}
評(píng)論
查看更多