实用子程序.rar本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订
源代码在线查看: 字节浮点数转换为定点整数.txt
;【校验举例1】 19531(十进制)
;化为十六进制数:4C4B0FH
;结果:4C4BH
;4.2 3字节浮点数转换为定点整数
;子程序的转换结果将采用补码表示。其转换数值范围:-32768~32767,
;入口条件和出口条件如下:
;入口条件:ACCBHI、ACCBLO、EXPB
;出口条件:ACCBHI、ACCBLO
; 以下为子程序的清单。由于程序所需调用的子程序和所需通用寄存器
;单元地址和定点数转换为浮点数子程序相同,在此省略。使用时,将前面介绍
;的子程序拷入此处即可。
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 ;被转换数符号寄存器
EXPB equ 2ch
NEG_B EQU 2DH
ORG 0X0000
MAIN MOVLW 0X4B ;被转换数4C4BH送ACCB
MOVWF ACCBLO
MOVLW 0X4C
MOVWF ACCBHI
MOVLW 0X0F
MOVWF EXPB
CALL FtoD ;调用定点数至浮点数转换子程序
GOTO $
FtoD CLRF SIGN ;清结果符号寄存器
MOVF ACCBHI,0
BTFSS ACCBHI,7 ;被转换数是否为负?
GOTO D1
BSF SIGN,7 ;是,SIGN.7置1
CALL NEG_B ;被转换数取补
D1 BTFSS EXPB,7 ;被转换数为正,再判阶码为负否?
GOTO D2
CLRF ACCBHI ;为负,被转换数小于1,无法用定点数表示
CLRF ACCBLO
RETLW 0
D2 MOVLW .16 ;被转换数阶码减16(十进制数)
SUBWF EXPB,0
BTFSS STATUS,C ;阶码小于16?
GOTO D3
MOVLW 0XFF ;阶码大于等于16,置ACCB为最大,返回
MOVWF ACCBHI
MOVWF ACCBLO
RETLW 01
D3 CALL FTOW3 ;调用子程序将浮点数转换为定点数
BTFSC SIGN,7 ;定点数为负?
CALL NEG_B ;是,取补
RETLW 0 ;否,返回
;****************************************
FTOW3 MOVLW .15 ;EXPB=15(十进制数)?
SUBWF EXPB,0
BTFSC STATUS,Z
RETLW 0 ;是,返回
BCF STATUS,C ;否,ACCB继续右移,EXPB加1
RRF ACCBHI
RRF ACCBLO
INCF EXPB
GOTO FTOW3 ;重新判断EXPB=15?
END