HEX_H EQU H'0030'
HEX_L EQU H'0031'
BCD_H EQU H'0032'
BCD_M EQU H'0033'
BCD_L EQU H'0034'
TEMP EQU H'0035'
COUNT EQU H'0036'
;-------------------------------------------------------------------------------
; 5位数 10进制 --> 4位数 16进制
; 入口参数:10进制 BCD_H BCD_M BCD_L
; 出口参数:16进制 HEX_H HEX_l
; 占用资源:W,STATUS,FSR,两重堆栈。
; 临时变量:COUNT,TEMP
; 计算公式:
; 先右移输入的16进制数,最低位移入C, 再右移输出的10进制数,把C移入最高位,
; 一直移动16次,把16位全部转移完。
; 在循环过程中校正数值,最后一次不要校正!
; 校正方法,检测每4位,是否>7,如果是-3到该4位上(或判断 ? 4bit - 3 > 4),否则不改变!
;-------------------------------------------------------------------------------
BCD5_HEX4:
; initial data
CLRF HEX_H
CLRF HEX_L
MOVLW D'16'
MOVWF COUNT
; loop part HEX_H HEX_l --> BCD_H BCD_M BCD_L
BCD5_HEX4_LOOP:
BCF STATUS,C
RRF BCD_H
RRF BCD_M
RRF BCD_L
RRF HEX_H
RRF HEX_L
DECFSZ COUNT,F
GOTO BCD5_HEX4_ADJUST_DAT
RETLW 0
BCD5_HEX4_ADJUST_DAT:
MOVLW BCD_H ; W <- BCD_L地址
MOVWF FSR ; FSR <- W (BCD_L的地址)
CALL ADJUST_BYTE_BCD_HEX ; 调整
MOVLW BCD_M
MOVWF FSR
CALL ADJUST_BYTE_BCD_HEX
MOVLW BCD_L
MOVWF FSR
CALL ADJUST_BYTE_BCD_HEX
GOTO BCD5_HEX4_LOOP
ADJUST_BYTE_BCD_HEX:
MOVLW H'03' ; W<-3
BTFSC INDF,3 ; ?数值 >7
SUBWF INDF,F ; 保存结果(F-W → F ,低四位减3 )
MOVLW H'30' ; W<-3
BTFSC INDF,7 ; ?数值 >7
SUBWF INDF,F ; 保存结果(F-W → F ,低四位减3 )
RETLW 0
;-------------------------------------------------------------------------------
; 4位数 16进制 --> 5位数 10进制
; 入口参数:16进制 HEX_H HEX_l
; 出口参数:10进制 BCD_H BCD_M BCD_L
; 占用资源:W,STATUS,FSR,两重堆栈。
; 临时变量:COUNT,TEMP
; 计算公式:
; 先左移输入的16进制数,最高位移入C, 再左移输出的10进制数,把C移入最低位,
; 一直移动16次,把16位全部转移完。
; 在循环过程中校正数值,最后一次不要校正!
; 校正方法,检测每4位,是否>4,如果是+3到该4位上(或判断 ? 4bit + 3 > 7),否则不改变!
;-------------------------------------------------------------------------------
HEX4_BCD5:
; initial data
CLRF BCD_H
CLRF BCD_M
CLRF BCD_L
MOVLW D'16'
MOVWF COUNT
BCF STATUS,C
; loop part BCD_H BCD_M BCD_L <- HEX_H HEX_l
HEX4_BCD5_LOOP:
RLF HEX_L
RLF HEX_H
RLF BCD_L
RLF BCD_M
RLF BCD_H
DECFSZ COUNT,F
GOTO HEX4_BCD5_ADJUST_DAT
RETLW 0
HEX4_BCD5_ADJUST_DAT:
MOVLW BCD_L ; W <- BCD_L地址
MOVWF FSR ; FSR <- W (BCD_L的地址)
CALL ADJUST_BYTE_HEX_BCD ; 调整
MOVLW BCD_M
MOVWF FSR
CALL ADJUST_BYTE_HEX_BCD
MOVLW BCD_H
MOVWF FSR
CALL ADJUST_BYTE_HEX_BCD
GOTO HEX4_BCD5_LOOP
ADJUST_BYTE_HEX_BCD:
MOVLW H'03' ; W<-3
ADDWF INDF,W ; F+W → W ,低四位加3
MOVWF TEMP
BTFSC TEMP,3 ; ? 结果 > 7
MOVWF INDF ; 保存结果(结果 > 7)
MOVLW H'30' ; W<-0X30
ADDWF INDF,W ; F+W → W ,高四位加3
MOVWF TEMP
BTFSC TEMP,7 ; ? 结果 > 7
MOVWF INDF ; 保存结果(结果 > 7)
RETLW 0