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

📄 isomaths.asm

📁 《单片机应用系统设计与产品开发》配套源码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位寻址区:20h-->24h即(00-->27h)用语一些数制转换计算,25H(28H-->2FH)用于标志
;26h-->2Ah(即30H-->57H):用于上位机通信
;2Bh-->2Fh(即58h-->7fh)用于与设备通信标志
;RAM 10H-->1FH用于上位机(即两组寄存器)
;RAM 30H-->3FH及浮点数运算
;RAM 40H-->4FH用于设备
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

       NEGATIVE_FLAG         BIT     28H           ;用于浮点数转换
       POINTER_FLAG          BIT     29H           ;用于小数点标志

       FLOOP_COUNT           EQU     30H           ;用于浮点数及程序中的循环
       R8                    EQU     31H           ;浮点数转化暂存地址
       R9                    EQU     32H           ;用于浮点数
       R10                   EQU     33H           ;用于浮点数
       BCD_LEN               EQU     34H           ;用于BCD码的转换
       REG_R0                EQU     35H           ;暂存BCD码转化为浮点数的地址保护
       REG_R1                EQU     36H
       REG_R6                EQU     37H
       REG_R7                EQU     38H


;以下是浮点数转化程序,针对ISOVEL数据格式编写

;***************************************
;四字节浮点数转换成双字节无符号整形(隐含1位小数点)
;由R0,R1指向要转换的数,转化后的结果存到r3(底位),r4(高位)
;R2(底位)   R3    R4    R5(阶码)
;R3    R4
;***************************************
FTOB1:       CLR      NEGATIVE_FLAG
             MOV      DPL,R0         ;取数
             MOV      DPH,R1
             MOVX     A,@DPTR
             MOV      R2,A           ;取底位
             INC      DPTR
             MOVX     A,@DPTR
             MOV      R3,A
             INC      DPTR
             MOVX     A,@DPTR
             MOV      R4,A
             INC      DPTR
             MOVX     A,@DPTR
             MOV      R5,A
             INC      DPTR
             MOV      R0,DPL
             MOV      R1,DPH

             MOV      A,R5           ;特殊情况,0时此数位0
             JNZ      SIGB
             MOV      A,R2
             JNZ      SIGB
             MOV      A,R3
             JNZ      SIGB
             MOV      A,R4
             JNZ      SIGB
             RET

    SIGB:    MOV      A,R5         ;判正负
             JNB      ACC.7,SIGB0
             SETB      NEGATIVE_FLAG
   SIGB0:    CLR      C
             MOV      A,R4
             RLC      A
             MOV      A,R5
             RLC      A
             CLR      C
             SUBB     A,#127
             ADD      A,#3 ;阶码加3相当于*8
             MOV      R5,A
             MOV      A,R4
             SETB     ACC.7           ;恢复隐含的1
             MOV      R4,A
             MOV      R7,A
             MOV      A,R3
             MOV      R6,A
             MOV      A,R2
             MOV      21H,A
             CLR      C
             XCH      A,R7
             RRC      A
             XCH      A,R7
             XCH      A,R6
             RRC      A
             XCH      A,R6
             XCH      A,21H
             RRC      A
             XCH      A,21H
             CLR      C
             XCH      A,R7
             RRC      A
             XCH      A,R7
             XCH      A,R6
             RRC      A
             MOV      R6,A
             XCH      A,21H
             RRC      A
             CLR      C
             ADD      A,R2
             MOV      A,R6
             ADDC     A,R3
             MOV      R3,A
             MOV      A,R7
             ADDC     A,R4
             MOV      R4,A
             JC       SIGB1
    SIGB2:   MOV      A,R5
             CLR      C
             CJNE     A,#15,SIGB3  ;阶码15,则为原数
             RET

 SIGB1:      INC      R5
             SETB     C
             XCH      A,R4
             RRC      A
             XCH      A,R4
             XCH      A,R3
             RRC      A
             XCH      A,R3
             LJMP     SIGB2

 SIGB3:      JC       SIGB4
             MOV      R3,#0FFH       ;数据超出2字节范围,简单的处理
             MOV      R4,#7FH
             RET

 SIGB4:      MOV      A,#15
             CLR      C
             SUBB     A,R5
             MOV      R5,A             ;分离出右移次数
SIGB5:       LCALL    RIGHT
             DJNZ     R5,SIGB5         ;一位结束后R4,R3即为所得的数
             JNB      NEGATIVE_FLAG,SIGB6 ;
             CLR      C
             MOV      A,R3
             CPL      A
             ADD      A,#1
             MOV      R3,A
             MOV      A,R4
             CPL      A
             ADDC     A,#0
             MOV      R4,A
SIGB6:       RET


;***************************************
;四字节浮点数转换成双字节无符号整形
;由R0,R1指向要转换的数,转化后的结果存到r3(底位),r4(高位)
;R2    R3    R4    R5
;R2    R3
;***************************************
FTOB:        CLR      NEGATIVE_FLAG
             MOV      DPL,R0                 ;取数
             MOV      DPH,R1
             MOVX     A,@DPTR
             MOV      R2,A           ;取底位
             INC      DPTR
             MOVX     A,@DPTR
             MOV      R3,A
             INC      DPTR
             MOVX     A,@DPTR
             MOV      R4,A
             INC      DPTR
             MOVX     A,@DPTR
             MOV      R5,A
             INC      DPTR
             MOV      R0,DPL
             MOV      R1,DPH

             MOV      A,R5
             JNB      ACC.7,FT_NEG0
             SETB     NEGATIVE_FLAG

 FT_NEG0:    MOV      A,R5           ;特殊情况,0时此数位0
             JNZ      FT1
             MOV      A,R2
             JNZ      FT1
             MOV      A,R3
             JNZ      FT1
             MOV      A,R4
             JNZ      FT1
             RET

 FT1:        CLR      C
             MOV      A,R4
             RLC      A
             MOV      A,R5
             RLC      A
             CLR      C
             SUBB     A,#127
             MOV      R5,A
             CLR      C
             CJNE     A,#15,FI1  ;与15等,即不用移位,即为R4,R3,原数
             RET
 FI1:        JC       FI2
             MOV      R3,#0FFH       ;数据超出2字节范围,简单的处理
             MOV      R4,#7FH
             RET

 FI2:        MOV      A,R4           ;恢复隐含的1
             SETB     ACC.7
             MOV      R4,A
             MOV      A,#15
             CLR      C
             SUBB     A,R5
             MOV      R5,A           ;分离出右移次数
FI3:         LCALL    RIGHT
             DJNZ     R5,FI3         ;一位结束后R4,R3即为所得的数
             JB       NEGATIVE_FLAG,FI_NEG
             RET

FI_NEG:      CLR        C
             MOV        A,R3
             CPL        A
             ADD        A,#1
             MOV        R3,A
             MOV        A,R4
             CPL        A
             ADDC       A,#0
             MOV        R4,A
             RET

  RIGHT:     CLR      C
             XCH      A,R4
             RRC      A
             XCH      A,R4
             XCH      A,R3
             RRC      A
             XCH      A,R3
             RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 B1TOF:    CLR   NEGATIVE_FLAG
           MOV   R9,R7            ;为子程序出口统一,暂存R6,R7地址
           MOV   R8,R6
           MOV   R6,#10H          ;除法移位次数
           MOV   R7,#0            ;移位积存器清零
           MOV   DPL,R0
           MOV   DPH,R1
           MOVX  A,@DPTR
           MOV   R4,A           ;取高位
           INC   DPTR
           MOVX  A,@DPTR
           MOV   R3,A
           INC   DPTR
           MOV   R0,DPL
           MOV   R1,DPH

           MOV   A,R4
           JNB   ACC.7,LP            ;判断正负
           SETB  NEGATIVE_FLAG
           CLR   C                     ;还原为原码
           MOV   A,R3
           SUBB  A,#1
           MOV   R3,A
           MOV   A,R4
           SUBB  A,#0
           CPL   A
           MOV   R4,A
           MOV   A,R3
           CPL   A
           MOV   R3,A
;以下是除10子程序,通过移位完成,入口R4高,R3底,被除数;出口R4高,R3底,商;R7用于移位,并存余数
LP:        CLR   C
           MOV   A,R3
           RLC   A
           MOV   R3,A
           MOV   A,R4
           RLC   A
           MOV   R4,A
           MOV   A,R7
           RLC   A
           MOV   R7,A

LP1:       CLR   C                    ;除以10分离出整数,和小数
           MOV   A,R7
           SUBB  A,#10                 ;除10
           JC    SMALL
           MOV   R7,A                  ;存余数
           INC   R3
           SJMP  LP1

SMALL:     DJNZ  R6,LP
           MOV   R2,#0
           MOV   R6,#8H          ;以下将R7中的小数部分转化为二进制小数,放于R2 ,R6用于循环8次
LP3:       CLR   C
           MOV   A,R7
           ADDC  A,R7
           DA    A
           MOV   B,A
           ANL   A,#0F0H         ;分离出高4位,看是否有进位,由于除数是10 ,因此每次只能进位1位
           JZ    LP4
           SETB  C
           MOV   A,R2
           RLC   A
           MOV   R2,A
           AJMP  LP31
 LP4:      CLR   C
           MOV   A,R2
           RLC   A
           MOV   R2,A
 LP31:     MOV   A,B
           ANL   A,#0FH
           MOV   R7,A
           DJNZ  R6,LP3

           MOV   A,R2           ;0,不能规格化
           JZ    LP32
           AJMP  LP5
 LP32:     MOV   A,R3
           JZ    LP33
           SJMP  LP5
 LP33:     MOV   A,R4
           JZ    LP6

LP5:       MOV   R5,#142          ;15+127=142 阶码初始值
 LP51:     MOV   A,R4                       ;以下是规格化此浮点数
           JB    ACC.7,LPOVER

⌨️ 快捷键说明

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