⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ¿

📁 该文件里包含了大量的常用经典的程序代码,可以为51编程者带来事半功倍的效果,
💻
📖 第 1 页 / 共 2 页
字号:

;          定点库程序库整理 1999-5-27               ;

;***************************************************;

;程序功能			             程序名称

;01.多字节BCD加法 				BCDA
;02.多字节BCD减法				BCDB
;03.多字节BCD求补				BEG
;04.多字节BCD码右移一位(乘10)           	BRLN
;05.多字节二进制无符号数乘法			MULD
;06.双字节二进制无符号数平方			MUL2
;07.双字节二进制无符号数除法			DIVD
;08.双字节二进制无符号数除以单字节二进制数 	D457
;09.三字节二进制无符号数除以单字节二进制数	DV31
;10.双字节二进制有符号数乘法(补码)		MULS
;11.双字节二进制有符号数除法(补码)		DIVS
;12.双字节二进制无符号数开平方(快速)		SH2
;13.四字节二进制无符号数开平方(快速)		SH4
;14.单字节十六进制数转换成双字节ASCII码		HASC
;15.ASCII码转换成十六进制数			ASCH
;16.单字节十六进制整数转换成单字节BCD码整数	HBCD
;17.双字节十六进制整数转换成双字节BCD码整数  	HB2 
;18.单字节十六进制小数转换成单字节BCD码小数  	HBD
;19.双字节十六进制小数转换成双字节BCD码小数	HBD2
;20.单字节BCD码整数转换成单字节十六进制整数	BCDH
;21.双字节BCD码整数转换成双字节十六进制整数	BH2
;22.单字节BCD码小数转换成单字节十六进制小数	BHD
;23.双字节BCD码小数转换成双字节十六进制小数	BHD2
;24.求单字节十六进制无符号数据块的极值		MM
;25.求单字节十六进制有符号数据块的极值		MMS
;26.顺序查找(ROM)单字节表格			FDS1
;27.顺序查找(ROM)双字节表格			FDS2
;28.对分查找(ROM)单字节无符号增序数据表格	FDD1
;29.对分查找(ROM)双字节无符号增序数据表格  	FDD2
;30.求单字节十六进制无符号数据块的平均值	DDM1
;31.求双字节十六进制无符号数据块的平均值	DDM2
;32.求单字节数据块的(异或)校验和		XR1
;33.求双字节数据块的(异或)校验和		XR2
;34.单字节无符号数据块排序(增序)		SORT

                                                   
;****** [多字节BCD加法] BCDA ********************;
;
;入口条件: 	字节数在R7中,被加数在[R0]中,加数在[R1]中。
;出口信息: 	和在[R0]中,最高位进位在CY中。
;影响资源:      PSW、A、R2    堆栈需求:  2字节 进位在 C 中
;调用子程序:    无

BCDA:	MOV	A,R7
	MOV	R2,A
	ADD	A,R0
	MOV	R0,A
	MOV	A,R2
	ADD	A,R1
	MOV	R1,A
	CLR	C
BCD1:	DEC	R0
	DEC	R1
	MOV	A,@R0
	ADDC	A,@R1
	DA	A
	MOV	@R0,A
	DJNZ	R2,BCD1
	RET                                       
	
;------------------------------------------------;

;****** [多字节BCD减法] BCDB ********************;

;入口条件:	字节数在R7中,被减数在[R0]中,减数在[R1]中。
;出口信息:	差在[R0]中,最高位借位在CY中。
;影响资源:	PSW、A、R2、R3    堆栈需求:  6字节
;调用子程序:    1个 NEG 多字节求补程序 

BCDB:	LCALL	NEG1		;多字节BCD求补
	LCALL	BCDA            ;多字节BCD加法
	CPL	C
	MOV	F0,C
	LCALL	NEG1            ;多字节BCD求补
	MOV	C,F0
	RET     
	
NEG1:	MOV	A,R0
	XCH	A,R1
	XCH	A,R0
	LCALL	NEG             ;多字节BCD求补
	MOV	A,R0
	XCH	A,R1
	XCH	A,R0
	RET                 
	
;------------------------------------------------;

;****** [多字节BCD求补] NEG *********************;

;入口条件:	字节数在R7中,操作数在[R0]中。
;出口信息:	结果仍在[R0]中。
;影响资源:	PSW、A、R2、R3    堆栈需求:  2字节
;调用子程序:    无
	
