辛普生积分程序
内部RAM数据排序程序(升序)
外部RAM数据排序程序(升序)
外部RAM浮点数排序程序(升序)
BCD小数转换为二进制小数(2位)
BCD小数转换为二进制小数(N位)
BCD整数转换为二进制整数(1位)
BCD整数转换为二进制整数(2位)
BCD整数转换为二进制整数(3位)
BCD整数转换为二进制整数(N位)
二进制小数(2位)转换为十进制小数(分离BCD码)
二进制小数(M位)转换为十进制小数(分离BCD码)
二进制整数(2位)转换为十进制整数(分离BCD码)
二进制整数(2位)转换为十进制整数(组合BCD码)
二进制整数(3位)转换为十进制整数(分离BCD码)
二进制整数(3位)转换为十进制整数(组合BCD码)
二进制整数(M位)转换为十进制整数(组合BCD码)
三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7
;辛普生积分程序
;入口: DPTR,N,COUNT
;占用资源: ACC,R3,R4,R6,R7
;堆栈需求: 2字节
;出口: R3,R4
SJF : MOV R7,N
MOVX A,@DPTR
INC DPTR
MOV R4,A
MOV R3,#00H
DEC R7
SJF1 : MOVX A,@DPTR
INC DPTR
CLR C
RLC A
MOV R6,A
CLR A
RLC A
XCH A,R7
JNB ACC.0,SJF2
XCH A,R6
RLC A
XCH A,R6
XCH A,R7
RLC A
XCH A,R7
SJF2 : XCH A,R7
XCH A,R6
ADD A,R4
MOV R4,A
MOV A,R6
ADDC A,R3
MOV R3,A
DJNZ R7,SJF1
SJF3 : MOVX A,@DPTR
ADD A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
MOV R7,#COUNT
LCALL NMUL21
MOV A,N
MOV B,#03H
MUL AB
MOV R7,A
LCALL NDIV31
RET
NMUL21 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
NDIV31 : MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
RET
;内部RAM数据排序程序(升序)
;入口: R0(起始地址),N(数据个数)
;占用资源: ACC,B,R5,R6,R7
;堆栈需求: 2字节
;出口: R0
ISELSORT : MOV R7,N
DEC R7
ISST1: MOV A,R7
MOV R6,A
MOV A,R0
MOV R1,A
MOV R2,A
MOV B,@R1
ISST2: INC R1
MOV A,@R1
CLR C
SUBB A,B
JC ISST3
MOV A,R1
MOV R2,A
MOV B,@R1
ISST3: DJNZ R6,ISST2
MOV A,B
XCH A,@R1
MOV B,R2
MOV R1,B
MOV @R1,A
DJNZ R7,ISST1
RET
;外部RAM数据排序程序(升序)
;入口: ADDPH,ADDPL(起始地址),N(数据个数)
;占用资源: ACC,B,R0,R1,R5,R7
;堆栈需求: 2字节
;出口: ADDPH-ADDPL
ESELSORT : MOV R7,N
DEC R7
ESST1: MOV A,R7
MOV R6,A
MOV DPL,ADDPL
MOV R1,DPL
MOV DPH,ADDPH
MOV R0,DPH
MOVX A,@DPTR
MOV B,A
ESST2: INC DPTR
MOVX A,@DPTR
CLR C
SUBB A,B
JC ESST3
MOV R0,DPL
MOV R1,DPH
MOVX A,@DPTR
MOV B,A
ESST3: DJNZ R6,ESST2
MOVX A,@DPTR
XCH A,B
MOVX @DPTR,A
MOV DPL,R0
MOV DPH,R1
MOV A,B
MOVX @DPTR,A
DJNZ R7,ESST1
RET
;外部RAM浮点数排序程序(升序)
;入口: ADDPH,ADDPL(起始地址),N(数据个数)
;占用资源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT
;堆栈需求: 5字节
;出口: ADDPH,ADDPL
FSORT: MOV A,N
MOV NCNT,A
DEC NCNT
FST1 : MOV B,NCNT
MOV DPL,ADDPL
MOV R1,DPL
MOV DPH,ADDPH
MOV R0,DPH
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
FST2 : INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
PUSH B
LCALL FCMP
POP B
JNC FST4
MOV A,DPL
CLR C
SUBB A,#02H
MOV R1,A
MOV R0,DPH
JNC FST3
DEC R0
FST3 : MOV A,R5
MOV R2,A
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
FST4 : DJNZ B,FST2
MOV A,DPL
CLR C
SUBB A,#02H
MOV DPL,A
JNC FST5
DEC DPH
FST5 : MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R4
MOVX @DPTR,A
MOV A,R0
MOV P2,A
MOV A,R5
MOVX @R1,A
INC R1
MOV A,R6
MOVX @R1,A
INC R1
MOV A,R7
MOVX @R1,A
DJNZ NCNT,FST1
RET
;BCD小数转换为二进制小数(2位)
;入口: R0(低位首址),R7
;占用资源: ACC,B,R5
;堆栈需求: 2字节
;出口: R3,R4
PDTB : CLR A
MOV R3,A
MOV R4,A
PDB1 : MOV A,R3
MOV B,#9AH
MUL AB
MOV R5,B
XCH A,R4
MOV B,#19H
MUL AB
ADD A,R4
MOV A,R5
ADDC A,B
MOV R5,A
MOV A,@R0
MOV B,#9AH
MUL AB
ADD A,R5
MOV R4,A
CLR A
ADDC A,B
XCH A,R3
MOV B,#19H
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,@R0
MOV B,#19H
MUL AB
ADD A,R3
MOV R3,A
DEC R0
DJNZ R7,PDB1
RET
;BCD小数转换为二进制小数(N位)
;入口: R1(低位首址),M,N
;占用资源: ACC,B,R2,R3,R7
;堆栈需求: 2字节
;出口: R0
PDTBMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV B,N
CLR A
PDBMN1 : MOV @R0,A
INC R0
DJNZ B,PDBMN1
MOV A,N
SWAP A
RR A
MOV R7,A
PDBMN2 : MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV B,M
CLR C
PDBMN3 : MOV A,@R1
ADDC A,@R1
DA A
JNB ACC.4,PDBMN4
SETB C
CLR ACC.4
PDBMN4 : MOV @R1,A
INC R1
DJNZ B,PDBMN3
MOV B,N
PDBMN5 : MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ B,PDBMN5
DJNZ R7,PDBMN2
MOV A,R2
MOV R0,A
RET
;BCD整数转换为二进制整数(1位)
;入口: R0(高位地址),R7
;占用资源: ACC,B
;堆栈需求: 2字节
;出口: R4
IDTB1: CLR A
MOV R4,A
IDB11: MOV A,R4
MOV B,#0AH
MUL AB
ADD A,@R0
INC R0
MOV R4,A
DJNZ R7,IDB11
RET
;BCD整数转换为二进制整数(2位)
;入口: R0(高位地址),R7
;占用资源: ACC,B
;堆栈需求: 2字节
;出口: R3,R4
IDTB2: CLR A
MOV R3,A
MOV R4,A
IDB21: MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
MOV A,R4
ADD A,@R0
INC R0
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
DJNZ R7,IDB21
RET
;BCD整数转换为二进制整数(3位)
;入口: R0(高位地址),R7
;占用资源: ACC,B
;堆栈需求: 2字节
;出口: R2,R3,R4
IDTB3: CLR A
MOV R2,A
MOV R3,A
MOV R4,A
IDB31: MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
XCH A,R2
MOV B,#0AH
MUL AB
ADD A,R2
MOV R2,A
MOV A,R4
ADD A,@R0
INC R0
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
DJNZ R7,IDB31
RET
;BCD整数转换为二进制整数(N位)
;入口: R1(高位地址),M,N
;占用资源: ACC,B,R2,R7,NCNT,F0
;堆栈需求: 2字节
;出口: R0
IDTBMN : MOV A,R0
MOV R2,A
MOV B,N
CLR A
IDBMN1 : MOV @R0,A
INC R0
DJNZ B,IDBMN1
MOV A,R2
MOV R0,A
MOV A,M
MOV NCNT,A
IDBMN2 : MOV R7,N
CLR A
CLR F0
IDBMN3 : XCH A,@R0
MOV B,#0AH
MUL AB
MOV C,F0
ADDC A,@R0
MOV F0,C
MOV @R0,A
INC R0
MOV A,B
DJNZ R7,IDBMN3
MOV A,R2
MOV R0,A
MOV A,@R1
INC R1
ADD A,@R0
MOV @R0,A
DJNZ NCNT,IDBMN2
RET
;二进制小数(2位)转换为十进制小数(分离BCD码)
;入口: R3,R4,R7
;占用资源: ACC,B
;堆栈需求: 3字节
;出口: R0
PBTD : MOV A,R7
PUSH A
PBD1 : MOV A,R4
MOV B,#0AH
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#0AH
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV @R0,A
INC R0
DJNZ R7,PBD1
POP A
MOV R7,A
MOV A,R0
CLR C
SUBB A,R7
MOV R0,A
RET
;二进制小数(M位)转换为十进制小数(分离BCD码)
;入口: R1,M,N
;占用资源: ACC,B,R2,R3,R7,NCNT
;堆栈需求: 2字节
;出口: R0
PBTDMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV A,N
MOV NCNT,A
PBDMN1 : MOV R7,M
CLR A
CLR F0
PBDMN2 : XCH A,@R1
MOV B,#0AH
MUL AB
MOV C,F0
ADDC A,@R1
MOV F0,C
MOV @R1,A
INC R1
MOV A,B
DJNZ R7,PBDMN2
ADDC A,#00H
MOV @R0,A
INC R0
MOV A,R3
MOV R1,A
DJNZ NCNT,PBDMN1
MOV A,R2
MOV R0,A
RET
;二进制整数(2位)转换为十进制整数(分离BCD码)
;入口: R3,R4
;占用资源: ACC,R2,NDIV31
;堆栈需求: 5字节
;出口: R0,NCNT
IBTD21 : MOV NCNT,#00H
MOV R2,#00H
IBD211 : MOV R7,#0AH
LCALL NDIV31
MOV A,R7
MOV @R0,A
INC R0
INC NCNT
MOV A,R3
ORL A,R4
JNZ IBD211
MOV A,R0
CLR C
SUBB A,NCNT
MOV R0,A
RET
;二进制整数(2位)转换为十进制整数(组合BCD码)
;入口: R3,R4
;占用资源: ACC,B,R7
;堆栈需求: 3字节
;出口: R0
IBTD22 : MOV A,R0
PUSH A
MOV R7,#03H
CLR A
IBD221 : MOV @R0,A
INC R0
DJNZ R7,IBD221
POP A
MOV R0,A
MOV R7,#10H
IBD222 : PUSH A
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV B,#03H
IBD223 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD223
POP A
MOV R0,A
DJNZ R7,IBD222
RET
;二进制整数(3位)转换为十进制整数(分离BCD码)
;入口: R2,R3,R4
;占用资源: ACC,R2,NDIV31
;堆栈需求: 5字节
;出口: R0,NCNT
IBTD31 : CLR A
MOV NCNT,A
IBD311 : MOV R7,#0AH
LCALL NDIV31
MOV A,R7
MOV @R0,A
INC R0
INC NCNT
MOV A,R2
ORL A,R3
ORL A,R4
JNZ IBD311
MOV A,R0
CLR C
SUBB A,NCNT
MOV R0,A
RET
;二进制整数(3位)转换为十进制整数(组合BCD码)
;入口: R2,R3,R4
;占用资源: ACC,B,R7
;堆栈需求: 3字节
;出口: R0
IBTD32 : MOV A,R0
PUSH A
MOV R7,#04H
CLR A
IBD321 : MOV @R0,A
INC R0
DJNZ R7,IBD321
POP A
MOV R0,A
MOV R7,#18H
IBD322 : PUSH A
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV B,#04H
IBD323 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD323
POP A
MOV R0,A
DJNZ R7,IBD322
RET
;二进制整数(M位)转换为十进制整数(组合BCD码)
;入口: R1,M,N
;占用资源: ACC,B,R2,R3,R7
;堆栈需求: 2字节
;出口: R0
IBTDMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV B,N
CLR A
IBDMN1 : MOV @R0,A
INC R0
DJNZ B,IBDMN1
MOV A,M
SWAP A
RR A
CLR C
MOV R7,A
IBDMN2 : MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV B,M
IBDMN3 : MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ B,IBDMN3
MOV B,N
IBDMN4 : MOV A,@R0
ADDC A,@R0
DA A
JNB ACC.4,IBDMN5
SETB C
CLR ACC.4
IBDMN5 : MOV @R0,A
INC R0
DJNZ B,IBDMN4
DJNZ R7,IBDMN2
MOV A,R2
MOV R0,A
RET
;三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7
;入口: R2,R3,R4,R7
;占用资源: ACC,B,F0
;堆栈需求: 3字节
;出口: (R2),R3,R4,R7,OV
NDIV31 : MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET