|
发表于 2007-7-14 17:04:31
|
显示全部楼层
我做的一般不转换为BCD码而是把这个十六进制转换为几个单独的数,一个百位,一个十位,一个个位,然后查段码去显示 %$^)& 用减法就行,浪费一点点临时寄存器而已,比除法,求模什么的空间时间都节约多了.
1: >=100? Y -100 百位+1 循环1
N 下一步
2: >=10? Y -10 十位+1 循环2
N 结束,余数为个位
;------------------------------------
;BIN_TO_BCD_16 双字节十六进制数转换成BCD码
;待转换的数放在TEMP1:TEMP2中
;BCD码的个位放在TEMP1中
;BCD码的十位放在TEMP2中
;BCD码的百位放在TEMP3中
;BCD码的千位放在TEMP4中
;万位舍弃
;1000 --> 0x03 E8
;BIN_TO_BCD 单字节十六进制数转换成3位BCD码
;待转换的数放在TEMP中
;BCD码的个位放在TEMP1中
;BCD码的十位放在TEMP2中
;BCD码的百位放在TEMP3中
BIN_TO_BCD:
MOV TEMP1,TEMP
CLR TEMP2
CLR TEMP3
RJMP BIN_BW_NEXT
;--------------------------------------
BIN_TO_BCD_16:
CLR TEMP4
CLR TEMP3
BIN_WW_NEXT:
CPI TEMP1, low(10000) ;待转换的数大于等于10000(0x2710)?
LDI TEMP, high(10000)
CPC TEMP2, TEMP
BRCS BIN_QW_NEXT
SUBI TEMP1, 0X10
SBCI TEMP2, 0X27
RJMP BIN_WW_NEXT
BIN_QW_NEXT:
CPI TEMP1, low(1000) ;待转换的数大于等于1000(0x03E8)?
LDI TEMP, high(1000)
CPC TEMP2, TEMP
BRCS BIN_BW_NEXT
SUBI TEMP1, 0XE8
SBCI TEMP2, 0X03
INC TEMP4
RJMP BIN_QW_NEXT
BIN_BW_NEXT:
CPI TEMP1, 100 ;待转换的数大于等于100(0x0064)?
CLR TEMP
CPC TEMP2, TEMP
BRCS BIN_GW_NEXT
SUBI TEMP1, 100
SBCI TEMP2, 0
INC TEMP3
RJMP BIN_BW_NEXT
BIN_GW_NEXT:
MOV TEMP, TEMP1 ;待转换的数大于等于10?
SUBI TEMP, 10
BRCS BIN_RET
MOV TEMP1, TEMP
INC TEMP2
RJMP BIN_GW_NEXT
BIN_RET:
RET
;------------------------------------
;只适合某些情况哦,需要用到十进制数的请绕道...
-----此内容被dicat于2007-07-14,17:07:04编辑过 |
|