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

📄 51.asm

📁 单片机定点运算子程序库
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	DJNZ	R6,BHD3	 ;共计算16bit小数
	MOV	A,R4
	ADD	A,#0B0H	 ;剩余部分达到0.50否?
	JNC	BHD4	 ;四舍
	INC	R3	 ;五入
	MOV	A,R3
	JNZ	BHD4
	INC	R2
BHD4:	RET

;(24)标号:MM  功能:求单字节十六进制无符号数据块的极值

;入口条件:数据块的首址在DPTR中,数据个数在R7中。
;出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
;影响资源:PSW、A、B、R1~R7      堆栈需求:  4字节

MM:	MOV	B,R7	 ;保存数据个数
	MOVX	A,@DPTR	 ;读取第一个数据
	MOV	R6,A	 ;作为最大值的初始值
	MOV	R7,A	 ;也作为最小值的初始值
	MOV	A,DPL	 ;取第一个数据的地址
	MOV	R3,A	 ;作为最大值存放地址的初始值
	MOV	R5,A	 ;也作为最小值存放地址的初始值
	MOV	A,DPH
	MOV	R2,A
	MOV	R4,A

	MOV	A,B	 ;取数据个数
	DEC	A	 ;减一,得到需要比较的次数
	JZ	MME	 ;只有一个数据,不需要比较
	MOV	R1,A	 ;保存比较次数
	PUSH	DPL	 ;保护数据块的首址
	PUSH	DPH
MM1:	INC	DPTR	 ;指向一个新的数据
	MOVX	A,@DPTR	 ;读取这个数据
	MOV	B,A	 ;保存
	SETB	C	 ;与最大值比较
	SUBB	A,R6
	JC	MM2	 ;不超过当前最大值,保持当前最大值
	MOV	R6,B	 ;超过当前最大值,更新最大值存放地址
	MOV	R2,DPH	 ;同时更新最大值存放地址
	MOV	R3,DPL
	SJMP	MM3
MM2:	MOV	A,B	 ;与最小值比较

	CLR	C
	SUBB	A,R7
	JNC	MM3	 ;大于或等于当前最小值,保持当前最小值
	MOV	R7,B	 ;更新最小值
	MOV	R4,DPH	 ;更新最小值存放地址
	MOV	R5,DPL
MM3:	DJNZ	R1,MM1	 ;处理完全部数据
	POP	DPH	 ;恢复数据首址
	POP	DPL
MME:	RET

;(25)标号:MMS 功能:求单字节十六进制有符号数据块的极值

;入口条件:数据块的首址在DPTR中,数据个数在R7中。
;出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
;影响资源:PSW、A、B、R1~R7    堆栈需求:  4字节


MMS:	MOV	B,R7	 ;保存数据个数
	MOVX	A,@DPTR	 ;读取第一个数据
	MOV	R6,A	 ;作为最大值的初始值
	MOV	R7,A	 ;也作为最小值的初始值
	MOV	A,DPL	 ;取第一个数据的地址
	MOV	R3,A	 ;作为最大值存放地址的初始值
	MOV	R5,A	 ;也作为最小值存放地址的初始值
	MOV	A,DPH
	MOV	R2,A
	MOV	R4,A
	MOV	A,B	 ;取数据个数
	DEC	A	 ;减一,得到需要比较的次数
	JZ	MMSE	 ;只有一个数据,不需要比较
	MOV	R1,A	 ;保存比较次数
	PUSH	DPL	 ;保护数据块的首址
	PUSH	DPH

MMS1:	INC	DPTR	 ;调整数据指针
	MOVX	A,@DPTR	 ;读取一个数据
	MOV	B,A	 ;保存
	SETB	C	 ;与最大值比较
	SUBB	A,R6
	JZ	MMS4	 ;相同,不更新最大值
	JNB	OV,MMS2	 ;差未溢出,符号位有效
	CPL	ACC.7	 ;差溢出,符号位取反
MMS2:	JB	ACC.7,MMS4 ;差为负,不更新最大值
	MOV	R6,B	 ;更新最大值
	MOV	R2,DPH	 ;更新最大值存放地址
	MOV	R3,DPL
	SJMP	MMS7
