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

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

载入中...

广告3号位
百宝日历
载入中...

百宝专栏

说明:请先返回首页,再点击下列专栏即可进入。
  • 首页 相册 标签
  • 匠人公告(87)
  • 匠人笔记(144)
  • 匠人文集(167)
  • 写书近况(189)
  • 团队撰写(96)
  • 与非门专栏(566)
  • 比尔熊专栏(12)
  • 网络酷文(492)
  • 程序宝典(477)
  • 程序算法(28)
  • 编程技巧(482)
  • 资料宝藏(280)
  • 硬件技术(178)
  • 汽车电子(52)
  • 藏经宝阁(47)
  • 项目管理(15)
  • 趣味设计(6)
  • 社区热贴(5)
  • 开发工具(19)
  • 电脑应用(66)
  • 供需信息(24)
  • 最新货色

    载入中...

    粉丝评论

    载入中...

    载入中...



    百宝信息

    载入中...

    百宝流量

    (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号位 [投放]

     

    推荐阅读

     

    友情连接

     [更多酷站连接]

     

     

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [hotpower 的水潭]

    [八楼的呼吸]

    [柔月阁]

    [PIC论坛]

    [SMARTCODE电子书斋]

    [阿摆手记]

    [电子伙伴]

    [xwj的文君阁]

    [所长的BLOG]

    [海边淘沙]

    [单片机开发联盟]

    [数字电视之家]

    [软件开发之窗]

    [unaided的笔记]

    [小飞的笔记]

    [ICC AVR开发网]

    [我爱研发网]

    [infernal的笔记]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [水牛的仓库]

    [逍遥电子]

    [ningpanda的博客]

    [雄鹰的空中加油站]

    [一网见天下]

    [Armoric]

    [股剩是怎样炼成的]

    [嵌入式365]

    [C-Design]

    [AVR猎手的地盘]

    [中国高校自动化网]

    [SunK]

    [工控365网]

    [煮透社]

    [白沙的香烟盒]

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    大学生电子网 

     

     

     

     

     

     

     

     《匠人的百宝箱》