《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

PIC 运算子程序(8)
程序匠人 发表于 2005-5-21 11:11:00  阅读全文 | 回复(0) | 引用通告 | 编辑

            7  浮点数开方程序
               
            如果被开方数是浮点数格式,代入的迭代初值也是浮点数格式,并且用浮点除法(浮点数的除以2操作可以由阶码减1得到)和浮点加法进行迭代运算,就是浮点数开方的基本思路。
            以下为浮点数开方的程序清单(其中包含校验程序部分)。该程序中包含浮点数加法程序和浮点数除法程序,这些程序与前面章节列出的程序完全相同,不再列出。

                    LIST            P=16f877
                    INCLUDE        p16f877.inc
            ;****************************************
            ;此子程序是16尾数,8位阶码开方程序
            ;入口条件:浮点数存放在ACCBHI和ACCBLO     EXPB单元中.
            ;出口条件:结果放在ACCBHI和ACCBLO EXPB单元中.
            ;迭代次数由LUPCNT的地址值决定
            ;用CALL  SQRTF指令调用,
            ;内含浮点除程序,浮点加减程序
            ;****************************************
                    ACCALO         EQU         20H
                    ACCAHI         EQU         ACCALO +1
                    EXPA         EQU         ACCALO +2
                    ACCBLO         EQU         ACCALO +3
                    ACCBHI        EQU         ACCALO +4
                    EXPB         EQU         ACCALO +5
                    ACCCLO         EQU         ACCALO +6
                    ACCCHI         EQU         ACCALO +7
                    ACCDLO         EQU         ACCALO +8
                    ACCDHI         EQU         ACCALO +9
                    TEMP         EQU         ACCALO +0A
                    TEMP1         EQU         ACCALO +0B
                    TIMES         EQU         ACCALO +0C
                    SIGN         EQU         ACCALO +0D
                    COUNT         EQU         ACCALO +0E
                    C_MUL         EQU         ACCALO +0F
                C_DIV         EQU         ACCALO +10
                    FPOL         EQU         ACCALO +11        ;符号放置位
                    NUMLO        EQU        FPOL+1
                    NUMHI        EQU        FPOL+2
                    NUMM        EQU        FPOL+4
                     LUPCNT        EQU        .10
                    CONSTANT     C=0
                    CONSTANT     Z=2
                    CONSTANT     MODEL16=1
                    CONSTANT     FALSE=0
            ;****************************************
                    ORG            0X0000
                    NOP
                    GOTO        MAIN
                    ORG            0X0010
            ;****************************************
            INIT1    DECF        EXPB            ;假设迭代根的初始值为其原值的一半
                MOVF        ACCBHI,W
                MOVWF        ACCAHI
                MOVF        ACCBLO,W
                MOVWF        ACCALO
                MOVF        EXPB,W
                MOVWF        EXPA
                RETLW        0
            SQRTF    MOVLW        LUPCNT
                MOVWF        COUNT
                MOVF        ACCBHI,W
                MOVWF        NUMHI
                MOVF        ACCBLO,W
                MOVWF        NUMLO
                MOVF        EXPB,W
                MOVWF        NUMM            ;存储被开方的数
                BTFSC        ACCBHI,7
                GOTO        TIQIAN            ;如果被开方数是个负数,则返回一极小数
                CALL        INIT1
            SLOOP1    MOVF        NUMLO,0
                    MOVWF        ACCBLO
                    MOVF        NUMHI,0
                MOVWF        ACCBHI
                MOVF        NUMM,0
                MOVWF        EXPB
                CALL        FDIV
                CALL        F_add
                CALL        INIT1
                DECFSZ        COUNT,1
                GOTO        SLOOP1
                RETURN
            TIQIAN    MOVLW        0X40
                MOVWF        ACCBHI
                CLRF        ACCBLO
                MOVLW        0X80
                MOVWF        EXPB        ;如果被开方数是一个负数,返回一个极小的浮点数
                RETURN       
            ;***浮点加子程序F_add详细的程序语句请参考前面章节***
            ;***浮点数除法子程序FDIV详细的程序语句请参考前面章节***
            【校验举例】  被开方数55AAH,02H  (浮点数)
                求得平方根:68B6H,01H  (浮点数)
            MAIN    NOP
                MOVLW        0X55
                MOVWF        ACCBHI               
                MOVLW        0XAA
                MOVWF        ACCBLO        ;被开方数的尾数55AAH赋值
                MOVLW        0X02
                MOVWF        EXPB        ;被开方数的阶码02H赋值
                CALL        SQRTF        ;调用浮点开方子程序
                NOP                        ;开方完毕,结果在ACCBHI、ACCBLO、EXPB
                    END   
            8  小数点显示位置确定子程序
            在实际应用中,往往需要将一个浮点数表示的十进制数用数码管显示出来。当用户调用浮点数至BCD码子程序FtoBCD将这个浮点数转换成BCD码后,除了可以得到5位BCD码外,C_MUL和C_DIV寄存器中还有一个值用于确定哪个数码管该显示小数点。例如,设某浮点数调用译码子程序后,得到以下数值:012345(BCD),C_MUL=07,C_DIV=0,那么数码管显示的值应该为:0.0012345,1号数码管除了要显示0外,还要将小数点显示出来。以下子程序将完成这一功能。此外,一般而言,工程应用和实验中,多数要求显示4位有效数字,其显示范围在0.001~9999(符号没显示,如有需要,请读者自己添上)。如果要求显示数据超过9999,则4个LED显示“1111”;如果要求显示数据小于“0.001”,则4个LED显示“0000”(如果实际要求显示多于4位有效数字,则读者可以对本程序作相应的修改,就可以满足要求)。本子程序入口条件和出口条件分别如下:
                入口条件:ACCCHI1、ACCCLO1、ACCDHI1、ZUO、YOU;
               
            出口条件:DISP1、DISP2、DISP3、DISP4、LEDDOT(DISP1、DISP2、DISP3、DISP4用于存放显示的数字,LEDDOT用于存放小数点的位置)。
                注意,该子程序的入口条件和FtoBCD子程序的出口条件有如下对应关系:
            ACCCHI1与ACCCHI对应,ACCCLO1与ACCCLO对应,ACCDHI1与ACCDHI对应,ZUO与C_MUL对应,YOU与C_DIV对应
            用户在调用FtoBCD子程序后,可以用下面一段语句与该程序实现接口。
                CALL        FtoBCD
                MOVF        ACCCHI,W
                MOVWF        ACCCHI1
                MOVF        ACCCLO,W
                MOVWF        ACCCLO1
                MOVF        ACCDHI,W
                MOVWF        ACCDHI1
                MOVF        C_MUL,W
                MOVWF        ZUO
                MOVF        C_DIV,W
                MOVWF        YOU
                CALL        TESTDOT
            本子程序的程序清单如下:
            ;**********小数点位置及显示寄存器值确定子程序************
            TESTDOT        BANKSEL        LEDDOT
                CLRF        LEDDOT        ;清除小数点位置寄存器   
                MOVF        ZUO,W
                MOVWF        C_MUL1   
                MOVF        YOU,W
                BTFSS        STATUS,Z
                GOTO        CHAOCHU1
                MOVF        ZUO,W
                BTFSC        STATUS,Z
                GOTO        CHAOCHU1     ;C_DIV>0或C_MUL=0,表示浮点数超出显示
            ;范围上限,转移到过量程处理
                MOVF        ZUO,W
                SUBLW        0X07
                BTFSS        STATUS,C
                GOTO        TAIXIAO        ;C_MUL>7,超出显示范围下限,转移处理(改
            ;变与C_MUL比较的立即数的大小,可以改变
            ;下限)
                MOVF        ZUO,W
                SUBLW        0X01
                BTFSC        STATUS,Z
                GOTO        ZHUANG1        ;C_MUL=1,表示小数点左移1位,能够显示前
               ;4位(ACCCHI低半字节中始终有1位),转移处理
                MOVF        ZUO,W        ;同理可以对左移2~7位处理
                SUBLW        0X02
                BTFSC        STATUS,Z
                GOTO        ZHUANG2
                MOVF        ZUO,W
                SUBLW        0X03
                BTFSC        STATUS,Z
                GOTO        ZHUANG3
                MOVF        ZUO,W
                SUBLW        0X04
                BTFSC        STATUS,Z
                GOTO        ZHUANG4
                MOVF        ZUO,W
                SUBLW        0X05
                BTFSC        STATUS,Z
                GOTO        ZHUANG5
                MOVF        ZUO,W
                SUBLW        0X06
                BTFSC        STATUS,Z
                GOTO        ZHUANG6
                MOVF        ZUO,W
                SUBLW        0X07
                BTFSC        STATUS,Z
                GOTO        ZHUANG7
            CHAOCHU1    MOVLW        0X01
                    MOVWF        DISP1
                    MOVWF        DISP2
                    MOVWF        DISP3
                    MOVWF        DISP4
                    MOVLW        0XFF
                    MOVWF        LEDDOT        ;不显示小数点
                    RETURN                    ;超出上限时,DSP1、 DSP2、 DSP3、 DSP4中赋
            ;1,显示“1111”
            TAIXIAO        MOVLW        0X00
                    MOVWF        DISP1
                    MOVWF        DISP2
                    MOVWF        DISP3
                    MOVWF        DISP4
                    MOVLW        0X01
                    MOVWF        LEDDOT        ;小数点的位置在第一位   
                    RETURN                    ;超出下限,显示"0.000"
            ZHUANG1        CALL        BIAO        ;C_MUL=1~4时,可调用标准赋值模块对
                                            ;DSP1、 DSP2、DSP3、 DSP4赋值
                    MOVLW        0X04
                    MOVWF        LEDDOT        ;C_MUL=1时,小数点的位置在第4位
                    RETURN
            ZHUANG2        CALL        BIAO
                    MOVLW        0X03
                    MOVWF        LEDDOT        ;C_MUL=2时,小数点的位置在第3位
                    RETURN
            ZHUANG3        CALL        BIAO
                    MOVLW        0X02
                    MOVWF        LEDDOT        ;C_MUL=3时,小数点的位置在第2位
                    RETURN
            ZHUANG4        CALL        BIAO
                    MOVLW        0X01
                    MOVWF        LEDDOT        ;C_MUL=4时,小数点的位置在第1位
                    RETURN
            ZHUANG5        CLRF        DISP1        ;C_MUL=5时,DSP1=0
                    MOVF        ACCCHI1,W     ;DSP2=ACCHI1低字节,DSP3和DSP4分别对
                                               ;应ACCCLO1的高低字节,ACCDHI1不显示(太小),
                    MOVWF        DISP2         ;ACCDHI1的低字节一直没有显示
                    MOVF        ACCCLO1,0
                    MOVWF        C_MUL1
                    SWAPF        ACCCLO1
                    MOVLW        0X0F
                    ANDWF        ACCCLO1,0
                    MOVWF        DISP3
                    MOVLW        0X0F
                    ANDWF        C_MUL1,0
                    MOVWF        DISP4
                    MOVLW        0X01
                    MOVWF        LEDDOT        ;小数点的位置在第1位       
                    RETURN
            ZHUANG6        CLRF        DISP1        ;C_MUL=6时,DSP1=0
                    CLRF        DISP2        ;DSP2=0,DSP3=ACCCHI1的低字节,
                                            ; DSP4=ACCCLO1的高字节,ACCCLO1低字
                                            ;节和ACCDHI1不显示
                    MOVF        ACCCHI1,W
                    MOVWF        DISP3
                    SWAPF        ACCCLO1
                    MOVLW        0X0F
                    ANDWF        ACCCLO1,0
                    MOVWF        DISP4
                    MOVLW        0X01
                    MOVWF        LEDDOT        ;小数点的位置在第1位   
                    RETURN
            ZHUANG7        CLRF        DISP1        ;C_MUL=7时,DSP1=DSP2=DSP3=0,
                                            ; DSP4=ACCCHI1低半字节,其它不显示
                    CLRF        DISP2
                    CLRF        DISP3
                    MOVF        ACCCHI1,W
                    MOVWF        DISP4
                    MOVLW        0X01
                    MOVWF        LEDDOT        ;小数点的位置在第1位   
                    RETURN
            BIAO        MOVF        ACCCHI1,W    ;C_MUL=1~4时的标准赋值模块
                    MOVWF        DISP1
                    SWAPF        ACCDHI1
                    MOVLW        0X0F
                    ANDWF        ACCDHI1,0
                    MOVWF        DISP4
                    MOVF        ACCCLO1,0
                    MOVWF        C_MUL1
                    SWAPF        ACCCLO1
                    MOVLW        0X0F
                    ANDWF        ACCCLO1,0
                    MOVWF        DISP2
                    MOVLW        0X0F
                    ANDWF        C_MUL1,0
                    MOVWF        DISP3
                    RETURN
                
            执行完该程序后,通过调用适合的子程序,就可以方便地实现小数点位置的浮动显示(即若被显示的数突然从99.99变化到999.9,则程序自动实现小数点位置的调整。)

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网