MMS4:	MOV	A,B	 ;与最小值比较
	CLR	C
	SUBB	A,R7
	JNB	OV,MMS6	 ;差未溢出,符号位有效
	CPL	ACC.7	 ;差溢出,符号位取反

MMS6:	JNB	ACC.7,MMS7 ;差为正,不更新最小值
	MOV	R7,B	 ;更新最小值
	MOV	R4,DPH	 ;更新最小值存放地址
	MOV	R5,DPL
MMS7:	DJNZ	R1,MMS1	 ;处理完全部数据
	POP	DPH	 ;恢复数据首址
	POP	DPL
MMSE:	RET

;(26)标号:FDS1 功能:顺序查找(ROM)单字节表格

;入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。
;出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。
;影响资源:PSW、A、B、R2、R6      堆栈需求:  2字节

FDS1:	MOV	B,A	 ;保存待查找的内容

	MOV	R2,#0	 ;顺序号初始化(指向表首)
	MOV	A,R7	 ;保存表格的长度
	MOV	R6,A
FD11:	MOV	A,R2	 ;按顺序号读取表格内容
	MOVC	A,@A+DPTR
	CJNE	A,B,FD12 ;与待查找的内容比较
	CLR	OV	 ;相同,查找成功
	MOV	A,R2	 ;取对应的顺序号
	RET
FD12:	INC	R2	 ;指向表格中的下一个内容
	DJNZ	R6,FD11	 ;查完全部表格内容
	SETB	OV	 ;未查找到,失败
	RET

;(27)标号:FDS2 功能:顺序查找(ROM)双字节表格

;入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。

;出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。
;影响资源:PSW、A、R2、R6、DPTR    堆栈需求:  2字节

FDS2:	MOV	A,R7	 ;保存表格中数据的个数
	MOV	R6,A
	MOV	R2,#0	 ;顺序号初始化(指向表首)
FD21:	CLR	A	 ;读取表格内容的高字节
	MOVC	A,@A+DPTR
	XRL	A,R4	 ;与待查找内容的高字节比较
	JNZ	FD22
	MOV	A,#1	 ;读取表格内容的低字节
	MOVC	A,@A+DPTR
	XRL	A,R5	 ;与待查找内容的低字节比较
	JNZ	FD22
	CLR	OV	 ;相同,查找成功
	MOV	A,R2	 ;取对应的顺序号

	RET
FD22:	INC	DPTR	 ;指向下一个数据
	INC	DPTR
	INC	R2	 ;顺序号加一
	DJNZ	R6,FD21	 ;查完全部数据
	SETB	OV	 ;未查找到,失败
	RET

;(28)标号:FDD1 功能:对分查找(ROM)单字节无符号增序数据表格

;入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。
;出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。
;影响资源:PSW、A、B、R2、R3、R4      堆栈需求:  2字节

FDD1:	MOV	B,A	 ;保存待查找的内容
	MOV	R2,#0	 ;区间低端指针初始化(指向第一个数据)

	MOV	A,R7
	DEC	A
	MOV	R3,A	 ;区间高端指针初始化(指向最后一个数据)
FD61:	CLR	C	 ;判断区间大小
	MOV	A,R3
	SUBB	A,R2
	JC	FD69	 ;区间消失,查找失败
	RRC	A	 ;取区间大小的一半
	ADD	A,R2	 ;加上区间的低端
	MOV	R4,A	 ;得到区间的中心
	MOVC	A,@A+DPTR ;读取该点的内容
	CJNE	A,B,FD65 ;与待查找的内容比较
	CLR	OV	 ;相同,查找成功
	MOV	A,R4	 ;取顺序号
	RET
FD65:	JC	FD68	 ;该点的内容比待查找的内容大否?
	MOV	A,R4	 ;偏大,取该点位置

	DEC	A	 ;减一
	MOV	R3,A	 ;作为新的区间高端
	SJMP	FD61	 ;继续查找
FD68:	MOV	A,R4	 ;偏小,取该点位置
	INC	A	 ;加一
	MOV	R2,A	 ;作为新的区间低端
	SJMP	FD61	 ;继续查找
FD69:	SETB	OV	 ;查找失败
	RET