NEG:	MOV	A,R7
	DEC	A
	MOV	R2,A
	MOV	A,R0
	MOV	R3,A
NEG0:	CLR	C
	MOV	A,#99H
	SUBB	A,@R0
	MOV	@R0,A
	INC	R0
	DJNZ	R2,NEG0
	MOV	A,#9AH
	SUBB	A,@R0
	MOV	@R0,A
	MOV	A,R3
	MOV	R0,A
	RET
	
;------------------------------------------------;

;****** [多字节BCD码左移十进制一位(乘十)] BRLN **;

;入口条件:	字节数在R7中,操作数在[R0]中。
;出口信息:	结果仍在[R0]中,移出的十进制最高位在R3中。
;影响资源:	PSW、A、R2、R3    堆栈需求:  2字节
;调用子程序:    无
	
BRLN:	MOV	A,R7
   	MOV	R2,A
	ADD	A,R0
	MOV	R0,A
	MOV	R3,#0
BRL1:	DEC	R0
	MOV	A,@R0
	SWAP	A
	MOV	@R0,A
	MOV	A,R3
	XCHD	A,@R0
	MOV	R3,A
	DJNZ	R2,BRL1
	RET     

;------------------------------------------------;
	
;****** [双字节二进制无符号数乘法] MULD *********;

;入口条件:	被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:	乘积在R2、R3、R4、R5中。
;影响资源:	PSW、A、B、R2~R7    堆栈需求:  2字节
;调用子程序:    无

MULD:	MOV	A,R3
	MOV	B,R7
	MUL	AB
	MOV	R4,B
	MOV	R5,A
	MOV	A,R3
	MOV	B,R6
	MUL	AB
	ADD	A,R4
	MOV	R4,A
	CLR	A
	ADDC	A,B
	MOV	R3,A
	MOV	A,R2
	MOV	B,R7
	MUL	AB
	ADD	A,R4
	MOV	R4,A
	MOV	A,R3
	ADDC	A,B
	MOV	R3,A
	CLR	A
	RLC	A
	XCH	A,R2
	MOV	B,R6
	MUL	AB
	ADD	A,R3
	MOV	R3,A
	MOV	A,R2
	ADDC	A,B
	MOV	R2,A
	RET
	
;------------------------------------------------;

;****** [双字节二进制无符号数平方] MUL2 *********;

;入口条件:	待平方数在R2、R3中。
;出口信息:	结果在R2、R3、R4、R5中。
;影响资源:	PSW、A、B、R2~R5    堆栈需求:  2字节
;调用子程序:    无
	
MUL2:	MOV	A,R3
	MOV	B,A
	MUL	AB
	MOV	R4,B
	MOV	R5,A
	MOV	A,R2
	MOV	B,A
	MUL	AB
	XCH	A,R3
	XCH	A,B
	XCH	A,R2
	MUL	AB
	CLR	C
	RLC	A
	XCH	A,B
	RLC	A
	JNC	MU20
	INC	R2
MU20:	XCH	A,B
	ADD	A,R4
	MOV	R4,A
	MOV	A,R3
	ADDC	A,B
	MOV	R3,A
	CLR	A
	ADDC	A,R2
	MOV	R2,A
	RET
	
;------------------------------------------------;

;****** [双字节二进制无符号数除法] DIVD *********;

;入口条件:	被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:	OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:	PSW、A、B、R1~R7    堆栈需求:  2字节
;调用子程序:   无
	
DIVD:	CLR	C
	MOV	A,R3
	SUBB	A,R7
	MOV	A,R2
	SUBB	A,R6
	JC	DVD1
	SETB	OV
	RET
DVD1:	MOV	B,#10H
DVD2:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	XCH	A,R2
	RLC	A
	XCH	A,R2
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	MOV	R1,A
	MOV	A,R2
	SUBB	A,R6
	ANL	C,/F0
	JC	DVD3
	MOV	R2,A
	MOV	A,R1
	MOV	R3,A
	INC	R5
DVD3:	DJNZ	B,DVD2
	MOV	A,R4
	MOV	R2,A
	MOV	A,R5
	MOV	R3,A
	CLR	OV
	RET

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

