基于Proteus+8051汇编应用实例系列之二--通过按钮来控制LED流水灯移动

;;; ==========================
;;; K1~K4按钮控制LED灯移动  ;;;;
;;; ==========================
		ORG	00H
START:
		MOV 	R1,#0FEH
		MOV 	R2,#0FEH
		CALL 	FRESH_LED
;;; ===========================
;;; 主循环
;;; ===========================
MAIN_LOOP:
		CALL	CHK_K1
		CALL 	CHK_K2
		CALL	CHK_K3
		CALL 	CHK_K4
		JMP		MAIN_LOOP
;;; ===========================
;;; 刷新LED灯状态
;;; ===========================
FRESH_LED:
		MOV 	P0,R1
		MOV 	P2,R2
		RET
;;; ===========================
;;; 检测K1
;;; ===========================
CHK_K1:
		JB		P1.4,RETURN
		CALL 	DELAY
		JNB		P1.4,$
		CALL	LEFT_UP
		CALL 	FRESH_LED
		RET
;;; ===========================
;;; 检测K2
;;; ===========================
CHK_K2:
		JB		P1.5,RETURN
		CALL 	DELAY
		JNB		P1.5,$
		CALL	LEFT_DOWN
		CALL 	FRESH_LED
		RET
;;; ===========================
;;; 检测K3
;;; ===========================
CHK_K3:
		JB		P1.6,RETURN
		CALL 	DELAY
		JNB		P1.6,$
		CALL	RIGHT_UP
		CALL 	FRESH_LED
		RET
;;; ===========================
;;; 检测K4
;;; ===========================
CHK_K4:
		JB		P1.7,RETURN
		CALL 	DELAY
		JNB		P1.7,$
		CALL	RIGHT_DOWN
		CALL 	FRESH_LED
		RET
;;; ===========================
;;; 左上移
;;; ===========================
LEFT_UP:
		MOV A,R1
		CPL A
		RRC	A
		CPL A
		MOV R1,A
		RET
;;; ===========================
;;; 左下移
LEFT_DOWN:
		MOV A,R1
		CPL A
		RLC	A
		CPL A
		MOV R1,A
		RET
;;; ===========================
;;; 右上移
;;; ===========================
RIGHT_UP:
		MOV A,R2
		CPL A
		RRC	A
		CPL A
		MOV R2,A
		RET
;;; ===========================
;;; 左上移
;;; ===========================
RIGHT_DOWN:
		MOV A,R2
		CPL A
		RLC	A
		CPL A
		MOV R2,A
		RET
;;; ===========================
;;; 返回
;;; ===========================
RETURN:
		RET
;;; ===========================
;;; 延时30ms
;;; ===========================
DELAY:
		MOV R5,#30
D1:		MOV R6,#20
D2:		MOV R7,#248
		DJNZ	R7,$
		DJNZ	R6,D2
		DJNZ	R5,D1
		RET

		END
		


 问题描述:

         通过四个按钮K1~K4分别控制两排的LED灯上移或下移,四个键分别连51单片机的P1.4~P1.7,左边一排LED灯接P0口,右边一排LED灯接P2口,Proteus仿真图如下图所示:

 直奔代码……

代码文件main.asm

 

注:

1)单片机程序一般都有一个主循环(不休止地专心地执行),这里通过MAIN_LOOP标签,不断跳转到此处。

2)程序依照模块化的编程思想,将整个过程分解成几个子过程,如:检测按钮,刷新LED灯状态,等待,灯的移动,通过CALL和RET的配对使用,实现类似函数过程的调用过程,将多个逻辑子过程通过跳转命令,完成复杂任务。

3)LED灯的移动,借用了RRC和RLC命令,又因为此例中需要移动的是1,所以在RRC和RLC前后通过CPL转换成移动0的过程,实现灯的各种移动效果。

4)注意像29行这种用法,间接实现一个选择逻辑。

5)注意CALL和RET的配对使用,通过跳转命令如JB,JNB等要返回的话, 不能用RET,而需要继续通过合适的跳转命令跳回。

相应源文件和代码请于附件中下载。
 

你可能感兴趣的:(51汇编,Proteus,单片机)