;(29)标号:FDD2功能:对分查找(ROM)双字节无符号增序数据表格
;入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据个数在R7中。
;出口信息:OV=0 时顺序号在累加器A中,址在DPTR中;OV=1 时未找到。
;影响资源:PSW、A、B、R1~R7、DPTR    堆栈需求:  2字节

FDD2:	MOV	R2,#0	 ;区间低端指针初始化(指向第一个数据)
	MOV	A,R7
	DEC	A
	MOV	R3,A	 ;区间高端指针初始化,指向最后一个数据
	MOV	R6,DPH	 ;保存表格首址
	MOV	R7,DPL
FD81:	CLR	C	 ;判断区间大小
	MOV	A,R3
	SUBB	A,R2
	JC	FD89	 ;区间消失,查找失败
	RRC	A	 ;取区间大小的一半
	ADD	A,R2	 ;加上区间的低端
	MOV	R1,A	 ;得到区间的中心
	MOV	DPH,R6
	CLR	C	 ;计算区间中心的地址
	RLC	A
	JNC	FD82
	INC	DPH
FD82:	ADD	A,R7
	MOV	DPL,A
	JNC	FD83
	INC	DPH
FD83:	CLR	A	 ;读取该点的内容的高字节
	MOVC	A,@A+DPTR
	MOV	B,R4	 ;与待查找内容的高字节比较
	CJNE	A,B,FD84 ;不相同
	MOV	A,#1	 ;读取该点的内容的低字节
	MOVC	A,@A+DPTR
	MOV	B,R5
	CJNE	A,B,FD84 ;与待查找内容的低字节比较
	MOV	A,R1	 ;取顺序号
	CLR	OV	 ;查找成功
	RET
FD84:	JC	FD86	 ;该点的内容比待查找的内容大否?
	MOV	A,R1	 ;偏大,取该点位置
	DEC	A	 ;减一
	MOV	R3,A	 ;作为新的区间高端
	SJMP	FD81	 ;继续查找

FD86:	MOV	A,R1	 ;偏小,取该点位置
	INC	A	 ;加一
	MOV	R2,A	 ;作为新的区间低端
	SJMP	FD81	 ;继续查找
FD89:	MOV	DPH,R6	 ;相同,恢复首址
	MOV	DPL,R7
	SETB	OV	 ;查找失败
	RET

;(30)标号: DDM1 功能:求单字节十六进制无符号数据块的平均值
;入口条件:数据块的首址在DPTR中,数据个数在R7中。
;出口信息:平均值在累加器A中。
;影响资源:PSW、A、R2~R6  堆栈需求:  4字节

DDM1:	MOV	A,R7	 ;保存数据个数
	MOV	R2,A
	PUSH	DPH
	PUSH	DPL
	CLR	A	 ;初始化累加和
	MOV	R4,A
	MOV	R5,A
DM11:	MOVX	A,@DPTR	 ;读取一个数据
	ADD	A,R5	 ;累加到累加和中
	MOV	R5,A
	JNC	DM12
	INC	R4
DM12:	INC	DPTR	 ;调整指针
	DJNZ	R2,DM11	 ;累加完全部数据
	LCALL	D457	 ;求平均值(R4R5/R7-→R3)
	MOV	A,R3	 ;取平均值
	POP	DPL
	POP	DPH
	RET

;(31)标号:DDM2 功能:求双字节十六进制无符号数据块的平均值

;入口条件:数据块的首址在DPTR中,双字节数据总个数在R7中。
;出口信息:平均值在R4、R5中。

;影响资源:PSW、A、R2~R6  堆栈需求:4字节

DDM2:	MOV	A,R7	 ;保存数据个数
	MOV	R2,A	 ;初始化数据指针
	PUSH	DPL	 ;保持首址
	PUSH	DPH
	CLR	A	 ;初始化累加和
	MOV	R3,A
	MOV	R4,A
	MOV	R5,A
DM20:	MOVX	A,@DPTR	 ;读取一个数据的高字节
	MOV	B,A
	INC	DPTR
	MOVX	A,@DPTR	 ;读取一个数据的低字节
	INC	DPTR
	ADD	A,R5	 ;累加到累加和中
	MOV	R5,A
	MOV	A,B
	ADDC	A,R4
	MOV	R4,A
	JNC	DM21
	INC	R3
