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

📄 浮点数程序.asm

📁 浮点数
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;NAME: M1_TO_A1
;FUNC:
;CALL: NONE
;REG USE:  R1,R2,3,4   ;A
;CHANGE:   L1,  @R1
;For example   @r1  @r1+1  #r1+2     R2   R3   R4   L1
;               84H  0A0H   00H      84H  0A0H 00H  1   -10
;               84H   20H   00H      84H  0A0H 00H  0   +10
;               00H   **    **       00H   00H 00H  0   0
;--------------------------------------------------------
M1_TO_A1:  MOV    R1,#A1_BUF ;取首地址给 R1
M11_TO_A1:
           MOV    A,@R1      ;将首地址的数据给 A
           JZ     M1_TO_A1_0 ;先判断是不是为0,如果为0,则整个数据为0
           MOV    R2,A       ;不是为0,将数据-阶码 给R2
;---------------------------------------
           INC    R1         ;R1 的地址 加1
           MOV    A,@R1      ;将(R1+1) TO A
           MOV    C,ACC.7    ;LET A 的 MSB TO L1
           MOV    L1,C
           SETB   ACC.7
           MOV    R3,A
;---------------------------------------
           INC    R1        ;R1+1
           MOV    A,@R1
           MOV    R4,A       ;(R1+1) TO R4
           JMP    M1_TO_A1_1  ;EXIT
M1_TO_A1_0:                 ;IF (R1)=0,THEN ALL REG=0,AND L0=0
           MOV    R2,#0
           MOV    R3,#0
           MOV    R4,#0
           CLR    L1
           SJMP   M1_TO_A1_END
M1_TO_A1_1:
           DEC    R1
           DEC    R1
M1_TO_A1_END:
           RET
;----------------------浮点数减法程序---------------------------
;NAME: F_SUBB
;FUNC: IN PUT0:F_SUBB_M0M1
;              (R5 R6R7 L0):=(@R0,+1,+2)-(@R1,+1,+2)
;      IN PUT1:F_SUBB_A0M1
;              (R5 R6R7 L0):=(R5 R6R7)-(@R1,+1,+2)
;      IN PUT2:F_SUBB_A0A1
;              (R5 R6R7 L0):=(R5 R6R7)-(R2 R3R4)
; OUT PUT: R5 R6R7 L0
;---------------------------------------------------------------
F_SUBB_M0M1:
           CALL   M0_TO_A0
F_SUBB_A0M1:
           CALL   M1_TO_A1
F_SUBB_A0A1:
           ;MOV    A,R3
           MOV    C,L1
           CPL    C
           MOV    L1,C
          ; MOV    R3,A
           LCALL  F_ADD_A0A1
           RET
;------------------------------------------------------------------
;NAME: DO_EQU_STEPS
;FUNC:加法对阶
;IN PUT:R5,R2
;OUT PUT:R5
;------------------------------------------------------------------
DO_EQU_STEPS:
           MOV    A,R5
           CLR    C
           SUBB   A,R2  ;移码的加减 后结果是补码表示的数据
           JZ     EQU_R2_R5
           JNB    ACC.7,Bigger_R5;如果最高位是1,则R5>R2
           CPL    A;如果最高位是0,则R5<R2,SO R5:=|R5-R2|
           ADD    A,#1
           MOV    R5,A
;----------------------------------
Bigger_R2_LOOP:
           CLR    C
           MOV    A,R6
           RRC    A
           MOV    R6,A
           MOV    A,R7
           RRC    A
           MOV    R7,A
           DJNZ   R5,Bigger_R2_LOOP
           SJMP   EQU_R2_R5
;----------------------------------
Bigger_R5: MOV    R5,A
Bigger_R5_LOOP:
           CLR    C
           MOV    A,R3
           RRC    A
           MOV    R3,A
           MOV    A,R4
           RRC    A
           MOV    R4,A
           INC    R2
           DJNZ   R5,Bigger_R5_LOOP
;----------------------------------
EQU_R2_R5:
           MOV    A,R2
           MOV    R5,A
           RET
;-----------------------------------------------------------------
;NAME:FLAOT_ADD
; IN PUT0: M0_ADD_M1
; ......1: A0_ADD_M1
; .......: A0_ADD_A1
; OUT: L0,R5 , R6R7
; CALL: M0_TO_A0;M1_TO_A1;DO_EQU_STEPS;R_STD;L_STD;A1_TO_A0
;------------------------------------------------------------------
F_ADD_M0M1:
           CALL   M0_TO_A0
F_ADD_A0M1:
           CALL   M1_TO_A1
F_ADD_A0A1:
           MOV    A,R2
           JZ     FLAOT_ADD_END;IF R2=0,THEN OUT=L0,R5R6R7
           ORL    A,R5
           JNZ    FLAOT_ADD_0;IF A=0,THEN OUT=L1,R2R3R4
           LCALL  A1_TO_A0
FLAOT_ADD_END:           ;SJMP   FLAOT_ADD_END
           RET;EXIT  FLAOT_ADD
FLAOT_ADD_0:
           LCALL  DO_EQU_STEPS;对阶  而且阶码已经在R5中
;判断L0,L1 ,IF L0=L1,C=0,ELSE C=1
           MOV    C,L0
           JNB    L1,FLAOT_ADD_1
           CPL    C
FLAOT_ADD_1:
           JC     L0_NEQU_L1
           MOV    A,R7
           ADD    A,R4
           MOV    R7,A
           MOV    A,R6
           ADDC   A,R3
           MOV    R6,A
;-----if c=1,need R_STD-----
           JNC    FLAOT_ADD_END
           LCALL  R_STD
           SJMP   FLAOT_ADD_END
;----------------------------
L0_NEQU_L1:; L0 不等于L1; then do R6R7:=R6R7-R3R4
           ;IF C=0 THEN (R6R7)>(R3R4)
           CLR    C
           MOV    A,R7
           SUBB   A,R4
           MOV    R7,A
           MOV    A,R6
           SUBB   A,R3
           MOV    R6,A
;IF C=0 THEN (R6R7)>(R3R4);ELSE (R6R7)<(R3R4)
;IF (R6R7)>(R3R4) AND L0=1,THEN
           JNC    Bigger_R6R7
           ;CPL    L0
           CLR    C
           MOV    A,R7
           CPL    A
           ;MOV    R7,A
           ADD    A,#1
           MOV    R7,A
           MOV    A,R6
           CPL    A
           ADDC   A,#0
           MOV    R6,A
           JB     L0,Bigger_R6R7_0
           SETB   L0
           SJMP   Bigger_R6R7_1
Bigger_R6R7_0:
           CLR    L0
           SJMP   Bigger_R6R7_1
Bigger_R6R7:
           JB     L0,Bigger_R6R7_1
           CLR    L0
           ;SJMP   Bigger_R6R7_1
Bigger_R6R7_1:
           LCALL  L_STD
           SJMP   FLAOT_ADD_END
;============================浮点数乘法程序================================
;NEMA:    Float_MUL
;IN PUT0: M0 MUL M1----(@R0,+1,+2)*(@R1,+1,+2)
;IN PUT1: A0 MUL M1----(R5 R6R7)*(@R1,+1,+2)
;IN PUT2: A0 MUL A1----(R5 R6R7)*(R2 R3R4)
;OUT PUT: L0 R5 R6 R7
;CALL :   TWO_BYTE_MUL ,ONE_BYTE_ADD
;REG USE: A,B,R2~~R7
;CHANGE:  L0,A,B
;FUNC:实现浮点数乘法,将结果存入第一数据寄存器
;     尾数相乘,阶码相加
;===========================================================================
F_MUL_M0M1:;IF R5=0 OR R2=0,Result=0
           LCALL   M0_TO_A0
