电子工程师的网站
首 页 |  新闻资讯 | 最新产品 | 技术参数 | 设计应用 | 电路图
技术资料
芯片资料 | 技术论坛
  现在位置: 首页 > 技术资料 > 单片机 > 详细信息
单片机:浮点数保存代码
来源:   时间: 2007-11-27 3:09:15    

程序说明:浮点数变为压缩BCD码,保存在以数组中
        第1字节的位7:0正,1负.位6:0(位5--0代表小数点前的位数),1(位5--0代表小数
点后0的位数)
      2--4字节为压缩BCD码,有效位为7位,3个半字节,最后半个字节请使用者自行放

       程序占用资源PSW,A,B,DPTR,R0--R7,SP深度6,RAM 5个放数据
        keil 兼容,调用KEIL 的FPMUL子程序。

C程序:
extern float ftod(float i);

unsigned char cyz[5];

main(){
     float i=1234.567;
     ftod(i);
while(1); 
      }

汇编程序:

PUBLIC   _FTOD          ;程序段
FTODP    SEGMENT CODE   ;入口地址
RSEG     FTODP          ;程序段

EXTRN     CODE  (?C?FPMUL)
EXTRN    DATA  (CYZ)
_FTOD:              ;参数传递在R4--R7中,浮点数IEEE标准seeeeeee emmmmmmm 
mmmmmmmm mmmmmmmm
FTOD:
         MOV     A,R4       ;保存数符
         RLC     A               
         CLR     A              
         RRC     A              
         MOV     CYZ,A
         MOV     A,R4       ;取绝对值
         CLR     ACC.7
         MOV     R4,A
         ORL     A,R5
     JNZ     FCMP_1E10
         MOV     CYZ,#0      ;数值为0
         MOV     CYZ+1,#0
         MOV     CYZ+2,#0
         MOV     CYZ+3,#0
         MOV     CYZ+4,#0
     RET
FCMP_1E10:  
         MOV     DPTR,#YUANZHENG_DE10
         LCALL   FR0DPTR               ;数值装入R0--R3
         LCALL   FCMP
         JNC     FCMP_1E0              ;数值小于等于1e10,跳
         MOV     DPTR,#YUANZHENG_DE_10 ;数值大于1e10,X=X*(1e-10)
         LCALL   FR0DPTR               ;数值1e-10装入R0--R3
         LCALL   ?C?FPMUL              ;keil的浮点数乘法
         MOV     A,CYZ
         CLR     ACC.6
         ADD     A,#10
         MOV     CYZ,A
         JMP     FCMP_1E10
FCMP_1E0:
         MOV     DPTR,#YUANZHENG_DE0
         LCALL   FR0DPTR               ;数值装入R0--R3
         LCALL   FCMP
         JZ      FCMP_1E0_10           ;数值等于1e0,跳
         JC      FCMP_1E0_10           ;数值大于1e0,跳
         MOV     DPTR,#YUANZHENG_DE10  ;数值小于1e0,X=X*(1e10)
         LCALL   FR0DPTR               ;数值1e10装入R0--R3
         LCALL   ?C?FPMUL              ;keil的浮点数乘法
         MOV     A,CYZ
         SETB    ACC.6
         ADD     A,#10
         MOV     CYZ,A
         JMP     FCMP_1E10
FCMP_1E0_10:                           ;查表,找到一个比待转换浮点数大的整数幂.
         MOV     DPTR,#YUANZHENG_DE0
FCMP_FIND:                  
         LCALL   FR0DPTR
         LCALL   FCMP
         JNZ     FCMP_UNEQU
         MOV     CYZ+1,#10H            ;正好是表格中的数,尾数为0.10000000
         MOV     CYZ+2,#00H
         MOV     CYZ+3,#00H
         MOV     CYZ+4,#00H
     LCALL   CYZDEAL_JIE 
         RET    
FCMP_UNEQU:
         JC      FCMP_NEXT            ;待转换浮点数大,跳转
         MOV     CYZ+1,DPH            ;a,b,c    a=b-(c-b)
         MOV     CYZ+2,DPL
         MOV     DPTR,#YUANZHENG_DE0
         CLR     C
         MOV     A,CYZ+2
         SUBB    A,DPL
         MOV     CYZ+2,A
         MOV     A,CYZ+1
         SUBB    A,DPH
         MOV     CYZ+1,A
         CLR     C
         MOV     A,DPL
         SUBB    A,CYZ+2
         MOV     DPL,A
         MOV     A,DPH
         SUBB    A,CYZ+1
         MOV     DPH,A
         INC     DPTR
         INC     DPTR
         INC     DPTR
         INC     DPTR
         LCALL   FR0DPTR               ;数值1e?装入R0--R3
         LCALL   ?C?FPMUL              ;keil的浮点数乘法
         JMP     YUANZHENG_FBCD        ;得到一个二进制浮点数的纯小数。
FCMP_NEXT:
         MOV     A,CYZ                 ;幂值调整
         JB      ACC.6,FCMP_NEXT1
         INC     CYZ
         JMP     FCMP_FIND
FCMP_NEXT1:
         DEC     CYZ
         JMP     FCMP_FIND

YUANZHENG_FBCD:
         MOV     A,R5       ;恢复阶码
         RLC     A
         MOV     A,R4
         RLC     A
         CLR     C
         SUBB    A,#126
         MOV     R4,A
         MOV     A,R5       ;恢复尾数
         SETB    ACC.7
         MOV     R5,A
