bcdcal.s51

来自「一个电表的程序」· S51 代码 · 共 276 行

S51
276
字号
;Author: rom.cheng@analog.com
;Due to C limit of using DA instrution, BCD operations are not efficient in C program.
    NAME   BCDCal
    PUBLIC BCD32Inc
    FUNCTION BCD32Inc,0203H
    PUBLIC Hex32BCD
    FUNCTION Hex32BCD,0203H
    PUBLIC SendByte
    FUNCTION SendByte,0203H
    PUBLIC Hex2BCD
    FUNCTION Hex2BCD,0203H
    PUBLIC BCD2Hex
    FUNCTION BCD2Hex,0203H
    PUBLIC GetNbytesRam
    PUBLIC Hex16BCD
    FUNCTION Hex16BCD,0203H             ;2字节十六进制转换成2字节BCD码
    EXTERN ?V0



    RSEG NEAR_CODE:CODE:NOROOT(0)
BCD32Inc:
    ;PUSH    A
    MOV     A,R2
    ADD     A,#1
    DA      A
    MOV     R2,A
    JNZ     BCD32IncRET

    MOV     A,R3
    ADD     A,#1
    DA      A
    MOV     R3,A
    JNZ     BCD32IncRET

    MOV     A,R4
    ADD     A,#1
    DA      A
    MOV     R4,A
    JNZ     BCD32IncRET

    MOV     A,R5
    ADD     A,#1
    DA      A
    MOV     R5,A
    JNZ     BCD32IncRET

BCD32IncRET:
    ;POP     A
    RET

; 1 Byte HEX to 1 Byte BCD
; Input: R1
; Output:R1
; Resource: A, B, PSW
    RSEG NEAR_CODE:CODE:NOROOT(0)
Hex2BCD:
    PUSH PSW
    PUSH B
    PUSH A
    MOV  A,R1
    MOV  B,#10
    DIV  AB
    MOV  R1,B
    MOV  B,#10
    DIV  AB
    MOV  A,B
    SWAP A
    ORL  A,R1
    MOV  R1,A
    POP  A
    POP  B
    POP  PSW
    RET


; 1 Byte Send  SBUF
; Input: R1
; Resource: A,  PSW

TB8   EQU 0x9B
SBUF  EQU 0x99



SendByte:                  ;串口发送一个字节
    PUSH PSW
    PUSH A
    MOV A,R1
    MOV C,P
    MOV TB8,C
    MOV SBUF,A
    POP A
    POP PSW
    RET


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

; 1 Byte BCD to 1 Byte HEX
; Input: R1
; Output:R1
; Resource: A, B, PSW
    RSEG NEAR_CODE:CODE:NOROOT(0)
BCD2Hex:
    PUSH PSW
    PUSH B
    PUSH A
    MOV  A,R1
    MOV  B,#10h
    DIV  AB
    MOV  R1,B
    MOV  B,#10
    MUL  AB
    ADD  A,R1
    MOV  R1,A
    POP  A
    POP  B
    POP  PSW
    RET
    RSEG NEAR_CODE:CODE:NOROOT(0)


//   64 unsigned long Hex32BCD(unsigned long value)
Hex32BCD:
    PUSH    ?V0+0
    PUSH    ?V0+1
    PUSH    ?V0+2
    PUSH    ?V0+3
    PUSH    ?V0+4
    PUSH    ?V0+5
    PUSH    ?V0+6
    PUSH    ?V0+7
    MOV ?V0+0, #0
    MOV ?V0+1, #0
    MOV ?V0+2, #0
    MOV ?V0+3, #0
    MOV ?V0+4, R2
    MOV ?V0+5, R3
    MOV ?V0+6, R4
    MOV ?V0+7, R5

    MOV R3, #32
LOOP1:

    MOV R1,#?V0+4
    MOV R2,#4
    CLR C
LOOP2:
    MOV A,@R1
    RLC A
    MOV @R1,A
    INC R1
    DJNZ R2,LOOP2

    MOV R1,#?V0 + 0
    MOV R2,#4
LOOP3:
    MOV A, @R1
    ADDC A,@R1
    DA  A
    MOV @R1,A
    INC R1
    DJNZ R2, LOOP3

    DJNZ R3, LOOP1
    MOV R2,?V0+0
    MOV R3,?V0+1
    MOV R4,?V0+2
    MOV R5,?V0+3
    POP ?V0+7
    POP ?V0+6
    POP ?V0+5
    POP ?V0+4
    POP ?V0+3
    POP ?V0+2
    POP ?V0+1
    POP	?V0+0
    RET


; 2 Byte HEX to 2 Byte  BCD
; Input: R2,R3
; Output:R2,R3
; Resource: A, B, PSW

   RSEG NEAR_CODE:CODE:NOROOT(0)
Hex16BCD:
    PUSH    ?V0+0
    PUSH    ?V0+1
    PUSH    PSW
    PUSH    A
    PUSH    B
    MOV ?V0+0, #0
    MOV ?V0+1, #0

    MOV B, #16
LOOP16_1:
    MOV A,R2
    RLC A
    MOV R2,A
    MOV A,R3
    RLC A
    MOV R3,A

    MOV A,?V0+0
    ADDC A,?V0+0
    DA  A
    MOV ?V0+0, A
    MOV A,?V0+1
    ADDC A,?V0+1
    DA  A
    MOV ?V0+1, A
    DJNZ B, LOOP16_1
    MOV R2,?V0+0
    MOV R3,?V0+1
    POP     B
    POP     A
    POP     PSW
    POP    ?V0+1
    POP    ?V0+0
    RET



    RSEG NEAR_CODE:CODE:NOROOT(0)
BCD16Inc:
    ;PUSH    A
    MOV     A,R2
    ADD     A,#1
    DA      A
    MOV     R2,A
    JNZ     BCD16IncRET

    MOV     A,R3
    ADD     A,#1
    DA      A
    MOV     R3,A
BCD16IncRET:
    RET




    RSEG NEAR_CODE:CODE:NOROOT(0)
GetNbytesRam:
    PUSH ?V0+0
    MOV A,R2
    MOV R2,#0
    MOV R3,#0
    MOV R4,#0
    MOV R5,#0
    MOV ?V0+0,@R1
    MOV R2,?V0+0
    DEC A
    JZ  RET_NBYTES

    INC R1
    MOV ?V0+0,@R1
    MOV R3,?V0+0
    DEC A
    JZ  RET_NBYTES

    INC R1
    MOV ?V0+0,@R1
    MOV R4,?V0+0
    DEC A
    JZ  RET_NBYTES
    INC R1
    MOV ?V0+0,@R1
    MOV R5,?V0+0
RET_NBYTES:
    POP ?V0+0
    RET
    ENDMOD
    END

⌨️ 快捷键说明

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