⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 float_bcd.asm

📁 PIC16F877单片机浮点数至5位压缩BCD码转换程序
💻 ASM
字号:
;PIC16F877浮点数至5位压缩BCD码转换程序
;程序通过3个步骤将一个3字节浮点数转换成5位压缩BCD码(压缩BCD码是指将两个BCD码分别存放在一;个8位字节的高半字节和低半字节中)。首先,判断浮点数的符号,如果是负数,存符号位,并将之取;补。其次,调用浮点数乘法或除法子程序,对浮点数进行连续的乘以10或除以10的操作,把浮点的阶;码控制在+12≤EXPB<+16之间,即使得浮点数转换成定点数后,数值在4095(FFFH)和32767(7FFFH);之间。再次,调用浮点数至定点数子程序,将浮点数转换成双字节定点数。最后,调用定点数至BCD码;子程序,将双字节无符号数转换成5位压缩BCD码,从而完成浮点数至压缩BCD码的转换。此外,乘以10;或除以10的次数可以用来确定小数点的位置。在子程序中,乘以10或除以10的次数分别存在C_MUL和;C_DIV单元中,但二者不可能同时大于0(二者不可能同时小于0,但可以同时等于0)。其中,当;C_MUL>0时(此时,C_DIV必然等于0),表示小数点从BCD码的最后往前移动C_MUL位;当C_DIV>0时(;此时,C_MUL必为0),表示小数点由BCD码的最后往后移动C_DIV位。转换后的BCD码的符号存于FPOL单;元的第7位。
;在该子程序中要调用大量的子程序,如浮点数乘法子程序、浮点数除法子程序、浮点数至定点数转换;子程序和定点数至BCD码转换子程序等。在此由于篇幅的原因都予以省略,需要这些子程序的读者,请;参阅前面相关章节。
;浮点数至压缩BCD码转换程序的入口条件和出口条件如下:
;入口条件:ACCBHI、ACCBLO、EXPB
;出口条件:5位压缩BCD码存于ACCCHI低半字节、ACCCLO和ACCDHI中,符号保存于FPOL寄存器的第7位,;小数点位置存于C_MUL和C_DIV中。
;以下为本子程序的程序清单。

    LIST            p=16f877
    INCLUDE        p16f877.inc

    ACCALO         EQU     20        ;临时寄存器
    ACCAHI         EQU     21
    EXPA        EQU     22        ;临时寄存器
    ACCBLO         EQU     23        ;存放被转换浮点数尾数
    ACCBHI         EQU     24
    EXPB         EQU     25        ;存放被转换浮点数阶码
    ACCCLO         EQU     26        ;临时寄存器
    ACCCHI         EQU     27        ;临时寄存器
    ACCDLO         EQU     28        ;临时寄存器
    ACCDHI         EQU     29        ;临时寄存器
    TEMP         EQU     2A        ;临时寄存器
    TEMP1         EQU     30        ;临时寄存器
    TIMES         EQU     31       ;临时寄存器
    SIGN         EQU     2B        ;临时寄存器
    COUNT         EQU     2F       ;临时寄存器
    C_MUL         EQU     2C       ;存放小数点位置
    C_DIV         EQU     2D       ;存放小数点位置
    FPOL         EQU     2E        ;存放被转换数的符号
    ORG            0X0000
START    GOTO        MAIN
    ORG            0X0100
;*************浮点数到BCD码子程序****************
FtoBCD    CLRF         C_MUL        ;清小数点位数寄存器
    CLRF         C_DIV
    CLRF         ACCAHI        ;求取结果符号,存于FPOL.7
    CALL         S_SIGN
    MOVF         SIGN ,0
    MOVWF        FPOL
    MOVLW         50            ;ACCA赋初值,ACCA=10(十进制)
    MOVWF         ACCAHI
    CLRF         ACCALO
    MOVLW         04
    MOVWF         EXPA
MUl5    BTFSS        EXPB,7        ;阶码EXPB<0?
    GOTO        MUl2        ;否,转MU12
MUl1    CALL         F_mpy        ;是,ACCA×10
    INCF         C_MUL        ;小数点左移寄存器加1
    GOTO         MUl5        ;重新判断阶码是否小于零
MUl2    MOVLW         .12            ;阶码EXPB<12?
    SUBWF         EXPB,0
    BTFSC         STATUS,C
    GOTO         MUl4        ;否,转MU14
MUl3    CALL         F_mpy        ;是,ACCA×10
    INCF         C_MUL        ;小数点左移寄存器加1
    GOTO         MUL2        ;重判阶码值
MUl4    MOVLW         .16            ;阶码EXPB>16?
    SUBWF         EXPB,0
    BTFSS        STATUS,C
    GOTO         NEXT        ;否,表示阶码12≤EXPB<16,求取BCD码值
DIV1    CALL         FDIV            ;是,EXPB÷10
    INCF         C_DIV        ;小数点右移寄存器加1
    GOTO         MUl4        ;重新判断阶码值
NEXT    CALL         FTOW3        ;调子程序,将浮点数转换为定点数
    CALL         BtoBCD        ;调双字节数到BCD码子程序,求BCD码
    MOVF         ACCCHI        ;ACCCHI=0?
    BTFSS         STATUS,Z
    RETLW         0            ;否,返回
    MOVLW         04            ;是,结果左移4次,保证ACCCHI不为零
    MOVWF         TIMES
    BCF             STATUS,C
MUl6    RLF             ACCDHI
    RLF            ACCCLO
    RLF             ACCCHI
    DECFSZ         TIMES
    GOTO         MUl6
    MOVF         C_DIV        ;C_DIV=0?
    BTFSC         STATUS,Z
    GOTO         TEMUL        ;是,转判断C_MUL
    DECF         C_DIV        ;否,小数点右移寄存器减1
    RETLW         0
TEMUL    INCF         C_MUL        ;小数点左移寄存器加1
    RETLW         0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -