📄 浮点数程序.asm
字号:
;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 + -