在程序中,我们会遇到BCD码加或减一并用数码管显示的情况,加一容易理解,用INC指令,然后DA A就可以得到正确的计算,
在减一的时候,你用DEC指令,再DA A,会出问题。问题是这样的,一个字节表示两位BCD码,DEC 指令只减一低位,减到0时,
不是返回9,而是5,并且不向高四位借位,所以高位数不变化。为什么?
如果把减法变成加法来写程序,减一就变成了加负一的补数,如果-1H的补数是99H的话,计算结果正确。那么,-1H的补数是
99H吗,为什么不是FFH?
如果每一次减2,那-2的补数是98H吗?
我是菜鸟一个,请高手帮我分析一下,不胜感谢!
此帖出自
小平头技术问答
正常情况下直接对十六进制数进行加减,显示之前转换成相应BCD码即可
附十六进制转BCD代码,该代码是我工作过程中一直在用的,希望能帮到你:
;******************************************************
;change: HEX to BCD code
; input: TempRam11,TempRam12,TempRam13
;output: TempRam1, TempRam2, TempRam3, TempRam4, TempRam5, TempRam6
;Temp : Buffer0, Buffer1 ,Buffer2,Buffer3 ,Buffer4
;******************************************************
_Ftob:
clrf TempRam1
clrf TempRam11
Sub10k:
clrf TempRam2
Sub10kLoop:
movlw 10h
subwf TempRam13,0
movwf Buffer2
movlw 27h
subwfc TempRam12,0
movwf Buffer1
movlw 0
subwfc TempRam11,0
btfss STATUS,C
goto Sub1k
movwf TempRam11
movff Buffer1,TempRam12
movff Buffer2,TempRam13
incf TempRam2,1
goto Sub10kLoop
Sub1k:
clrf TempRam3
Sub1kLoop:
movlw 0e8h
subwf TempRam13,0
movwf Buffer2
movlw 03h
subwfc TempRam12,0
btfss STATUS,C
goto Sub100
movwf TempRam12
movff Buffer2,TempRam13
incf TempRam3,1
goto Sub1kLoop
Sub100:
clrf TempRam4
Sub100Loop:
movlw 64h
subwf TempRam13,0
movwf Buffer2
movlw 0
subwfc TempRam12,0
btfss STATUS,C
goto Sub10
movwf TempRam12
movff Buffer2,TempRam13
incf TempRam4,1
goto Sub100Loop
Sub10:
clrf TempRam5
Sub10Loop:
movlw 10
subwf TempRam13,0
btfss STATUS,C
goto Sub1
movwf TempRam13
incf TempRam5,1
goto Sub10Loop
Sub1:
movff TempRam13,TempRam6
return
一周热门 更多>