|
4 定点数与浮点数转换程序 4.1 定点数转换成浮点数 本子程序的功能是将双字节定点整数(十六进制)转换为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
4.2 3字节浮点数转换为定点整数 子程序的转换结果将采用补码表示。其转换数值范围:-32768~32767,入口条件和出口条件如下: 入口条件:ACCBHI、ACCBLO、EXPB 出口条件:ACCBHI、ACCBLO 以下为子程序的清单。由于程序所需调用的子程序和所需通用寄存器单元地址和定点数转换为浮点数子程序相同,在此省略。使用时,将前面介绍的子程序拷入此处即可。 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? 【校验举例1】 19531(十进制) 化为十六进制数:4C4B0FH 结果:4C4BH 【校验举例2】 2622(十进制) 化为十六进制数:51F00CH 结果:0A3EH 【例程】 MAIN MOVLW 0X4B ;被转换数4C4BH送ACCB MOVWF ACCBLO MOVLW 0X4C MOVWF ACCBHI MOVLW 0X0F MOVWF EXPB CALL FtoD ;调用定点数至浮点数转换子程序 END |