|
ACALL _BCD_ADJ ; 壓縮BCD碼的十進(jìn)制調(diào)整 MOV bcdData, A ; 存回 DJNZ R2, H_B0 ; 繼續(xù)下一輪循環(huán)
; 目標(biāo)數(shù)據(jù)再左移一位,將原數(shù)據(jù)的最后一位放入,這樣總共進(jìn)行了16次循環(huán)移位 MOV A, R6 RLC A MOV A, bcdData+2 RLC A MOV bcdData+2, A MOV A, bcdData+1 RLC A MOV bcdData+1, A MOV A, bcdData RLC A MOV bcdData, A RET
;************************************************************************* ; 壓縮BCD碼的十進(jìn)制調(diào)整,基本思路:逢十進(jìn)一,在這里因?yàn)檫保留著最后一次左 ; 移, 所以進(jìn)位判別的0AH(0A0H)變成相對(duì)右移了一位的05H(050H), 而強(qiáng)迫進(jìn)行進(jìn)位 ; 的方法是加上一個(gè)數(shù)字3(左移一位后就是6)。程序保護(hù)PSW ; 輸入返回均使用Acc累加器 ;************************************************************************* RSEG ?PR?_BCD_ADJ?HEX_BCD
_BCD_ADJ: PUSH PSW PUSH ACC CJNE A, #50H, $+3 ; 高4位。做一個(gè)比較產(chǎn)生狀態(tài)標(biāo)志 JC B1 ; 如果小于#50H, 不用進(jìn)位處理 POP ACC ; 取原數(shù)據(jù)作修改 ADD A, #30H ; 加上#30h,留待下一輪左移時(shí)產(chǎn)生進(jìn)位 PUSH ACC ; 存回原數(shù)據(jù) B1: ANL A, #0FH ; 僅考慮低4位 CJNE A, #5, $+3 ; 做一個(gè)比較產(chǎn)生狀態(tài)標(biāo)志 JC B2 ; 如果小于#5H, 不用進(jìn)位處理 POP ACC ; 取原數(shù)據(jù)作修改 ADD A, #3 ; 加上#3h,留待下一輪左移時(shí)產(chǎn)生進(jìn)位 PUSH ACC ; 存回原數(shù)據(jù) B2: POP ACC ; 恢復(fù)現(xiàn)場(chǎng) POP PSW RET end ///////////////////////////////////////////////// [nobody]©的快速算法,速度更快。 ////////////////////////////////////////////////////// ?PR?_HEX_BCD?HEX_BCD SEGMENT CODE PUBLIC _HEX_BCD RSEG ?PR?_HEX_BCD?HEX_BCD _HEX_BCD: CLR A ;BCD碼初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù) HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R3 ;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2 ADDC A,R3 DA A ;十進(jìn)制調(diào)整 MOV R3,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R5 ADDC A,R5 MOV R5,A ;雙字節(jié)十六進(jìn)制數(shù)的萬位數(shù)不超過6,不用調(diào)整 DJNZ R2,HB3 ;處理完16bit mov a,r3 mov r7,a mov a,r4 mov r6,a mov r4,#0 RET end
調(diào)用方法: extern unsigned int hex_bcd(unsigned int iHex); /*聲明外部函數(shù)*/ 或 extern unsigned long hex_bcd(unsigned int iHex); /*聲明外部函數(shù)*/
|