×
单片机 > 单片机程序设计 > 详情

MCS51浮点计算程序

发布时间:2020-06-04 发布时间:
|

MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示.



;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。

;本人还有热电阻和热电偶温度查表计算程序,有需要可EMAIL:majingsong1@2911.net


; FLOATING PROGRAM 

;

;##########################################

;##########################################

;-----------------------------------------------

; IEEE754 FLOAT CONVERT TO 4 BYTES FLOAT

; INPUT: ((R0))((R0)+1)((R0)+2)((R0)+3) IEEE-754 FLOAT

; OUTPUT: R4 R5R6R7    4 BYTES FLOAT

;-----------------------------------------------

IEE_F:MOV    A,@R0

    JNZ    CON_0

    INC    R0

    MOV    A,@R0

    JNZ    CON_1

    INC    R0

    MOV    A,@R0

    JNZ    CON_2

    INC    R0

    MOV    A,@R0

    JNZ    CON_3

    MOV    R4,#0

    MOV    R5,#0

    MOV    R6,#0

    MOV    R7,#0

    DEC    R0

    DEC    R0

    DEC    R0

    RET

CON_3:DEC    R0

CON_2:DEC    R0

CON_1:DEC    R0

CON_0:CLR    FLAG_0

    INC    R0

    MOV    A,@R0

    RLC    A

    MOV    R5,A

    DEC    R0

    MOV    A,@R0

    RLC    A

    MOV    R4,A

    JNC    SA_IE

    SETB    FLAG_0

SA_IE: CLR    C

    MOV    A,R4

    SUBB    A,#7FH

    CLR    C

    INC    A

    MOV    C,ACC.7

    MOV    ACC.6,C

    MOV    C,FLAG_0

    MOV    ACC.7,C

    MOV    R4,A

    MOV    A,R5

    SETB    C

    RRC    A

    MOV    R5,A

    INC    R0

    INC    R0

    MOV    A,@R0

    MOV    R6,A

    INC    R0

    MOV    A,@R0

    MOV    R7,A

    DEC    R0

    DEC    R0

    DEC    R0

    RET

;---------------------------------------------

; 4 BYTES FLOAT CONVERT TO IEEE754 FLOAT

; INPUT: ((R0)) R2R3R4 4 BYTES FLOAT

; OUTPUT: ((R1)) ((R1)+1) ((R1)+2) ((R1)+3)

; IEEE-754 FLOAT

;---------------------------------------------

F_IEE:

    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    INC    R0

    MOV    A, @R0

    MOV    R4, A

    DEC    R0

    DEC    R0

    DEC    R0


    MOV    A,R2

    JZ    ZERO_IEE

    MOV    A,@R0

    MOV    C,ACC.7

    MOV    FLAG_0,C

    CLR    ACC.7

    MOV    C,ACC.6

    JC    F_FF

    DEC    A

    CLR    C

    ADD    A,#7FH

    LJMP    F_TR

F_FF:    CLR    C

    SUBB    A,#02H

F_TR:    MOV    C,FLAG_0

    RRC    A

    MOV    @R1,A

    INC    R1

    MOV    A,R2

    MOV    ACC.7,C

    MOV    @R1,A

    INC    R1

    MOV    A,R3

    MOV    @R1,A

    INC    R1

    MOV    A,R4

    MOV    @R1,A

FIEE_OFF:DEC R1

    DEC    R1

    DEC    R1

    RET

ZERO_IEE:MOV @R1,A

    INC    R1

    MOV    @R1,A

    INC    R1

    MOV    @R1,A

    INC    R1

    MOV    @R1,A

    SJMP    FIEE_OFF

;==========================================

; 2 BYTE MUL

; 0.R2R3 * 0.R4R5→0.R2R3R7

;------------------------------------------

D2_MUL: MOV    A, R3

    MOV    B, R5

    MUL    AB

    MOV    R7, B

    MOV    A, R3

    MOV    B, R4

    MUL    AB

    ADD    A, R7

    MOV    R7, A

    CLR    A

    ADDC    A, B

    MOV    R3, A

    MOV    A, R2

    MOV    B, R5

    MUL    AB

    ADD    A, R7

    MOV    A, R3

    ADDC    A, B

    MOV    R3, A

    MOV    PSW.5, c

    MOV    A, R2

    MOV    B, R4

    MUL    AB

    ADD    A, R3

    MOV    R3, A

    CLR    A

    ADDC    A, B

    MOV    C, PSW.5

    ADDC    A, #0

    MOV    R2, A

    RET


;------------------------------

; 2 BYTE DIV

; 0.R2R3R7R6 / 0.R4R5→0.R2R3

; INPUT 0.R2R3  < 0.R4R5

;------------------------------

D2_DIV: MOV    A, R1

    PUSH    ACC

    MOV    B, #10H

