📄 双字节定点数至5位bcd码转换程序.txt
字号:
;【校验举例1】 -23808(十进制)
;化为十六进制数:A300
;结果:023808(BCD),SIGN=80
; 5 码制转换程序设计
; 5.1 双字节定点数至5位BCD码转换程序
; 入口条件:ACCBHI、ACCBLO
; 出口条件:ACCCHI低半字节、ACCCLO、ACCDHI
;以下为双字节定点数至5位BCD码转换程序清单。
LIST p=16f877
INCLUDE p16f877.inc
ACCBLO EQU 23H ;存放被转换的双字节整数低8位
ACCBHI EQU 24H ;存放被转换的双字节整数高8位
ACCCLO EQU 26H ;存放5位BCD码
ACCCHI EQU 27H
ACCDLO EQU 28H
ACCDHI EQU 29H
TEMP EQU 2AH ;临时寄存器
SIGN EQU 2BH ;被转换数符号寄存器
COUNT EQU 2CH
ORG 0X0000
START GOTO MAIN
ORG 0X0100
;**********双字节数至BCD码子程序************
BtoBCD CLRF SIGN ;初始化符号寄存器
BTFSS ACCBHI,7 ;被转换数为负?
GOTO LOOP1 ;否,转BtoBCD
BSF SIGN,7 ;是,存符号
CALL NEG_B ;ACCB取补
LOOP1 BCF STATUS,C ;清进位位
MOVLW .16 ;移位计数器赋初值
MOVWF COUNT
CLRF ACCCHI ;初始化出口寄存器
CLRF ACCCLO
CLRF ACCDHI
LOOP16 RLF ACCBLO ;ACCB左移一位至出口寄存器
RLF ACCBHI
RLF ACCDHI
RLF ACCCLO
RLF ACCCHI
DECFSZ COUNT ;移位计数器=0?
GOTO ADJDEC ;否,转ADJDEC
RETLW 0 ;是,返回
NEG_B DECF ACCBLO
COMF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
OVER RETURN ;子程序返回
ADJDEC MOVLW ACCDHI ;指针指向ACCDHI
MOVWF FSR
CALL ADJBCD ;调用BCD码校正子程序
MOVLW ACCCLO ;指针指向ACCCLO
MOVWF FSR
CALL ADJBCD ;调用BCD码校正子程序
MOVLW ACCCHI ;指针指向ACCCHI
MOVWF FSR
CALL ADJBCD ;调用BCD码校正子程序
GOTO LOOP16 ;ACCB重新左移
;************* BCD码校正子程序**************
ADJBCD MOVLW 0X03 ;LSD+3>7?
ADDWF INDF,0
MOVWF TEMP
BTFSC TEMP,3
MOVWF INDF ;是,LSD=LSD+3
MOVLW 0X30 ;否,MSD+3>7?
ADDWF INDF,0
MOVWF TEMP
BTFSC TEMP,7
MOVWF INDF ;是,MSD=MSD+3
RETLW 0 ;返回
MAIN MOVLW 0X00 ;双字节整数送ACCB
MOVWF ACCBLO
MOVLW 0XA3
MOVWF ACCBHI
CALL BtoBCD ;调子程序,将二进制数转换成BCD码
GOTO $
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -