英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 一些应用程序/算法/子程!!( [打印本页]

作者: winnie    时间: 2009-3-8 15:54
标题: 一些应用程序/算法/子程!!(
双字节定点数至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





欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2