A2O:    CLR    C

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R3

    RLC    A

    MOV    R3, A

    XCH    A, R2

    RLC    A

    XCH    A, R2

    MOV    PSW.5, C

    CLR    C

    SUBB    A, R5

    MOV    R1, A    

    MOV    A, R2

    SUBB    A, R4

    JB    PSW.5, A2S

    JC    A2R

A2S:    MOV    R2, A

    MOV    A, R1

    MOV    R3, A

    INC    R6

A2R:    DJNZ    B, A2O

    POP    ACC

    MOV    R1, A

    MOV    A, R7

    MOV    R2, A

    MOV    A, R6

    MOV    R3, A

    RET


;--------------------------------------

; 3 BYTE FLOAT LOAD

; ((R0))→R6,((R0)+1)→R2,((R0)+2)→R3

; ((R1))→R7,((R1)+1)→R4,((R0)+2)→R5

;--------------------------------------

F3_MLD: MOV    A, @R0

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    DEC    R0

    DEC    R0

    MOV    A, @R1

    MOV    R7, A

    INC    R1

    MOV    A, @R1

    MOV    R4, A

    INC    R1

    MOV    A, @R1

    MOV    R5, A

    DEC    R1

    DEC    R1

    RET


;--------------------------------------

; 3 BYTE FLOAT STANDED

;--------------------------------------

F3_SDT: JC    M3A

    MOV    C, FLAG39

    JB    PSW.5, M3B

    MOV    A, R2

    RRC    A

    MOV    R2, A

    MOV    A, R3

    RRC    A

    MOV    R3, A

    INC    R6

    RET

M3B:    MOV    A, R4

    RRC    A

    MOV    R4, A

    MOV    A, R5

    RRC    A

    MOV    R5, A

    INC    R7

    RET

M3A:    MOV    A, R2

    JNZ    M3C

    CJNE    R3, #0, M3D

    MOV    R6, #41H

M3E:    RET

M3C:    JB    ACC.7, M3E

M3D:    MOV    C, PSW.5

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    CLR    PSW.5

    DEC    R6

    SJMP    M3A

    RET


;--------------------------------------

; 3 BYTE FLOAT ADD OR SUB 

; R6R2R3 + R7R4R5→R4R2R3

; R6R2R3 - R7R4R5→R4R2R3

; FLAG3A = 0 ADD FLAG3A = 1 SUB

;--------------------------------------

F3_ABP: MOV    A, R6

    MOV    C, ACC.7

    MOV    FLAG38, C

    XRL    A, R7

    JNB    ACC.7, SQ

    CPL    FLAG3A

    MOV    A, R6

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R6, A

    MOV    A, R7

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R7, A

SQ:    CLR    C

    MOV    A, R6

    SUBB    A, R7

    JZ    ST

    CLR    PSW.5

    CLR    FLAG39

    JB    ACC.7, SW

    CJNE    R4, #00H, SE

    CJNE    R5, #00H, SE

ST:    JB    FLAG3A, SY

    MOV    A, R3

    ADD    A, R5

    MOV    R3, A

    MOV    A, R2

    ADDC    A, R4

    MOV    R2, A

    JNC    SD

    SETB    FLAG39

    CLR    C

SF:    CLR    PSW.5

    LCALL    F3_SDT

SD:    MOV    A, R6

    MOV    C, FLAG38

    MOV    ACC.7, C

    XCH    A, R4

    MOV    R6, A

    RET

SW:    CJNE    R2, #00H, SF

    CJNE    R3, #00H, SF

    MOV    A, R7

    MOV    R6, A

    SJMP    ST

SE:    CPL    PSW.5

    CLR    C

    LCALL    F3_SDT

    SJMP    SQ

SY:    MOV    A, R3

    CLR    C

    SUBB    A, R5

    MOV    R3, A

    MOV    A, R2

    SUBB    A, R4

    MOV    R2, A

    JNC    SL

    CLR    A

    CLR    C

    SUBB    A, R3

    MOV    R3, A

    CLR    A

    SUBB    A, R2

    MOV    R2, A

    CPL    FLAG38

SL:    SETB    C

    SJMP    SF


;--------------------------------------

;3 BYTE FLOAT ADD

; ((R0))((R0)+1)((R0)+2) + ((R1))((R1)+1)

;     ((R1)+2)→R4R2R3

; FLAG3A = 0  

;--------------------------------------

F3_ADD: CLR    FLAG3A

    LCALL    F3_MLD

    LCALL    F3_ABP

    RET


;--------------------------------------

; 3 BYTE SUB

; ((R0))((R0)+1)((R0)+2) - 

; ((R1))((R1)+1)((R1)+2)→R4R2R3

; FLAG3A =  1

;--------------------------------------

F3_SUB: SETB    FLAG3A

    LCALL    F3_MLD

    LCALL    F3_ABP

    RET


;--------------------------------------

; 3 BYTE FLOAT MUL

