📄 浮点数程序.asm
字号:
;===========================================================================
; Monitor of MCS-51 System
;
; By: XIAOLIN
; 03/25/2007..
;================================== Log ====================================
;
;========================= Functions & Capacities ==========================
;
;=============================== Constant ==================================
SysStack Equ 70H ;System Stack:08H..1fh,24 Total
;
;---------------------------------------------------------------------------
;Const
;---------------------------------------------------------------------------
;================================ Hardware =================================
;=============================== Bit Segment ===============================
L0 BIT 00H
L1 BIT 01H
LOW_OV BIT 02H
HIGH_OV BIT 03H
LUP BIT 04H
;=============================== Byte Segment ==============================
A0_BUF EQU 50H;..52H ;A0的首地址
A1_BUF EQU 60H;..62H ;A1的首地址
F_TEMP_BUF EQU 63H;..65H
F_RH_BUF EQU 66H;..68H
;==========================================================
E_RH_BUF EQU 30H ;..31H湿度平均数的缓冲区,
E_Temp_BUF EQU 32H ;..33H温度平均数的缓冲区,
DHT_Get_BUF EQU 34H ;..36H采集到的数据缓冲区
RH_Get_BUF EQU 37H ;..38H
T_Get_BUF EQU 39H;...3AH
RH_Get_BUF_Tp EQU 3BH ;..3CH
T_Get_BUF_Tp EQU 3DH;...3EH
GET_NewDATA_BUF EQU 31H ;新数据的缓冲区
n EQU 4;N=16=K+L=(2 的n次方 )
K EQU 10 ;旧平均数的权=K
L EQU 6 ; 新数据的权=L
Bad_Data_Flag BIT 28H.0;输入的数据超过最大的误差范围标志
Have_Get_RH_F BIT 28H.1;已经取得湿度标志
Have_Get_T_F BIT 28H.2;已经取得温度标志
A_SAVE DATA 29H
;=============================== Program Code ==============================
Org 0000H ;
LJmp Main
;--------------------------------- Ints ------------------------------------
;-------------------------------- Subroutines ------------------------------
InitSystem:
Ret
;---------------------------------------------------------------------------
InitDis:
Ret
;---------------------------------------------------------------------------
InitKey:
Ret
;------------------------------子程序---------------------------------------
;-------------------------------------------------------------------
;NAME: F_CHANGE
;FUN: 实现浮点数规则化
;CALL: NONE
;REG USE : C, A,R5,R6,R7 ,L0
;CHANGE: L0 A C
;
;INPUT: R6R7--------F_CHANGE 普通有符号数转换为浮点数
; L0 R5 R6R7-- L_STD 左规格
;OUTPUT: L0 R5 R6R7
;FOR EXAMPLE: IF (R6R7)=0001,then CALL F_CHANGE ,and L0 R5 R6R7
; 0 81 8000H
; IF L0 R5 R6R7 ,THEN CALL L_STD , AND L0 R5 R6R7
; 1 85H 1000H 1 82 8000H
;--------------------------------------------------------
F_CHANGE: MOV A,R6 ; 判断 R6R7 是否为 0?
ORL A,R7 ;
JNZ F_CHANGE_0 ; 如果R6R7 不为0,则跳转
MOV R5,#0 ; R6 R7全部为0 则R5为0
SJMP F_CHANGE_END ; 结束
F_CHANGE_0:MOV R5,#90H
MOV A,R6 ; R6 TO A
MOV C,ACC.7 ; 将R6最高位给 L0
MOV L0,C ;
JNC L_STD ; 如果不为0,说明是正数
CLR C ; 否则 求出原码
MOV A,R7 ; 数据取反+1
CPL A ;
ADD A,#1
MOV R7,A ;A TO R7
MOV A,R6 ;R6 TO A
CPL A
ADDC A,#0
MOV R6,A ; A TO R6
L_STD: JB ACC.7,F_CHANGE_3;左规格化
DEC R5
MOV A,R7
CLR C
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
JNB ACC.7,L_STD ; 判断 R6最高位是否为1,是,则跳转
F_CHANGE_3:
CLR C
F_CHANGE_END:
RET ;结束
;---------------------------------------------------------------------
;NAME: R_STD
;FUNC: 实现右规格化
;IN PUT: L0 R5 R6R7
;OUT PUT:L0 R5 R6R7
;---------------------------------------------------------------------
R_STD: MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
MOV A,R6
INC R5
JNB ACC.7,R_STD
RET
;---------------------------------------------------------------------
; NEMA: Reve_F_CHANGE 反规格化
;IN: R5R6R7
;OUT: R6R7
;CHANGE: L0
; FOR EXAMPLE: R5 R6 R7 R6 R7
; 81 80 00 FF FF -1
; 81 00 00 00 01 +1
;---------------------------------------------------------------------
Reve_F_CHANGE:
MOV A,R5
JNZ Reve_F_CHANGE_1
CLR L0
MOV R6,#0
MOV R7,#0
SJMP Reve_F_CHANGE_END
Reve_F_CHANGE_1:
MOV A,R6
MOV C,ACC.7
;MOV L0,C
SETB ACC.7
MOV R6,A
Reve_F_CHANGE_3:
CJNE R5,#90H,Reve_F_CHANGE_0
JNB L0,Reve_F_CHANGE_END
CLR C
MOV A,R7
CPL A
ADD A,#1
MOV R7,A
MOV A,R6
CPL A
ADDC A,#0
MOV R6,A
Reve_F_CHANGE_END:
MOV A,R3
SUBB A,#80H
JC Reve_F_CHANGE_END0
MOV A,R7
ADD A,#1
MOV R7,A
JNC Reve_F_CHANGE_END0
INC R6
Reve_F_CHANGE_END0:
CLR L0
CLR C
RET
;Reve_F_CHANGE_END
Reve_F_CHANGE_0:
INC R5
CLR C
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
;+++++++++
MOV A,R3
RRC A
MOV R3,A
;MOV A,R4
;RRC A
;MOV R4,A
;MOV A,R2
;RRC A
;MOV R2,A
;++++++++++++
SJMP Reve_F_CHANGE_3
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;取得频率值
;=======================================================
Get_GPRS_F:MOV A,R2
RLC A
MOV R2,A
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
RET
;-------------------------------------------------------
;NAME: M0_TO_A0
;FUNC:
;CALL: NONE
;REG USE: R0,R5,6,7 ;A
;CHANGE: L0, @R0
;For example @r0 @r0+1 #r0+2 R5 R6 R7 L0
; 84H 0A0H 00H 84H 0A0H 00H 1 -10
; 84H 20H 00H 84H 0A0H 00H 0 +10
; 00H ** ** 00H 00H 00H 0 0
;--------------------------------------------------------
A0_TO_FT: ;将数据传送给温度浮点数
MOV R0,#F_TEMP_BUF
LJMP A0_TO_M0T
;=========================================
A0_TO_FRH: ;将数据传送给湿度浮点数
MOV R0,#F_RH_BUF
LJMP A0_TO_M0T
;=========================================
FRH_TO_A0: MOV R0,#F_RH_BUF
LJMP M0_TO_A0_RH
;=========================================
FT_TO_A0: MOV R0,#F_TEMP_BUF
LJMP M0_TO_A0_RH
;=========================================
M0_TO_A0:
MOV R0,#A0_BUF ;取首地址给 R0
M0_TO_A0_RH:MOV A,@R0 ;将首地址的数据给 A
JZ M0_TO_A0_0 ;先判断是不是为0,如果为0,则整个数据为0
MOV R5,A ;不是为0,将数据-阶码 给R5
;---------------------------------
INC R0 ;R0 的地址 加1
MOV A,@R0 ;将(R0+1) TO R6
MOV C,ACC.7 ;LET R6 的 MSB TO L0
MOV L0,C
SETB ACC.7 ;R6的最高位置1
MOV R6,A
;---------------------------------
INC R0 ;R0+1
MOV A,@R0
MOV R7,A ;(R0+1) TO R7
JMP M0_TO_A0_1 ;EXIT
;---------------------------------
M0_TO_A0_0:MOV R5,#0 ;IF (R0)=0,THEN ALL REG=0,AND L0=0
MOV R6,#0
MOV R7,#0
CLR L0
M0_TO_A0_1:
DEC R0
DEC R0
RET
;---------------------------------------------------------------
; NAME:A0_TO_M0
; IN: R5, R6R7,L0
; 82 8000 1 82 , 8000 ,0
; OUT: @R0,+1,+2
; 82 8000 82 0000
;---------------------------------------------------------------
A0_TO_M0: MOV R0,#A0_BUF
A0_TO_M0T: MOV A,R5
JZ A0_TO_M0_ZERO;IF R5=0,THEN @R0+1=0,AND @R0+2=0
MOV @R0,A
;---------------------------------
INC R0
MOV A,R6
MOV C,L0
MOV ACC.7,C
MOV @R0,A
;---------------------------------
INC R0
MOV A,R7
MOV @R0,A
SJMP A0_TO_M0_OUT
;---------------------------------
A0_TO_M0_ZERO:
Mov @r0,A
Inc r0
Mov @r0,A
Inc r0
Mov @r0,A
A0_TO_M0_OUT:
DEC R0
DEC R0
RET
;-----------------------------------------------------------------
;NEMA: A0_TO_M1
;IN PUT: L0 R5,R6,R7
;OUT PUT: @R1,+1,+2
; REG USE: A
;-------------------------------------------------------------------
A0_TO_M1: MOV R1,#A1_BUF
A0_TO_M11:
MOV A,R5
JZ A0_TO_M1_00
MOV @R1,A
;----------------------------------
INC R1
MOV A,R6
MOV C,L0
MOV ACC.7,C
MOV @R1,A
;----------------------------------
INC R1
MOV A,R7
MOV @R1,A
SJMP A0_TO_M1_OUT
A0_TO_M1_00:
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
A0_TO_M1_OUT:
DEC R1
DEC R1
RET
;---------------------------------------------------------------------
;NAME: A0_TO_A1
;FUNC: (R5R6R7)=>>(R2R3R4)
;REG: A
;----------------------------------------------------------------------
A0_TO_A1:
MOV A,R5
JNZ A0_TO_A1_1
MOV R6,#0
MOV R7,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
SJMP A0_TO_A1_END
A0_TO_A1_1:MOV R2,A
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
MOV C,L0
MOV L1,C
A0_TO_A1_END:
RET
;-------------------------------------------------------
;NAME: A1_TO_A0
;FUNC: L0=L1
; R5=R2
; R6=R3
; R7=R4
;--------------------------------------------------------
A1_TO_A0: MOV A,R2
JZ R2_EQU_00H
MOV C,L1
MOV L0,C
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
SJMP A1_TO_A0_END
R2_EQU_00H:MOV R5,A
MOV R7,#0
MOV R6,#0
CLR L0
A1_TO_A0_END:
RET
;=====================================================================
A0_TO_M00: MOV R0,#A0_BUF
MOV A,R5
JZ A0_TO_M00_OUT
MOV @R0,A
INC R0
MOV A,R6
MOV @R0,A
INC R0
MOV A,R7
MOV @R0,A
DEC R1
DEC R1
A0_TO_M00_OUT:
RET
;---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -