BCD码件减一的问题

2019-03-24 18:43发布

在程序中,我们会遇到BCD码加或减一并用数码管显示的情况,加一容易理解,用INC指令,然后DA A就可以得到正确的计算,
在减一的时候,你用DEC指令,再DA A,会出问题。问题是这样的,一个字节表示两位BCD码,DEC 指令只减一低位,减到0时,
不是返回9,而是5,并且不向高四位借位,所以高位数不变化。为什么?
  如果把减法变成加法来写程序,减一就变成了加负一的补数,如果-1H的补数是99H的话,计算结果正确。那么,-1H的补数是
99H吗,为什么不是FFH?
  如果每一次减2,那-2的补数是98H吗?
  我是菜鸟一个,请高手帮我分析一下,不胜感谢! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
goalpeak
1楼-- · 2019-03-25 02:52
一般不建议对BCD码直接进行加减运算
正常情况下直接对十六进制数进行加减,显示之前转换成相应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
Li_Lei
2楼-- · 2019-03-25 04:26
这是因为计算机用二进制,人类熟悉十进制,bcd码是二进制模拟十进制实际上什么进制都不是
ahshmj
3楼-- · 2019-03-25 05:01
如果你用INC在BCD码的9上面再加1会正确吗?
yye110
4楼-- · 2019-03-25 05:56
感谢大家的帮助,你的程序很好用!谢谢你!
yye110
5楼-- · 2019-03-25 10:21
会正确,有进位。谢谢你的回复!

一周热门 更多>