; ((R0))((R0)+1)((R0)+2) * 

; ((R1))((R1)+1)((R1)+2)→R4R2R3

;--------------------------------------

F3_MUL: LCALL  F3_MLD

    MOV    A, R6

    XRL    A, R7

    MOV    C, ACC.7

    MOV    FLAG38, C

    LCALL    D2_MUL

    MOV    A, R7

    MOV    C, ACC.7

    MOV    PSW.5, C

    MOV    A, @R0

    ADD    A, @R1

    MOV    R6, A

    SETB    C

    LCALL    F3_SDT

    MOV    A, R6

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    RET


;--------------------------------------

; 3 BYTE FLOAT DIV

; ((R0))((R0)+1)((R0)+2) / 

; ((R1))((R1)+1)((R1)+2)→R4(阶)R2R3

; C = 0 NORMAL ,C = 1 DIV BY 0

;--------------------------------------

F3_DIV: LCALL    F3_MLD

    MOV    A, R6

    XRL    A, R7

    MOV    C, ACC.7

    MOV    FLAG38, C

    CLR    A

    MOV    R6, A

    MOV    R7, A

    CJNE    R4, #00H, TY

    CJNE    R5, #00H, TY

    SETB    C

    RET

TY:    MOV    A, R3

    SUBB    A, R5

    MOV    A, R2

    SUBB    A, R4

    JC    TU

    CLR    PSW.5

    CLR    FLAG39

    LCALL    F3_SDT

    MOV    A, R7

    RRC    A

    MOV    R7, A

    CLR    C

    SJMP    TY

TU:    CLR    A

    XCH    A, R6

    PUSH    ACC

    LCALL    D2_DIV

    POP    ACC

    ADD    A, @R0

    CLR    C

    SUBB    A, @R1

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    CLR    C

    RET


;-------------------------------

; 3BYTE FLOAT STORE

; R4R2R3 TO (R1)(R1+1)(R1+2)

;-------------------------------

F3_STR: MOV    A, R4

    MOV    @R1, A

    INC    R1

    MOV    A, R2

    MOV    @R1, A

    INC    R1

    MOV    A, R3

    MOV    @R1, A

    DEC    R1

    DEC    R1

    RET


;--------------------------------

; 3 BYTE FLOAT SQRT

; F0 = 0 NORMAL ,F0 = 1 ERROR

;--------------------------------

F3_SQRT:MOV    A, @R0

    JB    ACC.7, BV

    MOV    @R1, A

    INC    R0

    INC    R1

    MOV    A, @R0

    MOV    @R1, A

    INC    R0

    INC    R1

    MOV    A, @R0

    MOV    @R1, A

    DEC    R0

    DEC    R0

    DEC    R1

    DEC    R1

BM:    LCALL    F3_DIV

    MOV    R6, A

    MOV    A, @R1

    MOV    R7, A

    INC    R1

    MOV    A, @R1

    MOV    R4, A

    INC    R1

    MOV    A, @R1

    MOV    R5, A

    DEC    R1

    DEC    R1

    CLR    FLAG3A

    LCALL    F3_ABP

    DEC    R4

    CLR    PSW.5

    MOV    A, R4

    MOV    B, R7

    CJNE    A, B, BN

    MOV    A, R5

    SUBB    A, R3

    ANL    A, #0FCH

    MOV    R7, A

    MOV    A, R6

    SUBB    A, R2

    JNZ    BN

    CJNE    R7, #00H, BN

    SETB    PSW.5

BN:    LCALL    F3_STR

    JNB    PSW.5, BM

    RET

BV:    CLR    PSW.5

    RET


;------------------------------------

; 3 BYTE BIN TO 4 BYTE FLOAT 

; INPUT ADDRESS (R0),OUTPUT ADDRESS (R1)

;------------------------------------

F3_BTF:MOV    A, #10H

    MOV    R2, A

    MOV    A, @R0

    MOV    R3, A

    INC    R0

    MOV    A, @R0

    MOV    R4, A

    DEC    R0

    MOV    A, R3

    ORL    A, R4

    JNZ    FRLN1

    MOV    R2, A

    MOV    R3, A

    MOV    R4, A

    JMP    FRLN2

FRLN1:    MOV    A, R3

    JB    ACC.7, FRLN2

    LCALL    FRL1

    SJMP    FRLN1

FRLN2:    INC    R1

    INC    R1

    MOV    A, R4

    MOV    @R1, A

    DEC    R1

    MOV    A, R3

    MOV    @R1, A

    DEC    R1

    MOV    A, R2

    CLR    ACC.7

    CLR    ACC.6

    MOV    @R1, A

    RET


FRL1:    CLR    C

    MOV    A, R4

    RLC    A

    MOV    R4, A

    MOV    A, R3

    RLC    A

    MOV    R3, A

    DEC    R2

    MOV    A, R2

    XRL    A, #0C0H

    JNZ    FRL1E

    MOV    R2, A

    MOV    R3, A

    MOV    R4, A

