winnie 发表于 2009-3-8 15:54:12

一些应用程序/算法/子程!!(

双字节定点数至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]
查看完整版本: 一些应用程序/算法/子程!!(