【MCS-51】【A51】8路LED的二进制加法器(对堆栈的优化)

        8路LED的二进制加法器(对堆栈的优化)

        此文是对2012-06-11的“8路LED的二进制加法器”的堆栈优化。由于刚学习51汇编,如有不妥地方,请大虾们指正!!

        下面是“8路LED的二进制加法器”的链接地址:http://blog.csdn.net/fly928sky/article/details/7645591

        1.上述方案的缺点是:对堆栈的处理很容易漏掉PUSH或POP,可能造成堆栈溢出问题,造成程序不稳定。

        2.对上述优化方案是:用direct代替堆栈

优化代码如下:

		ORG		0000H
		LJMP	START
						;程序开始
START:	ACALL	INIT
						;主程序
Main:	ACALL	DisplayAdd
		LJMP	Main

DisplayAdd:
ADD1:	MOV		R0,#16
		MOV		R1,#16
		MOV		R2,#10H		;H位DP低位暂存
		MOV		R3,#10H		;H位DP高位暂存
		MOV		DPTR,#1000H	;L位DP
		MOV		1020H,#00H		;;//H位置零,存H位数值
		MOV		1030H,#0FFH		;;//1030H暂存H位显示值
ADDHL:	CLR		A		//L位不为零操作(包含起步L位为零操作)
		SETB	P1.2
		MOVC	A,@A+DPTR
		MOV		R4,A			;;//   R4暂存L位显示值
		MOV		A,1020H			
		JZ		ADDH	;H位为零跳转;H位不为零,继续执行
		 
		MOV		A,1030H	//H位不为零操作,取1030H值(H位显示值)和L位显示值相与
		ANL		A,R4
		MOV		P0,A
		LJMP	Next	
ADDH:	MOV		P0,R4	//H位为零操作

Next:	CLR		P1.2
		ACALL	DELAY
		INC		DPTR
		DEC		R0
		MOV		A,R0
		JNZ		ADDHL	;不为零跳转
	   
	   					;还原H位DP
		MOV		DPL,R2
		MOV		DPH,R3

ADDHZ:	CLR		A		//L位为零操作,并保存H位到1030H
		SETB	P1.2
		MOVC	A,@A+DPTR
		MOV		P0,A
		MOV		1030H,A
		INC		1020H
		CLR		P1.2
		ACALL	DELAY
		INC		DPTR
						;保存H位DP到寄存器R2、R3
		MOV		R2,DPL
		MOV		R3,DPH
		DEC		R1
		MOV		A,R1

		MOV		R0,#16
		MOV		DPTR,#1000H
		JNZ		ADDHL

		LJMP	Add1
		RET


						;初始化函数
INIT:	SETB	P1.3	;关闭点阵                  
		MOV		P0,#00H
		CLR		P1.3
		SETB	P1.1	;关闭数码管
		MOV		P0,#0FFH
		CLR		P1.1
		RET
						;延时函数
DELAY:	MOV R5,#20
D2:		MOV R6,#20
D1:		MOV R7,#248
		DJNZ R7,$
		DJNZ R6,D1
		DJNZ R5,D2
		RET
						;数据表
		ORG		1000H
Table1:	DB	0FFH,07FH,0BFH,03FH,0DFH,05FH,09FH,01FH,0EFH,06FH,0AFH,02FH,0CFH,04FH,08FH,00FH	;L位,即开发板上面右边4个LED灯的0~15
Table2:	DB	0F7H,0FBH,0F3H,0FDH,0F5H,0F9H,0F1H,0FEH,0F6H,0FAH,0F2H,0FCH,0F4H,0F8H,0F0H,0FFH	;H位,即开发板上面左边4个LED灯的1~15 0

		END				;程序结束


 

你可能感兴趣的:(单片机)