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

📄 insert2.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 ASM
字号:
;双字节表格的插入算法
FRONT	EQU	2000H	;表格首址。
MAXH	DATA	30H	;元素个数最大值存放单元(高字节)。
MAXL	DATA	31H	;元素个数最大值存放单元(低字节)。
NUMBH	DATA	32H	;已有元素个数存放单元(高字节)。
NUMBL	DATA	33H	;已有元素个数存放单元(低字节)。
IH	DATA	34H	;待插入元素的序号存放单元(高字节)。
IL	DATA	35H	;待插入元素的序号存放单元(低字节)。
XH	DATA	36H	;待插入元素的数值存放单元(高字节)。
XL	DATA	37H	;待插入元素的数值存放单元(低字节)。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H
TEST:	MOV	MAXH,#1		;最大数据个数为384个
	MOV	MAXL,#80H
	MOV	NUMBH,#0	;已有数据个数为160个(任意设定)
	MOV	NUMBL,#0A0H
	MOV	IH,#0		;准备在序号为128的位置
	MOV	IL,#80H
	MOV	XH,#5AH		;插入双字节数据5AA5H
	MOV	XL,#0A5H
	LCALL	INSERT		;调用插入算法
STOP:	LJMP	STOP		;X将插入到2100H和2101H单元中

INSERT:	SETB	C	;计算MAX-NUMB-1
	MOV	A,MAXL
	SUBB	A,NUMBL
	MOV	A,MAXH
	SUBB	A,NUMBH	;表格满否?
	JC	INSEND	;表格已满,插入失败。	
	MOV	DPTR,#FRONT;取表格首址。
	MOV	A,IL	;按每个数据占两个字节计算偏移量。
	RLC	A
	MOV	R2,A
	MOV	A,IH
	RLC	A
	XCH	A,R2
	ADD	A,DPL	;加偏移量。
	MOV	DPL,A
	MOV	A,R2
	ADDC	A,DPH
	MOV	DPH,A	;得到插入的实际地址。
	CLR	C
	MOV	A,NUMBL	;插入位置超出范围否?
	SUBB	A,IL
	MOV	R3,A
	MOV	A,NUMBH
	SUBB	A,IH
	MOV	R2,A	;保存需要移动元素的个数。
	JC	INSEND	;位置不合理,插入失败。
	ORL	A,R3
	JZ	INST	;不需要移动元素。
	MOV	A,R3	;按每移动一个数据偏移两个字节计算。
	RLC	A
	MOV	R4,A
	MOV	A,R2
	RLC	A
	XCH	A,R4
	ADD	A,DPL
	MOV	DPL,A
	MOV	A,R4
	ADDC	A,DPH
	MOV	DPH,A	;指向新表尾位置。
	MOV	A,R3	;计数器检查。
	JZ	MOVS
	INC	R2	;计数器校正。
MOVS:	MOV	A,#0FEH	;指针前移一个元素。
	ADD	A,DPL
	MOV	DPL,A
	MOV	A,#0FFH
	ADDC	A,DPH
	MOV	DPH,A
	MOVX	A,@DPTR	;读取一个元素。
	MOV	R4,A
	INC	DPTR
	MOVX	A,@DPTR
	XCH	A,R4
	INC	DPTR
	MOVX	@DPTR,A	;存入后一个位置。
	INC	DPTR
	MOV	A,R4
	MOVX	@DPTR,A
	MOV	A,#0FDH	;指针前移一个元素。
	ADD	A,DPL
	MOV	DPL,A
	MOV	A,#0FFH
	ADDC	A,DPH
	MOV	DPH,A
	DJNZ	R3,MOVS
	DJNZ	R2,MOVS	;移完需要移动的元素。
INST:	MOV	A,XH	;取待插入元素的数值。
	MOVX	@DPTR,A	;插入到指定位置。
	INC	DPTR
	MOV	A,XL
	MOVX	@DPTR,A
	MOV	A,NUMBL	;元素个数加一。
	INC	A
	MOV	NUMBL,A
	JNZ	INSOK
	INC	NUMBH
INSOK:	CLR	C	;插入成功。
INSEND:	RET		;算法结束。
	END

⌨️ 快捷键说明

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