;****** [双字节二进制无符号数除以单字节二进制数] D457 ;	

;入口条件:	被除数在R4、R5中,除数在R7中。
;出口信息:	OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源:	PSW、A、R3~R7    堆栈需求:  2字节
;调用子程序:    无

D457:	CLR	C
	MOV	A,R4
	SUBB	A,R7
	JC	DV50
	SETB	OV
	RET
DV50:	MOV	R6,#8
DV51:	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	ANL	C,/F0
	JC	DV52
	MOV	R4,A
DV52:	CPL	C
	MOV	A,R3
	RLC	A
	MOV	R3,A
	DJNZ	R6,DV51
	MOV	A,R4
	ADD	A,R4
	JC	DV53
	SUBB	A,R7
	JC	DV54
DV53:	INC	R3
DV54:	CLR	OV
	RET     
	
;------------------------------------------------;

;****** [三字节二进制无符号数除以单字节二进制数] DV31 ;

;入口条件:	被除数在R3、R4、R5中,除数在R7中。
;出口信息:	OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
;影响资源:	PSW、A、B、R2~R7    堆栈需求:  2字节
;调用子程序:   无
	
DV31:	CLR	C
	MOV	A,R3
	SUBB	A,R7
	JC	DV30
	SETB	OV
	RET         
DV30:	MOV	R2,#10H
DM23:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	ANL	C,/F0
	JC	DM24
	MOV	R3,A
	INC	R5
DM24:	DJNZ	R2,DM23
	MOV	A,R3
	ADD	A,R3
	JC	DM25
	SUBB	A,R7
	JC	DM26
DM25:	INC	R5
	MOV	A,R5
	JNZ	DM26
	INC	R4
DM26:	CLR	OV
	RET                         
	
;------------------------------------------------;

;****** [双字节二进制有符号数乘法(补码)] MULS ***;

;入口条件:	被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:	乘积在R2、R3、R4、R5中。
;影响资源:	PSW、A、B、R2~R7    堆栈需求:  4字节
;调用子程序:	3个,MDS MULD MDSE

MULS:	MOV	R4,#0
	MOV	R5,#0
	ACALL	MDS		;计算结果的符号和两个操作数的绝对值
	ACALL	MULD		;计算两个绝对值的乘积
	ACALL	MDSE            ;用补码表示结果
	RET

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

;****** [双字节二进制有符号数除法(补码)] DIVS ***;

;入口条件:	被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:	OV=0时商在R2、R3中,OV=1时溢出。
;影响资源:	PSW、A、B、R1~R7    堆栈需求:  5字节
;调用子程序:    2个 MDS DIVD

DIVS:	LCALL	MDS             ;计算结果的符号和两个操作数的绝对值
	PUSH	PSW
	LCALL	DIVD		;计算两个绝对值的商
	JNB	OV,DVS1
	POP	ACC
	RET
DVS1:	POP	PSW
	MOV	R4,#0
	MOV	R5,#0
MDSE:	JB	F0,MDS2		;用补码表示结果
	CLR	OV
	RET     
MDS:	CLR	F0
	MOV	A,R6
	JNB	ACC.7,MDS1
	CPL	F0
	XCH	A,R7
	CPL	A
	ADD	A,#1
	XCH	A,R7
	CPL	A
	ADDC	A,#0
	MOV	R6,A
MDS1:	MOV	A,R2
	JNB	ACC.7,MDS3
	CPL	F0
MDS2:	MOV	A,R5
	CPL	A
	ADD	A,#1
	MOV	R5,A
	MOV	A,R4
	CPL	A
	ADDC	A,#0
	MOV	R4,A
	MOV	A,R3
	CPL	A
	ADDC	A,#0
	MOV	R3,A
	MOV	A,R2
	CPL	A
	ADDC	A,#0
	MOV	R2,A
MDS3:	CLR	OV
	RET
	
;------------------------------------------------;

;****** [双字节二进制无符号数开平方(快速)] SH2 **;

;入口条件:	被开方数在R2、R3中。
;出口信息:	平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:	PSW、A、B、R2~R7    堆栈需求:  4字节
;调用子程序:   1个 SQRH

SH2:	MOV	A,R2
	ORL	A,R3
	JNZ	SH20
	RET
SH20:	MOV	R7,#0
	MOV	A,R2