FRL1E:    RET


;------------------------------------

; 3 BYTE FLOAT BIN TO DEC

; INPUT DATA: FLAG3E = 0 1 <= DATA < 10

; FLAG3E = 1 FLAG3F = 0 0.2 <= DATA < 2

; FLAG3E = 1 FLAG3F = 1 0.4 <= DATA < 4

;------------------------------------

F3_BTD: MOV    A, @R0

    MOV    C, ACC.7

    MOV    FLAG3C, C

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    DEC    R0

    DEC    R0

    CJNE    R2, #00H, PA

    CJNE    R3, #00H, PA

    CLR    A

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

    INC    R1

    MOV    @R1, A

PL:    DEC    R1

    DEC    R1

    DEC    R1

    DEC    R1

    DEC    R1

    RET

PA:    MOV    @R1, #00H

    JB    FLAG3E, PB

    DEC    @R1

PB:    INC    R1

    MOV    @R1, #01H

    JNB    FLAG3E, PD

    INC    @R1

    JNB    FLAG3F, PD

    INC    @R1

PD:    MOV    A, R6

    CLR    C

    SUBB    A, @R1

    JZ    PX

    JNB    ACC.6, PE

PM:    DEC    @R1

    DEC    @R1

    DEC    @R1

    DEC    @R1

PZ:    MOV    A, R6

    CLR    C

    SUBB    A, @R1

    JZ    PY

    JB    ACC.6, PF

PQ:    JNB    FLAG3E, PG

    DEC    R6

    JNB    FLAG3F, PG

    DEC    R6

PG:    CJNE    R6, #00H, PH

    MOV    R6, #05H

    JNB    FLAG3E, PI

    MOV    R7, #01H

    JNB    FLAG3F, PJ

    INC    R7

PJ:    CLR    A

    CLR    C

PK:    XCH    A, R3

    RLC    A

    XCH    A, R3

    XCH    A, R2

    RLC    A

    XCH    A, R2

    RLC    A

    DJNZ    R7, PK

    DEC    R6

    MOV    @R1, A

    INC    R1

PI:    MOV    A, R3

    MOV    B, #0AH

    MUL    AB

    MOV    R3, A

    MOV    R7,B

    MOV    A, R2

    MOV    B, #0AH

    MUL    AB

    ADD    A, R7

    MOV    R2, A

    CLR    A

    ADDC    A, B

    MOV    @R1, A

    INC    R1

    DJNZ    R6, PI

    SJMP    PL

PX:    MOV    A, R2

    SUBB    A, #80H

    JC    PM

PE:    MOV    R5, #0CDH

    MOV    R4, #0CCH

    LCALL    D2_MUL

    MOV    A, R2

    JB    ACC.7, PN

    MOV    A, R7

    MOV    C, ACC.7

    ORL    C, ACC.6

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    DEC    R6

PT:    MOV    A, R6

    ADD    A, #0FDH

    MOV    R6, A

    DEC    R1

    INC    @R1

    INC    R1

    SJMP    PD

TPS:    SJMP    PZ

PH:    MOV    A, R2

    RRC    A

    MOV    R2, A

    MOV    A, R3

    RRC    A

    MOV    R3, A

    INC    R6

    SJMP    PG

PY:    MOV    A, #0CBH

    CLR    C

    SUBB    A, R3

    MOV    A, #0CCH

    SUBB    A, R2

    JC    PQ

PF:    MOV    R4, #0A0H

    MOV    R5, #00H

    LCALL    D2_MUL

    MOV    A, R2

    JB    ACC.7, PR

    MOV    A, R7

    MOV    C, ACC.7

    ORL    C, ACC.6

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    DEC    R6

PU:    MOV    A, R6

    ADD    A, #04H

    MOV    R6, A

    DEC    R1

    DEC    @R1

    INC    R1

    SJMP    TPS

PN:    MOV    A, R7

    JNB    ACC.7, PT

    MOV    A, R3

    ORL    A, #01H

    MOV    R3, A

    SJMP    PT

PR:    MOV    A, R7

    JNB    ACC.7, PU

    MOV    A, R3

    ORL    A, #01H

    MOV    R3, A

    SJMP    PU


;-----------------------------------

; 4 BITE FLOAT MUL

;((R0))((R0)+1)((R0)+2)((R0)+3)*

; ((R1))((R1)+1)((R1)+2)((R1)+3)

; TO R4R5R6R7

;-----------------------------------

F4_MUL: LCALL F4_LD

    INC    R1

    MOV    A, R0

    PUSH    ACC

    LCALL    D3_MUL

    POP    ACC

    MOV    R0, A

    DEC    R1

    MOV    A, R2

    MOV    C, ACC.7

    MOV    PSW.5, C

    MOV    A, @R0

    XRL    A, @R1

    MOV    C, ACC.7

    MOV    FLAG38, C

    MOV    A, @R0

    ADD    A, @R1

    XCH    A, R0

    PUSH    ACC

    SETB    C

    LCALL    F4_STD

    POP    ACC

    XCH    A, R0

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    RET