DM21:	DJNZ	R2,DM20	 ;累加完全部数据

	POP	DPH	 ;恢复首址
	POP	DPL
	LJMP	DV31	 ;求R3R4R5/R7-→R4R5,得到平均值

;(32)标号:XR1 功能:求单字节数据块的(异或)校验和

;入口条件:数据块的首址在DPTR中,数据的个数在R6、R7中。
;出口信息:校验和在累加器A中。
;影响资源:PSW、A、B、R4~R7  堆栈需求:2字节

XR1:	MOV	R4,DPH	 ;保存数据块的首址
	MOV	R5,DPL
	MOV	A,R7	 ;双字节计数器调整
	JZ	XR10
	INC	R6
XR10:	MOV	B,#0	 ;校验和初始化
XR11:	MOVX	A,@DPTR	 ;读取一个数据

	XRL	B,A	 ;异或运算
	INC	DPTR	 ;指向下一个数据
	DJNZ	R7,XR11	 ;双字节计数器减一
	DJNZ	R6,XR11
	MOV	DPH,R4	 ;恢复数据首址
	MOV	DPL,R5
	MOV	A,B	 ;取校验和
	RET

;(33) 标号:XR2 功能:求双字节数据块的(异或)校验和

;入口条件:数据块的首址在DPTR中,双字节数据总个数在R6、R7中。
;出口信息:校验和在R2、R3中。
;影响资源:PSW、A、R2~R7   堆栈需求:2字节

XR2:	MOV	R4,DPH	 ;保存数据块的首址
	MOV	R5,DPL
	MOV	A,R7	 ;双字节计数器调整

	JZ	XR20
	INC	R6
XR20:	CLR	A	 ;校验和初始化
	MOV	R2,A
	MOV	R3,A
XR21:	MOVX	A,@DPTR	 ;读取一个数据的高字节
	XRL	A,R2	 ;异或运算
	MOV	R2,A
	INC	DPTR
	MOVX	A,@DPTR	 ;读取一个数据的低字节
	XRL	A,R3	 ;异或运算
	MOV	R3,A
	INC	DPTR	 ;指向下一个数据
	DJNZ	R7,XR21	 ;双字节计数器减一
	DJNZ	R6,XR21
	MOV	DPH,R4	 ;恢复数据首址
	MOV	DPL,R5
	RET

;(34)标号:SORT 功能:单字节无符号数据块排序(增序)

;入口条件:数据块的首址在R0中,字节数在R7中。

;出口信息:完成排序(增序)
;影响资源:PSW、A、R2~R6   堆栈需求:2字节

SORT:	MOV	A,R7
	MOV	R5,A	 ;比较次数初始化
SRT1:	CLR	F0	 ;交换标志初始化
	MOV	A,R5	 ;取上遍比较次数
	DEC	A	 ;本遍比上遍减少一次
	MOV	R5,A	 ;保存本遍次数
	MOV	R2,A	 ;复制到计数器中
	JZ	SRT5	 ;若为零,排序结束
	MOV	A,R0	 ;保存数据指针
	MOV	R6,A
SRT2:	MOV	A,@R0	 ;读取一个数据
	MOV	R3,A
	INC	R0	 ;指向下一个数据
	MOV	A,@R0	 ;再读取一个数据
	MOV	R4,A

	CLR	C
	SUBB	A,R3	 ;比较两个数据的大小
	JNC	SRT4	 ;顺序正确(增序或相同),不必交换
	SETB	F0	 ;设立交换标志
	MOV	A,R3	 ;将两个数据交换位置
	MOV	@R0,A
	DEC	R0
	MOV	A,R4
	MOV	@R0,A
	INC	R0	 ;指向下一个数据
SRT4:	DJNZ	R2,SRT2	 ;完成本遍的比较次数
	MOV	A,R6	 ;恢复数据首址
	MOV	R0,A
	JB	F0,SRT1	 ;本遍若进行过交换,则需继续排序
SRT5:	RET		 ;排序结束
;==========================================================
        END

⌨️ 快捷键说明

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