十年專注單片機方案開發的方案公司英銳恩,分享定點數轉浮點數的程序。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
定點數轉換成浮點數
本子程序的功能是將雙字節定點整數(十六進制)轉換為3字節浮點數,其轉換數值范圍:-32768~32767,入口條件和出口條件如下:
入口條件:ACCBHI、ACCBLO
出口條件:ACCBHI、ACCBLO、EXPB
以下為定點整數轉換成浮點數的程序清單。
LIST p=16f877
INCLUDE p16f877.inc
ACCBLO EQU 23 ;存放定點整數和轉換后浮點數的尾數
ACCBHI EQU 24
EXPB EQU 25 ;存放轉換后浮點數的階碼
ACCCLO EQU 26 ;臨時寄存器
ACCCHI EQU 27 ;臨時寄存器
ACCDLO EQU 28 ;臨時寄存器
ACCDHI EQU 29 ;臨時寄存器
SIGN EQU 2B ;存放被轉換數的符號
ORG 0X0000
START GOTO MAIN
ORG 0X0100
;*********雙字節定點整數到浮點數轉換子程序***********
DtoF CLRF SIGN ;根據被轉換數確定結果的符號,對負數取補
BTFSS ACCBHI,7
GOTO INTF1
BSF SIGN,7
CALL NEG_B
INTF1 MOVLW .15 ;初始化EXPB
MOVWF EXPB
CLRF ACCCHI
CLRF ACCCLO
CALL F_norm ;對ACCB進行規格化
BTFSS SIGN,7 ;結果為負?
GOTO DtoF1
CALL NEG_B ;是,求補
DtoF1 RETURN
;**************浮點數規格化子程序**************
F_norm MOVF ACCBHI ;ACCB=0?
BTFSS STATUS,Z
GOTO C_norm
MOVF ACCBLO
BTFSC STATUS,Z
RETLW 0 ;是,不需規格化,返回
C_norm BTFSC ACCBHI,7 ;否。ACCB為負?
GOTO C_norm2
C_norm1 BTFSC ACCBHI,6 ;為正。規格化完畢?
RETLW 0 ;ACCBHI.6=1,規格化結束
CALL SHFTSL ;否。ACCB左移
DECF EXPB ;EXPB減1
GOTO C_norm1 ;重新判斷規格化完畢否?
C_norm2 BTFSS ACCBHI,6 ;ACCB為負。規格化完畢否?
RETLW 0 ;ACCBHI.6=0,規格化結束
BCF STATUS,C
CALL SHFTSL ;否,ACCB左移
BSF ACCBHI,7 ;加符號
DECF EXPB ;EXPB減1
GOTO C_norm2 ;重新判斷規格化完畢否?
SHFTSL BCF STATUS ,C ;ACCB左移子程序
RLF ACCCLO
RLF ACCCHI
RLF ACCBLO
RLF ACCBHI
RETLW 0
【校驗舉例1】 19531(十進制)
化為十六進制數:4C4BH
結果:4C4B0FH
【校驗舉例2】 2622(十進制)
化為十六進制數: 0A3EH
結果:51F00CH
【例程】
MAIN MOVLW 0X4B ;被轉換數4C4BH送ACCB
MOVWF ACCBLO
MOVLW 0X4C
MOVWF ACCBHI
CALL DtoF ;調用定點數至浮點數轉換子程序
END