;-----------------------------------

; 4 BITE FLOAT DIV

;((R0))((R0)+1)((R0)+2)((R0)+3)/

; ((R1))((R1)+1)((R1)+2)((R1)+3)

; TO R4R5R6R7,

; C=0 NORMAL, C=1 DIV BY 0

;-----------------------------------

F4_DIV: LCALL  F4_LD

    MOV    A, @R0

    XRL    A, @R1

    MOV    C, ACC.7

    MOV    FLAG38, C

    CLR    A

    MOV    R5, A

    MOV    R6, A

    MOV    R7, A

    INC    R1

    CJNE    @R1, #00H, L4A

    INC    R1

    CJNE    @R1, #00H, L4B

    INC    R1

    CJNE    @R1, #00H, L4C

    DEC    R1

    DEC    R1

    DEC    R1

    SETB    C

    RET

L4C:    DEC    R1

L4B:    DEC    R1

L4A:    DEC    R1

    MOV    A, @R0

    XCH    A, R0

    INC    R1

    PUSH    ACC

L4E:    MOV    A, R4

    INC    R1

    INC    R1

    SUBB    A, @R1

    MOV    A, R3

    DEC    R1

    SUBB    A, @R1

    MOV    A, R2

    DEC    R1

    SUBB    A, @R1

    JC    L4D

    CLR    PSW.5

    CLR    FLAG39

    LCALL    F4_STD

    MOV    A, R5

    RRC    A

    MOV    R5, A

    CLR    C

    SJMP    L4E

L4D:    MOV    A, R0

    PUSH    ACC

    LCALL    D3_DIV

    POP    ACC

    DEC    R1

    XCH    A, R0

    POP    ACC

    XCH    A, R0

    CLR    C

    SUBB    A, @R1

    MOV    C, FLAG38

    MOV    ACC.7, C

    MOV    R4, A

    CLR    C

    RET


;-----------------------------------------

; 4 BITE FLOAT  LOAD 

; ((R0)+1)((R0)+2)((R0)+3) TO R2R3R4

;-----------------------------------------

F4_LD:    INC    R0

    MOV    A, @R0

    MOV    R2, A

    INC    R0

    MOV    A, @R0

    MOV    R3, A

    INC    R0

    MOV    A, @R0

    MOV    R4, A

    DEC    R0

    DEC    R0

    DEC    R0

    RET


;-----------------------------------------

; 4 BITE FLOAT  ADD OR SUB

; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; FLAG3A=0 ADD, FLAG3A=1 SUB

;-----------------------------------------

F4_AB:    INC    R1

    MOV    A, @R1

    MOV    R5, A

    INC    R1

    MOV    A, @R1

    MOV    R6, A

    INC    R1

    MOV    A, @R1

    MOV    R7, A

    DEC    R1

    DEC    R1

    DEC    R1

    MOV    A, @R0

    MOV    C, ACC.7

    MOV    FLAG38, C

    XRL    A, @R1

    JNB    ACC.7, F4_ABT

    CPL    FLAG3A

F4_ABT:MOV    A, R0

    PUSH    ACC

    MOV    A, @R0

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R0, A

    MOV    A, R1

    PUSH    ACC

    MOV    A, @R1

    MOV    C, ACC.6

    MOV    ACC.7, C

    MOV    R1, A

F4_SDT1:CLR    C

    MOV    A, R0

    SUBB    A, R1

    JZ    F4_ABTI

    CLR    PSW.5

    CLR    FLAG39

    JB    ACC.7, F4_ABX

    CJNE    R5, #00H, F4_ABG

    CJNE    R6, #00H, F4_ABG

    CJNE    R7, #00H, F4_ABG

    MOV    A, R0

    MOV    R1, A

F4_ABTI:JB    FLAG3A, F4_ABS

    MOV    A, R4

    ADD    A, R7

    MOV    R7, A

    MOV    A, R3

    ADDC    A, R6

    MOV    R6, A

    MOV    A, R2

    ADDC    A, R5

    MOV    R5, A

    JNC    F4_ABA

    SETB    FLAG39

    CLR    C

    SETB    PSW.5

F4_ABL: LCALL F4_STD

    MOV    A, R1

    MOV    R0, A

F4_ABA: POP    ACC

    MOV    R1, A

    POP    ACC

    XCH    A, R0

    MOV    C, FLAG38

    MOV    ACC.7, C

    XCH    A, R4

    RET

F4_ABX: CJNE    R2, #00H, F4_ABG1

    CJNE    R3, #00H, F4_ABG1

    CJNE    R4, #00H, F4_ABG1

    MOV    A, R1

    MOV    R0, A

    SJMP    F4_ABTI

