【MCS-51】【A51】8路LED的二进制加法器(续)

        8路LED的二进制加法器(续)

        本文是对“8路LED的二进制加法器”的延续,采用全新算法。

        请参看http://blog.csdn.net/fly928sky/article/details/7645591和http://blog.csdn.net/fly928sky/article/details/7665905

代码如下:

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

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//***************************************************************
//方法1
//*************************start*********************************
DisplayAdd1:
		ACALL	NumInit
ADD1:	MOV		R0,#10H			;H/L位DP高位暂存
		MOV		R1,#00H			;L位DP低位暂存
		MOV		R2,#10H			;H位DP低位暂存
ADD1LOOP:	
		ACALL	NumDiv
		MOV		A,1021H
		CJNE	A,#10H,Next
		ACALL	NumInit
Next:	MOV		A,1023H
		JNZ		AddHNZ
					  			//;H位为零操作
AddHZ:	CLR		A
		SETB	P1.2
		ACALL	GetL
		MOV		P0,A
		CLR		P1.2
		ACALL	DELAY
		INC		1020H
		ACALL	NumDiv

		MOV		A,1021H
		JZ		AddHZ
		MOV		1023H,#01H		;置标志位
		MOV		1024H,#00H
					  			//;H位不为零操作	
AddHNZ:	
		ACALL	NumDiv
		MOV		A,1024H
		JNZ		AddLNZ
					  			//;L位为零操作
AddLZ: CLR		A
		SETB	P1.2
		ACALL	GetH	
		MOV		P0,A
		CLR		P1.2
		ACALL	DELAY
		INC		1020H
		ACALL	NumDiv
		MOV		1024H,#01H		;置标志位
					  			//;L位不为零操作
AddLNZ:	
		CLR		A
		SETB	P1.2
		ACALL	SetP0
		CLR		P1.2
		ACALL	DELAY
		INC		1020H
		ACALL	NumDiv
					
		MOV		A,1022H
		JNZ		AddLNZ
		MOV		1024H,#00H

		LJMP	ADD1LOOP
		RET	
//**************************end**********************************
//方法1
//***************************************************************

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//***************************************************************
//方法2
//*************************start*********************************
DisplayAdd2:
		ACALL	NumInit		
Add2: 	MOV		R0,#10H			;H/L位DP高位暂存
		MOV		R1,#00H			;L位DP低位暂存
		MOV		R2,#10H			;H位DP低位暂存
AddInit:		
		ACALL	NumDIV
AddMain:
		MOV		A,1021H			;高位暂存累加器A
		CJNE 	A,#10H,Add2Loop	;A<16转移到AddLoop,且CY=1;A=0继续向下执行
		ACALL	NumInit
Add2Loop:
		JNC		AddInit			;CY!=0继续向下执行
		SETB	P1.2
		ACALL	SetP0
		CLR		P1.2
		ACALL	DELAY
		INC		1020H

		LJMP	AddInit
		RET
//**************************end**********************************
//方法2
//***************************************************************

						;初始化函数
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

NumInit:						;初始化函数
		MOV		1020H,#00H		;显示数
		MOV		1021H,#00H		;显示数H位
		MOV		1022H,#00H		;显示数L位
		MOV		1023H,#00H		;H位为零标志
		MOV		1024H,#00H		;L位为零标志
		RET

NumDiv:						;显示数初始化
		MOV		A,1020H
		MOV		B,#10H
		DIV		AB
		MOV		1021H,A			;商数存H位
		MOV		1022H,B			;余数存L位
		RET

SetP0:							;设置P0端口值
		ACALL	GetL
		MOV		R3,A
		ACALL	GetH
		ANL		A,R3			 ;H位和L位相与送入P0口
		MOV		P0,A

		RET

GetH:	MOV		DPH,R0 			;取H位值
		MOV		A,R2
		ADD		A,1021H
		MOV		DPL,A
		CLR		A
		MOVC	A,@A+DPTR
		RET

GetL:	MOV		DPH,R0			;取L位值
		MOV		A,R1
		ADD		A,1022H
		MOV		DPL,A
		CLR		A
		MOVC	A,@A+DPTR
		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	0FFH,0F7H,0FBH,0F3H,0FDH,0F5H,0F9H,0F1H,0FEH,0F6H,0FAH,0F2H,0FCH,0F4H,0F8H,0F0H	;H位,即开发板上面左边4个LED灯的1~15 0

		END				;程序结束


 

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