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

         8路LED的二进制加法器的实现

1.8路LED的二进制加法器对应的电路图为:

开发板样图

8052芯片图

【MCS-51】【A51】8路LED的二进制加法器_第1张图片

LED流水灯模块图

【MCS-51】【A51】8路LED的二进制加法器_第2张图片

8*8点阵模块图

【MCS-51】【A51】8路LED的二进制加法器_第3张图片

8位数码管模块图

2. 8路LED的二进制加法器的中心思想:利用DB字节库取值显示加法过程

3.8路LED的二进制加法器的实现伪过程:

            a.8路LED分成高4路和低4路,只取四路的0-15的值,令四路为关闭状态。

                (这样取值后就只需做两个16字节的DB,不必做16X16这么大规模的数据,但是也提出了一个低4位向高4位进位的问题。下面就讨论这个问题)

                 两个16字节DB如下:

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

            b.大致思路:高4位为0,低4位从0自加到15(取之于Table1);再加1,低4位清零,高四位加1。低4位再从0自加到15,然后加1同前面。

                                  上述四路中存在一个问题,高低不能同时显示,需要处理同时显示问题。

               详细思路:高4位为0——低4位从0自加到15取Table1中对应显示值送入P0;再加1,高4位加1,低4位清零,此时跳到“低4位为0”;

                                                                                                                                                      再在此基础上继续加,跳到“低4位不为0”然后对高4位判断是否为零;

                                                                                                                                                      如此循环进行。

                                   低4位为0——直接取高4位数字对应Table2中显示值送入P0

                                   低4位不为0——高4位为0——直接取低4位数字对应Table1中显示值送入P0

                                   低4位不为0——高4位不为0——取低4位数字对应Table1中显示值 和 高4位数字对应Table2中显示值 后,相与然后送入P0

4.8路LED的二进制加法器的实现代码:

 

		ORG		0000H
		LJMP	START
						;程序开始
START:	ACALL	INIT
						;主程序
Main:	MOV		R0,#16
		MOV		R1,#16
		MOV		R2,#10H
		MOV		R3,#10H
		MOV		DPTR,#1000H
		MOV		1020H,#00H	;H位置零,存H位数值
		MOV		A,#0F7H		;H位LED值
		PUSH	ACC			
ADDHL:	CLR		A		;L位不为零操作
		SETB	P1.2
		MOVC	A,@A+DPTR
		MOV		R4,A	;R4暂存L位的DB值
		MOV		A,1020H			
		JZ		ADDH	;H位为零跳转;H位不为零,继续执行
		 
		POP		ACC		;H位不为零操作
		MOV		1030H,A
		ANL		A,R4
		MOV		P0,A
		MOV		A,1030H
		PUSH	ACC
		LJMP	Next	
ADDH:	MOV		P0,R4	;H位为零操作

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

ADDHZ:	POP		ACC		;L位为零操作,并保存H位到累加器A
		CLR		A	
		SETB	P1.2
		MOVC	A,@A+DPTR
		MOV		P0,A
		PUSH	ACC
		INC		1020H
		CLR		P1.2
		ACALL	DELAY
		INC		DPTR
		MOV		R2,DPL
		MOV		R3,DPH
		DEC		R1
		MOV		A,R1

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

		LJMP	Main
						;初始化函数
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				;程序结束


5.编写程序阶段需要注意的问题

    注意事项:
                 (1)寄存器不够用的情况下,可以把dir做暂时寄存器
                 (2)关于堆栈的问题:a.先PUSH(压栈),后POP(出栈)【对称原则】
                                                           b.先进后出

你可能感兴趣的:(table,delay)