F4_ABG: CPL    PSW.5

F4_ABG1:CLR    C

    LCALL    F4_STD

    SJMP    F4_SDT1

F4_ABS: CLR    C

    MOV    A, R4

    SUBB    A, R7

    MOV    R7, A

    MOV    A, R3

    SUBB    A, R6

    MOV    R6, A

    MOV    A, R2

    SUBB    A, R5

    MOV    R5, A

    JNC    F4_ABS1

    CLR    A

    CLR    C

    SUBB    A, R7

    MOV    R7, A

    CLR    A

    SUBB    A, R6

    MOV    R6, A

    CLR    A

    SUBB    A, R5

    MOV    R5, A

    CPL    FLAG38

F4_ABS1:SETB    C

    CLR    PSW.5

    LCALL    F4_STD

    SJMP    F4_ABA


;-----------------------------------------

; 4 BITE FLOAT  ADD 

; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; FLAG3A=0 ADD

;-----------------------------------------

F4_ADD: CLR    FLAG3A

    LCALL    F4_LD

    LCALL    F4_AB

    RET


;-----------------------------------------

; 4 BITE FLOAT   SUB

; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2)

;      ((R1)+3) TO R4R5R6R7

; FLAG3A=1 SUB

;-----------------------------------------

F4_SUB: SETB    FLAG3A

    LCALL    F4_LD

    LCALL    F4_AB

    RET


;-----------------------------------------

; 4 BITE FLOAT  STANDED

; F0=0 R0R2R3R4

; F0=1 R1R5R6R7

;-----------------------------------------

F4_STD: JC    F4A

    MOV    C, FLAG39

    JB    PSW.5, F4B

    MOV    A, R2

    RRC    A

    MOV    R2, A

    MOV    A, R3

    RRC    A

    MOV    R3, A

    MOV    A, R4

    RRC    A

    MOV    R4, A

    INC    R0

    RET

F4B:    MOV    A, R5

    RRC    A

    MOV    R5, A

    MOV    A, R6

    RRC    A

    MOV    R6, A

    MOV    A, R7

    RRC    A

    MOV    R7, A

    INC    R1

    RET

F4A:    MOV    A, R5

    JNZ    F4C

    CJNE    R6, #00H, F4D

    CJNE    R7, #00H, F4D

F4E:    RET

F4C:    JB    ACC.7, F4E    ; 0E7H

F4D:    MOV    C, PSW.5

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    CLR    PSW.5

    DEC    R0

    SJMP    F4A


;-----------------------------------

; 4 BYTE FLOAT STORE

; R4R5R6R7 TO (R0)(R0+1)(R0+2)(R0+3)

;-----------------------------------

F4_STR: MOV    A, R4

    MOV    @R0, A

    INC    R0

    MOV    A, R5

    MOV    @R0, A

    INC    R0

    MOV    A, R6

    MOV    @R0, A

    INC    R0

    MOV    A, R7

    MOV    @R0, A

    DEC    R0

    DEC    R0

    DEC    R0

    RET


;-------------------------------------------

; 3 BYTE DIV

; 0.R2R3R4R5R6R7 / ((R1))((R1)+1)((R1)+2)

;    TO (R0)(R0+1)(R0+2)(R0+3)

;-------------------------------------------

D3_DIV: MOV    R0, #18H

    INC    R1

    INC    R1

S3D:    CLR    C

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    MOV    A, R4

    RLC    A

    MOV    R4, A

    XCH    A, R3

    RLC    A

    XCH    A, R3

    XCH    A, R2

    RLC    A

    XCH    A, R2

    MOV    PSW.5, C

    CLR    C

    SUBB    A, @R1

    DEC    R1

    MOV    A, R3

    SUBB    A, @R1

    DEC    R1

    MOV    B, A

    MOV    A, R2

    SUBB    A, @R1

    INC    R1

    INC    R1

    JB    PSW.5, S3A

    JC    S3B

S3A:    CLR    C

    MOV    R2, A

    MOV    A, R4

    SUBB    A, @R1

    MOV    R4, A

    MOV    R3, B

    INC    R7

S3B:    DJNZ    R0, S3D

    DEC    R1

    DEC    R1

    RET


;---------------------------------------

; 3 BYTE MUL

; 0.R2R3R4 * 0.((R1))((R1)+1)((R1)+2)

; TO R5R6R2R3R4

;---------------------------------------

D3_MUL: MOV    R0, #19H

    CLR    C

    CLR    A

    MOV    R5, A

    MOV    R6, A

    MOV    R7, A

K3B:    MOV    A, R5

    RRC    A

    MOV    R5, A

    MOV    A, R6

    RRC    A

    MOV    R6, A

    MOV    A, R7

    RRC    A

    MOV    R7, A

    XCH    A, R2

    RRC    A

    XCH    A, R2

    XCH    A, R3

    RRC    A

    XCH    A, R3

    XCH    A, R4

    RRC    A

    XCH    A, R4

    DJNZ    R0, K3A

    RET

