一些应用程序/算法/子程!!(
双字节定点数至5位BCD码转换程序入口条件:ACCBHI、ACCBLO
出口条件:ACCCHI低半字节、ACCCLO、ACCDHI
以下为双字节定点数至5位BCD码转换程序清单。
LIST p=16f877
INCLUDE p16f877.inc
ACCBLO EQU 23 ;存放被转换的双字节整数低8位
ACCBHI EQU 24 ;存放被转换的双字节整数高8位
ACCCLO EQU 26 ;存放5位BCD码
ACCCHI EQU 27
ACCDLO EQU 28
ACCDHI EQU 29
TEMP EQU 2A ;临时寄存器
SIGN EQU 2B ;被转换数符号寄存器
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 ;是,返回
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 00X03 ;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 ;返回
【校验举例1】 -23808(十进制)
化为十六进制数:A300
结果:023808(BCD),SIGN=80
【校验举例2】 12306(十进制)
化为十六进制数: 3012
结果:012306(BCD),SIGN=00
页:
[1]