EM78系列單片機的數(shù)值轉換子程序簡介
mov 0x20,a
mov 0x21,a
mov 0x22,a
mov a,@0x0 ;被除數(shù)擴充1字節(jié)并清0
mov 0x23,a
mov a,@0x12 ;除數(shù)賦值
mov 0x30,a
mov 0x31,a
mov a,@0x10 ;循環(huán)次數(shù)為16
mov 0x32,a
again: call rt_sub ;調移位除法子程
djz 0x32 ;16次循環(huán)完成則結束
jmp again ;未完成則繼續(xù)
self: jmp self
rt_sub:
bc 0x03,0 ;c標志清0
rlc 0x20 ;被除數(shù)左移1位
rlc 0x21
rlc 0x22
rlc 0x23
jbc 0x03,0
jmp rt3 ;c標志為1則直接相減
mov a,0x23 ;c標志為0則先比較大小
mov 0x25,a
mov a,0x22
mov 0x24,a
mov a,0x31 ;先比較高位
sub 0x25,a
jbc 0x03,2
jmp rt1 ;高位相等跳rt1比較低位
jmp rt2 ;高位不等跳rt2
rt1: mov a,0x30 ;比較低位
sub 0x24,a
jbc 0x03,2
jmp rt3 ;低位也相等則跳rt3,相減,上1
rt2: jbs 0x03,0
ret ;減數(shù)大則返回,減數(shù)小則相減,上1
rt3: bs 0x20,0 ;上1
call sub_2b ;調2字節(jié)減法子程
ret
sub_2b:
mov a,0x31 ;高字節(jié)相減
sub 0x23,a
mov a,0x30 ;低字節(jié)相減
sub 0x22,a
jbc 0x03,2
ret ;低字節(jié)相等,無借位,返回
jbc 0x03,0
ret ;無借位,返回
dec 0x23 ;低字節(jié)相減有借位,高字節(jié)結果減1
ret
eop
六 BCD數(shù)轉換為二進制數(shù)
兩字節(jié)壓縮BCD碼轉換為兩字節(jié)二進制數(shù)。算法如下:
BCD碼abcd=1000a+100b+10c+d=10{10[10a+b]+c}+d,將各位BCD碼分離出之后,即可根據(jù)此式轉換為二進制數(shù)。涉及到乘法運算和多字節(jié)加法運算。
0X20,0X21中為BCD碼,0X21高4位為最高位。轉換結果放在0X30,0X31中。
main: mov a,@0x79
mov 0x20,a
mov a,@0x54
mov 0x21,a ;賦值
mov a,0x20
and a,@0x0f
mov 0x22,a
swapa 0x20
and a,@0x0f
mov 0x23,a
mov a,0x21
and a,@0x0f
mov 0x24,a
swapa 0x21
and a,@0x0f
mov 0x25,a ;BCD碼展開后存于0X22,0X23,0X24,0X25
mov a,0x25, ;0X25為最高位
mov 0x30,a
mov a,@0x0 ;多字節(jié)加法高位為0
mov 0x31,a
mov a,0x24
mov 0x32,a
call a_b ;調子程
mov a,0x23
mov 0x32,a
call a_b
mov a,0x22
mov 0x32,a
call a_b
self: jmp self
a_b:
mov a,@0x0 ;0X34,0X35存儲中間結果
mov 0x34,a
mov 0x35,a
mov a,@0x0a ;實現(xiàn)乘10
mov 0x33,a
a1: mov a,0x35 ;兩字節(jié)二進制加法,在本例中高字節(jié)肯定無進位
add a,0x31
mov 0x35,a
mov a,0x34
add a,0x30
mov 0x34,a
jbc 0x03,0
inc 0x35
djz 0x33
jmp a1
mov a,0x32
add 0x34,a
評論