CYZFTB0:
         MOV     A,R4       ;取阶码
         JZ      CYZFTB1    ;为零吗?
     CLR    C
     LCALL    RR1         ;右规。
     SJMP    CYZFTB0
CYZFTB1:
         ACALL   HB2      ;转换尾数的十分位和百分位
         MOV     CYZ+1,A
         ACALL   HB2      ;转换尾数的千分位和万分位
         MOV     CYZ+2,A
         ACALL   HB2      ;转换尾数的十万分位和百万分位
         MOV     CYZ+3,A
         ACALL   HB2      ;转换尾数的千万分位和亿分位
         MOV     CYZ+4,A

      MOV    A,R5      ;四舍五入。
     RLC    A
     MOV     A,#05H   ;此处后半字节(BCD码的第8位)的值不保证
     ADDC    A,CYZ+4
     DA    A
     MOV    CYZ+4,A
     CLR    A
     ADDC    A,CYZ+3
     DA    A
     MOV    CYZ+3,A
     CLR    A
     ADDC    A,CYZ+2
     DA    A
     MOV    CYZ+2,A
     CLR    A
     ADDC    A,CYZ+1
     DA    A
     MOV    CYZ+1,A
     JNC    CYZFTB2
     MOV    CYZ+1,#10H
     LCALL   CYZDEAL_JIE        ;十进制浮点数的阶码。
CYZFTB2:   
         RET
CYZDEAL_JIE:
         MOV     A,CYZ              ;幂值调整
         JNB      ACC.6,CYZDEAL_JIE1
         DEC     CYZ
         RET
CYZDEAL_JIE1:
         INC     CYZ
         RET

RR1:     MOV    A,R5       ;第一操作数右规一次
     RRC    A       ;尾数缩小一半
     MOV    R5,A
     MOV    A,R6
     RRC    A
     MOV    R6,A
     MOV    A,R7
      RRC    A
     MOV    R7,A
     INC    R4         ;阶码加一
     CLR    OV         ;清溢出标志
     CJNE    R4,#80H,RR1E ;阶码上溢否?
     MOV    R4,#7FH         ;阶码溢出
     SETB    OV
RR1E:     RET

HB2:   
         MOV    A,R7    ;尾数扩大100倍。
     MOV    B,#100
     MUL    AB
     MOV    R7,A
     MOV    A,B
     XCH    A,R6
     MOV    B,#100
     MUL    AB
     ADD    A,R6
     MOV    R6,A
     MOV    A,B
     XCH    A,R5
     MOV    B,#100
     MUL    AB
     ADD    A,R5
     MOV    R5,A
     JNC    HB21
     INC    B
HB21:     MOV    A,B    ;将整数部分转换成BCD码。
     MOV    B,#10
     DIV    AB
     SWAP    A
     ORL    A,B
     RET
FR0DPTR:
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R0,A
         INC     DPTR
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R1,A
         INC     DPTR
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R2,A
         INC     DPTR
         CLR     A
         MOVC    A,@A+DPTR
         MOV     R3,A
         INC     DPTR
         RET
FCMP:                    ;比较两个正的浮点数
         CLR     C
         MOV     A,R0
         SUBB    A,R4
         JNZ     FCMP1
         MOV     A,R1
         SUBB    A,R5
         JNZ     FCMP1
         MOV     A,R2
         SUBB    A,R6
         JNZ     FCMP1
         MOV     A,R3
         SUBB    A,R7
FCMP1:
         RET

YUANZHENG_DE_10:
         DB 02EH,0DBH,0E6H,0FFH ;1E-10
         DB 030H,089H,070H,05FH ;1E-9
         DB 032H,02BH,0CCH,077H ;1E-8
         DB 033H,0D6H,0BFH,095H ;1E-7
         DB 035H,086H,037H,0BDH ;1E-6
         DB 037H,027H,0C5H,0ACH ;1E-5
         DB 038H,0D1H,0B7H,017H ;1E-4
         DB 03AH,083H,012H,06FH ;1E-3
         DB 03CH,023H,0D7H,00AH ;1E-2
         DB 03DH,0CCH,0CCH,0CDH ;1E-1
YUANZHENG_DE0:
         DB 03FH,080H,000H,000H ;1E0
         DB 041H,020H,000H,000H ;1E1
         DB 042H,0C8H,000H,000H ;1E2
         DB 044H,07AH,000H,000H ;1E3
         DB 046H,01CH,040H,000H ;1E4
         DB 047H,0C3H,050H,000H ;1E5
         DB 049H,074H,024H,000H ;1E6
         DB 04BH,018H,096H,080H ;1E7
         DB 04CH,0BEH,0BCH,020H ;1E8
         DB 04EH,06EH,06BH,028H ;1E9
YUANZHENG_DE10:
         DB 050H,015H,002H,0F9H ;1E10

相关信息
发表评论
打印本页 关闭本页
已有(
)位对此新闻感兴趣的网发发表了看法 >>更多评论
内 容:
     
 
热点新闻
一周排行
关于我们 | 服务项目 | 付款方式 | 广告服务 | 联系我们 | 友情链接 | 投诉 建议 合作 | 网站地图 | 加入收藏
Copyright © 2007-2008 WEEQOO.COM Corp.All Rights Reserved. 版权所有 经营许可证编号:浙B2-20050339 法律声明
维库电子旗下网站:维库电子市场网 | ChinaICMart | 维库电子开发网 | 维库电子人才网
总部:杭州市下城区朝晖路182号国都发展大厦1号楼80A
电话:0571-85889139-8007 QQ:303939539 | MSN:zh1226@hotmail.com |  邮箱:laz8258@163.com dzsc51@163.com