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 + -
显示快捷键?