SH22:	ANL	A,#0C0H
	JZ	SH33
        ACALL	SQRH
SH33:	CLR	C
	MOV	A,R3
	RLC	A
	MOV	F0,C
	CLR	C
	RLC	A
	MOV	R3,A
	MOV	A,R2
	MOV	ACC.7,C
	MOV	C,F0
	RLC	A
	RLC	A
	MOV	R2,A
	INC	R7
	AJMP	SH22        

;------------------------------------------------;
	
;****** [四字节二进制无符号数开平方(快速)] SH4 **;

;入口条件:	被开方数在R2、R3、R4、R5中。
;出口信息:	平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:	PSW、A、B、R2~R7    堆栈需求:  2字节
;调用子程序:    无
	
SH4:	MOV	A,R2
	ORL	A,R3
	ORL	A,R4
	ORL	A,R5
	JNZ	SH40
	RET
SH40:	MOV	R7,#0
	MOV	A,R2
SH41:	ANL	A,#0C0H
	JNZ	SQRH
	MOV	R6,#2
SH42:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	A,R2
	RLC	A
	MOV	R2,A
	DJNZ	R6,SH42
	INC	R7
	AJMP	SH41
SQRH:	MOV	A,R2
	ADD	A,#57H
	JC	SQR2
	ADD	A,#45H
	JC	SQR1
	ADD	A,#24H
	MOV	B,#0E3H
	MOV	R4,#80H
	AJMP	SQR3
SQR1:	MOV	B,#0B2H
	MOV	R4,#0A0H
	AJMP	SQR3
SQR2:	MOV	B,#8DH
	MOV	R4,#0D0H
SQR3:	MUL	AB
	MOV	A,B
	ADD	A,R4
	MOV	R4,A
	MOV	B,A
	MUL	AB
	XCH	A,R3
	CLR	C
	SUBB	A,R3
	MOV	R3,A
	MOV	A,R2
	SUBB	A,B
	MOV	R2,A
SQR4:	SETB	C
	MOV	A,R4
	RLC	A
	MOV	R6,A
	CLR	A
	RLC	A
	MOV	R5,A
	MOV	A,R3
	SUBB	A,R6
	MOV	B,A
	MOV	A,R2
	SUBB	A,R5
	JC	SQR5
	INC	R4
	MOV	R2,A
	MOV	R3,B
	AJMP	SQR4
SQR5:	MOV	A,R4
	XCH	A,R2
	RRC	A
	MOV	F0,C
	MOV	A,R3
	MOV	R5,A
	MOV	R4,#8
SQR6:	CLR	C
	MOV	A,R3
	RLC	A
	MOV	R3,A
	CLR	C
	MOV	A,R5
	SUBB	A,R2
	JB	F0,SQR7
	JC	SQR8
SQR7:	MOV	R5,A
	INC	R3
SQR8:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	F0,C
	DJNZ	R4,SQR6
	MOV	A,R7
	JZ	SQRE
SQR9:	CLR	C
	MOV	A,R2
	RRC	A
	MOV	R2,A
	MOV	A,R3
	RRC	A
	MOV	R3,A
	DJNZ	R7,SQR9
SQRE:	RET                

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

;****** [单字节十六进制数转换成双字节ASCII码] HASC

;入口条件:	待转换的单字节十六进制数在累加器A中。
;出口信息:	高四位的ASCII码在A中,低四位的ASCII码在B中。
;影响资源:	PSW、A、B    堆栈需求:  4字节
;调用子程序:    1个 HAS1 内部

HASC:	MOV	B,A
	ACALL	HAS1
	XCH	A,B
	SWAP	A
HAS1:	ANL	A,#0FH
	ADD	A,#90H
	DA	A
	ADDC	A,#40H
	DA	A
	RET                      
	
;------------------------------------------------;

;****** [ASCII码转换成十六进制数] ASCH **********;

;入口条件:	待转换的ASCII码(30H~39H或41H~46H)在A中。
;出口信息:	转换后的十六进制数(00H~0FH)仍在累加器A中。
;影响资源:	PSW、A    堆栈需求:  2字节
;调用子程序:   无

ASCH:	CLR	C
	SUBB	A,#30H
	JNB	ACC.4,ASH1
	SUBB	A,#7
ASH1:	RET     

⌨️ 快捷键说明

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