K3A:    JNC    K3B

    INC    R1

    INC    R1

    ADD    A, @R1

    MOV    R7, A

    MOV    A, R6

    DEC    R1

    ADDC    A, @R1

    MOV    R6, A

    MOV    A, R5

    DEC    R1

    ADDC    A, @R1

    MOV    R5, A

    SJMP    K3B


;-------------------------------------------

; 功能:以e为底的浮点指数函数

;入口条件:操作数在TMP0中。使用TMP0,TMP1,TMP2

;出口信息:OV=0时,结果仍在TMP0中,OV=1时,溢出。

;影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节

;-------------------------------------------

F4_EXP:    

    MOV    R1, #TMP1

    MOV    A, #01H        ; e(x) = 2(1.442695 * x)

    MOV    @R1, A

    INC    R1

    MOV    A, #0B8H

    MOV    @R1, A

    INC    R1

    MOV    A, #0AAH

    MOV    @R1, A

    INC    R1

    MOV    A, #3BH

    MOV    @R1, A


    MOV    R0, #TMP0

    MOV    R1, #TMP1

    LCALL    F4_MUL        ;进行加权运算

    MOV    R0, #TMP0

    LCALL    F4_STR


E20:

    MOV    R0, #TMP0

    MOV    A, @R0

    MOV    R4, A

    INC    R0

    MOV    A, @R0

    MOV    R5, A

    INC    R0

    MOV    A, @R0

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R7, A

    MOV    A, R5

    ORL    A, R6

    ORL    A, R7

    JNZ    EXP2

EXP1:

    MOV    R4, #01H        ;尾数为零,幂为1.000000

    MOV    R5, #80H

    MOV    R6, #00H

    MOV    R7, #00H

    CLR    OV

    RET

EXP2:    

    MOV    R0, #TMP0

    MOV    A, @R0

    MOV    R4, A        ;将指数复制到工作区

    INC    R0

    MOV    A, @R0

    MOV    R5, A

    INC    R0

    MOV    A, @R0

    MOV    R6, A

    INC    R0

    MOV    A, @R0

    MOV    R7, A

    LCALL    INT

EXP4:

    MOV    A, R4

    JB    ACC.6, EXP5

    CLR    ACC.7

    MOV    R0, A

    CLR    C

    MOV    R1, #00H

    MOV    A, R5

    PUSH    ACC

EXPJ1:    MOV    A, R5

    RLC    A

    MOV    R5, A

    MOV    A, R1

    RLC    A

    MOV    R1, A

    DJNZ    R0, EXPJ1

    POP    ACC

    MOV    R5, A

    MOV    A, R4

    JB    ACC.7, EXPJ2

    MOV    A, R1

    SJMP    EXP6

EXPJ2:    MOV    A, R1

    CPL    A

    INC    A

    SJMP    EXP6    

EXP5:    MOV    A, #00H    

EXP6:    PUSH    ACC    ;暂时保存之

    MOV    R0, #TMP1

    LCALL    F4_STR

    MOV    R0, #TMP0

    MOV    R1, #TMP1

    LCALL    F4_SUB    ;求指数的小数部分

    MOV    R0, #TMP0

    LCALL    F4_STR


    PUSH    DPH

    PUSH    DPL

    MOV    DPTR, #EXP_TABL

    MOV    TMP2, #41H

    MOV    TMP2+1, #00H

    MOV    TMP2+2, #00H

    MOV    TMP2+3, #00H

PLN1:    CLR    A        ;计算指数的小数部分的幂

    MOV    R0, #TMP1

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR

    INC    R0

    CLR    A

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR

    INC    R0

    CLR    A

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR

    INC    R0

    CLR    A

    MOVC    A, @A+DPTR

    MOV    @R0, A

    INC    DPTR    ;指向下一个系数

    MOV    R0, #TMP2

    MOV    R1, #TMP1

    LCALL    F4_ADD    ;进行代数加法运算

    MOV    R0, #TMP2

    LCALL    F4_STR

    CLR    A    ;读取下一个系数的第一个字节

    MOVC    A, @A+DPTR

    CJNE    A, #40H, PLN2;是结束标志吗?

    POP    DPL

    POP    DPH

    POP    ACC        ;取出指数的整数部分

    ADD    A, R4        ;按补码加到幂的阶码上

    MOV    R4, A

    MOV    A, R4

    CLR    ACC.7    ;幂的符号为正

    MOV    R4, A

    RET


PLN2:    

    MOV    R0, #TMP0

    MOV    R1, #TMP2

    LCALL    F4_MUL    ;进行乘法运算

    MOV    R0, #TMP2

    LCALL    F4_STR

    LJMP    PLN1    ;继续下一项运算