F_MUL_A0M1:
           LCALL   M1_TO_A1
F_MUL_A0A1:
           MOV    A,R5
           JZ    Float_MUL_0
           MOV    A,R2
           JZ     Float_MUL_0
           SJMP   Float_MUL_1 ;Result do not equ #00h
;----------;----------
Float_MUL_0:
           MOV    R5,#0
           CLR    L0
           MOV    R6,#0
           MOV    R7,#0
Float_MUL_END:
           RET
;----------;----------;----------;----------
Float_MUL_1:
           LCALL  ONE_BYTE_ADD;阶码相加
           JB    HIGH_OV,Float_MUL_0 ;然后判断是否有益出
           JB    LOW_OV,Float_MUL_0
;----------判断符号是否相同,如果相同则C=0,否则C=1
           MOV    C,L0
           JNB    L1,Float_MUL_NEXT
           CPL    C
Float_MUL_NEXT:
           MOV    L0,C;SAVE L0
;----------;----------
           LCALL  TWO_BYTE_MUL;尾数结果保存在R6R7R3R4
;----------;----------
Float_MUL_2:
Float_MUL_3:CLR   C
           MOV    A,R6
           JB     ACC.7,Float_MUL_END
           MOV    A,R4
           RLC    A
           MOV    R4,A

           MOV    A,R3
           RLC    A
           MOV    R3,A

           MOV    A,R7
           RLC    A
           MOV    R7,A

           MOV    A,R6
           RLC    A
           MOV    R6,A
           DEC    R5
           SJMP   Float_MUL_3
;----------;----------
           SJMP    Float_MUL_END
;---------------------------------------------------------
;NAME:  TWO_BYTE_MUL
;FUNC:  (R6R7R3R4):=(R6R7)*(R3R4)
;
;----------------------------------------------------------
TWO_BYTE_MUL:
           MOV    A,R4
           MOV    B,R7
           MUL    AB
           XCH    A,R4
           MOV    R2,B
           MOV    B,R6
           MUL    AB
           ADD    A,R2
           XCH    A,R6
           XCH    A,B
           ADDC   A,#0
           MOV    R2,A
           MOV    A,R3
           MUL    AB
           ADD    A,R2
           XCH    A,R3
           XCH    A,B
           ADDC   A,#0
           XCH    A,R7
           MUL    AB
           ADD    A,R6
           XCH    A,R3
           ADDC   A,B
           XCH    A,R7
           ADDC   A,#0
           MOV    R6,A
           RET
;--------------------------------------------------------------------------
ONE_BYTE_ADD:
;---------------------------------------------------------------------------
           MOV    A,R5         ;FOR: (最高2位)    R5  00 | 11   01        10
           XRL    A,R2         ;     (最高2位)XRL R2  00 | 11   10        10
                               ;              -------------------
           JB     ACC.7,NORMAL ;     (最高2位)    A   00 | 00   11        00
           JB     ACC.6,NORMAL ;              XRL R2  00 | 11    |        10
           XRL    A,R2         ;              -------------------|NORMAL
           JB     ACC.7,H_OV   ;                  A   00  11              10
           JB     ACC.6,NORMAL ;                       |   |               |
           SETB   LOW_OV       ;                       |   |               |
           SJMP   OUT          ;                    LOW_OV HIGH_OV       NORMAL
H_OV:      JNB    ACC.6,NORMAL ;
           SETB   HIGH_OV      ;
           SJMP   OUT          ;
NORMAL:    MOV    A,R5         ;
           ADD    A,R2         ;
           ADD    A,#80H       ;
           MOV    R5,A
OUT:       RET

