;本程序实现双字节二进制数转化为3字节压缩BCD码。
;入口参数:原二进制数在SOUH:SOU中。
;出口参数:结果在RLT:SOUH:SOU中。
;占用资源:W,STATUS,FSR,023H,024H,025H,026H,028H,029,02AH,两重堆栈。
IFNDEF DBTBCD1
#DEFINE DBTBCD1
DBTBCD MOVF SOU,W
MOVWF TEMP2
MOVF SOUH,W
MOVWF TEMP3
CLRF SOU
CLRF SOUH
CLRF RLT
BCF STATUS,C
;------------------------------------------------
; TEMP3 TEMP2 (HEX) -> RLT SOUH SOU (BCD)
;
;------------------------------------------------
MOVLW .16 ;W <- 16
MOVWF CNT ;CNT <- W(16)
LOOPC1 RLF TEMP2,F ;左移1bit ; RLT SOUH SOU <- TEMP3 TEMP2 <- 0
RLF TEMP3,F
RLF SOU,F
RLF SOUH,F
RLF RLT,F
DECFSZ CNT,F
GOTO ADJDEC1
RETLW 0 ;整个子程序结束
ADJDEC1 MOVLW SOU ; W <- 地址SOU
MOVWF FSR ; FSR <- W (SOU的地址)
CALL ADJBCD1 ;调整RLT
MOVLW SOUH
MOVWF FSR
CALL ADJBCD1 ;调整RLTH
MOVLW RLT
MOVWF FSR
CALL ADJBCD1 ;调整TEMP1
GOTO LOOPC1
;********************调整BCD********************
ADJBCD1 MOVLW 03H ; W <- 03H
ADDWF INDF,W ;低四位加3 F+W→W = SOU
MOVWF TEMP1 ;暂存
BTFSC TEMP1,3 ;结果大于7,
MOVWF INDF ;则存起来
MOVLW 30H
ADDWF INDF,W ;高四位加3
MOVWF TEMP1
BTFSC TEMP1,7 ;结果大于7,
MOVWF INDF ;则存起来
RETLW 0
ENDIF
PIC 没有DA指令,是通过ADJBCD1这段程序处理:
低高位依次加3,然后判断结果是否大于7,如果大于7就保存加后的值没,否则就不要!
这样做的算法依据是什么? |