EXP_TABL:

    DB    77H, 0B1H, 0C9H, 00H    ; 1.3564 * 10(-3)

    DB    7AH, 0A1H,  68H, 00H    ; 9.8514 * 10(-3)

    DB    7CH, 0E3H,  4FH, 00H    ; 0.055495

    DB    7EH, 0F5H, 0E7H, 00H    ; 0.24014

    DB    00H, 0B1H,  72H, 00H    ; 0.69315

    DB    01H,  80H,  00H, 00H    ; 1.000000

    DB    40H,  40H,  40H, 40H    ;结束

;-------------------------------------------

; (R4)R5R6R7

;-------------------------------------------

RLN:    MOV    A, R5        ;浮点数规格化

    ORL    A, R6        ;尾数为零否?

    ORL    A, R7

    JNZ    RLN1

    MOV    R4, #0C1H    ;阶码取最小值

    RET         

RLN1:    MOV    A, R5

    JB    ACC.7, RLN2    ;尾数最高位为一否?

    CLR    C        ;不为一,左规一次

    LCALL    RL1

    SJMP    RLN        ;继续判断

RLN2:    CLR    OV        ;规格化结束

    RET

RL1:    MOV    A, R7        ;第一操作数左规一次

    RLC    A        ;尾数扩大一倍

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    DEC    R4        ;阶码减一

    CJNE    R4, #0C0H, RL1E    ;阶码下溢否?

    CLR    A

    MOV    R5, A        ;阶码下溢,操作数以零计

    MOV    R6, A

    MOV    R7, A

    MOV    R4, #0C1H

RL1E:    CLR    OV

    RET

RR1:    MOV    A, R5    ;第一操作数右规一次

    RRC    A    ;尾数缩小一半

    MOV    R5, A

    MOV    A, R6

    RRC    A

    MOV    R6, A

    MOV    A, R7

    RRC    A

    MOV    R7, A

    INC    R4    ;阶码加一

    CLR    OV    ;清溢出标志

    CJNE    R4, #40H, RR1E    ;阶码上溢否?

    MOV    R4, #3FH    ;阶码溢出

    SETB    OV

RR1E:    RET


;-------------------------------------------

; 功能:浮点取整函数

;入口条件:操作数在[R0]中。

;出口信息:R4R5R6R7

;-------------------------------------------

FINT:

    MOV    A, @R0

    MOV    R4, A    ;阶存放在R4中

    INC    R0

    MOV    A, @R0    ;将尾数高字节存放在R5中

    MOV    R5, A

    INC    R0

    MOV    A, @R0    ;将尾数第二字节存放在R6中

    MOV    R4, A

    INC    R0

    MOV    A, @R0    ;将尾数第三字节存放在R7中

    MOV    R7, A

    DEC    R0    ;恢复数据指针

    DEC    R0

    DEC    R0

    LCALL    INT    ;在工作寄存器中完成取整运算

    RET


INT:    MOV    A, R5

    ORL    A, R6

    ORL    A, R7

    JNZ    INTA

    MOV    R4, #41H    ;尾数为零,阶码也清零,结束取整

    RET


INTA:    MOV    A, R4

    CLR    ACC.7

    JZ    INTB    ;阶码为零否?

    JB    ACC.6, INTB;阶符为负否?

    CLR    ACC.6

    CLR    C

    SUBB    A, #18H    ;阶码小于24否?

    JC    INTD

    RET        ;阶码大于24,已经是整数

INTB:    CLR    A      ;绝对值小于一,取整后正数为零,负数为负一

    MOV    R7, A

    MOV    R6, A

    MOV    R5, A

    MOV    R4, #41H

INTC:    RET


INTD:    CLR    F0    ;舍尾标志初始化

    MOV    A, R4

    CLR    ACC.7

    MOV    R0, A

    CLR    A

    MOV    R1, A

    MOV    R2, A

    MOV    R3, A

    CLR    C

INTE:    

    MOV    A, R7

    RLC    A

    MOV    R7, A

    MOV    A, R6

    RLC    A

    MOV    R6, A

    MOV    A, R5

    RLC    A

    MOV    R5, A

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    MOV    A, R1

    RLC    A

    MOV    R1, A

    DJNZ    R0, INTE    ;阶码

    MOV    A, R4

    CLR    ACC.7

    MOV    R0, A

    MOV    A, #18H

    CLR    C

    SUBB    A, R0

    MOV    R0, A

INTF:    CLR    C

    MOV    A, R3

    RLC    A

    MOV    R3, A

    MOV    A, R2

    RLC    A

    MOV    R2, A

    MOV    A, R1

    RLC    A

    MOV    R1, A

    DJNZ    R0, INTF

    MOV    A, R3

    MOV    R7, A

    MOV    A, R2

    MOV    R6, A

    MOV    A, R1

    MOV    R5, A

    RET



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式