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