;---------------------------------------
Compute_RH:MOV   R6,E_RH_BUF
           MOV   R7,E_RH_BUF+1
           LCALL  F_CHANGE;规格化
           LCALL  A0_TO_M0
           MOV    A1_BUF,#6EH;0.000028
           MOV    A1_BUF+1,#3BH
           MOV    A1_BUF+2,#0E8H
           LCALL  F_MUL_M0M1;SQR*0.000028
           LCALL  A0_TO_M1
           MOV    A0_BUF,#7CH;0.0405
           MOV    A0_BUF+1,#25H
           MOV    A0_BUF+2,#0E3H
           LCALL  F_SUBB_M0M1;0.0405-SQR*0.000028
           LCALL  A0_TO_M1
           MOV    R6,E_RH_BUF
           MOV    R7,E_RH_BUF+1
           LCALL  F_CHANGE ;
           LCALL  A0_TO_M0 ;
           LCALL  F_MUL_M0M1;SQR*(0.0405-SQR*0.000028)
           MOV    A1_BUF,#83H;4
           MOV    A1_BUF+1,#0H
           MOV    A1_BUF+2,#0H
           LCALL  F_SUBB_A0M1;SQR*(0.0405-SQR*0.000028)-4
           LCALL  A0_TO_FRH
           SETB   Have_Get_RH_F
           RET
Compute_RHT:;温度补偿程序
           MOV    R6,#HIGH(2353)
           MOV    R7,#LOW(2353)
           LCALL  F_CHANGE
           LCALL  A0_TO_M0
           MOV    A1_BUF,#73H
           MOV    A1_BUF+1,#27H
           MOV    A1_BUF+2,#0C6H
           LCALL  F_MUL_M0M1
           MOV    A1_BUF,#7AH
           MOV    A1_BUF+1,#23H
           MOV    A1_BUF+2,#0D7H
           LCALL  F_ADD_A0M1
           MOV    A1_BUF,#84H
           MOV    A1_BUF+1,#40H
           MOV    A1_BUF+2,#0H
           LCALL  F_MUL_A0M1
           RET
Compute_TEMP:;计算温度
           MOV    R6,#HIGH(7353)
           MOV    R7,#LOW(7353)
           MOV    R6,E_TEMP_BUF
           MOV    R7,E_TEMP_BUF+1
           LCALL  F_CHANGE
           MOV    A1_BUF,#7AH
           MOV    A1_BUF+1,#23H
           MOV    A1_BUF+2,#0D7H
           LCALL  F_MUL_A0M1
           MOV    A1_BUF,#86H
           MOV    A1_BUF+1,#20H
           MOV    A1_BUF+2,#0H
           LCALL  F_SUBB_A0M1
           LCALL  A0_TO_FT
           SETB   Have_Get_T_F
           RET
;-----------------------------------
;计算THI的程序:时间916uS
;思路:根据采集到的值,算得坐标值
;==================================
Compute_THI:LCALL FT_TO_A0
           MOV    A1_BUF,#85H  ;21.1
           MOV    A1_BUF+1,#28H
           MOV    A1_BUF+2,#0CDH
           LCALL  F_SUBB_A0M1  ;TEMP-21.1
           MOV    A1_BUF,#81H  ;1.818
           MOV    A1_BUF+1,#68H
           MOV    A1_BUF+2,#0B4H
           LCALL  F_MUL_A0M1  ; (TEMP-21.1)*1.818
           LCALL  Reve_F_CHANGE;计算温度坐标  纵坐标
           MOV    A_SAVE,R7 ;将 纵坐标先储存起来
           LCALL  FRH_TO_A0
           MOV    A1_BUF,#7EH
           MOV    A1_BUF+1,#4CH
           MOV    A1_BUF+2,#0CDH
           LCALL  F_MUL_A0M1
           LCALL  Reve_F_CHANGE;计算湿度坐标 横坐标
           ;-------------------
           MOV    DPTR,#GET_THI_Table
           MOV    A,A_SAVE
           MOV    B,#21
           MUL    AB
           ADD    A,DPL
           MOV    DPL,A
           MOV    A,B
           ADDC   A,DPH

⌨️ 快捷键说明

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