seqled.asm

来自「十五个关于AT89S51的源代码」· 汇编 代码 · 共 45 行

ASM
45
字号
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;实例四:流水灯  sequence LEDs  (《51单片机应用从零开始》 3.4小节实例)
;
;现象:P1口上的发光二极管依次发光
;
;作者:杨欣,刘长焕,张延强  电路飞翔网    eedesign@163.com
;
;				http://www.circuitfly.com
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


		ORG	00H		;起始地址
	START:				;程序一开始,初始一些所需要变量,如进位CY的清0等
		MOV    	A, #0FFH	;累加器ACC中8位全置1(FFH),发光二极管全熄灭
		CLR    	C		;进位CY被清0,CY=0
		MOV    	R1, #8		;R1=8,循环8次(左移8次),用R1作计数器

   	LEFT:				;这是发光二极管向左"流动"的循环体
		RLC	A		;把进位CY在累加器ACC中从右向左轮换一位,对照矩阵理解
		MOV	P1, A		;输出至P0口
		CALL   	DELAY		;调延时子程序,延时200ms
		DJNZ   	R1, LEFT	;R1减1,如果不为0跳回LEFT继续执行,否则执行下一行
		MOV    	R2, #7		;R2=7,为向右"流动"设置次数,考虑一下为什么不是8?

	RIGHT:				;这是发光二极管向右"流动"的循环体
		RRC     A		;把进位CY在累加器ACC中从左向右轮换一位
		MOV     P1, A		;输出至P0口
		CALL    DELAY		;调延时子程序,延时200ms
		DJNZ    R2, RIGHT	;是否右移了7次,如果不是则跳回RIGHT继续执行
		JMP     START		;跳回一开始,重复执行该流水灯程序

	DELAY:				;延时200ms的子程序
		MOV     R3, #20		
	D1:
		MOV     R4, #20
	D2: 
		MOV     R5, #248
		DJNZ    R5, $		;R5减1,如果不为0,就执行本行
		DJNZ    R4, D2
		DJNZ    R3, D1
		RET			;子程序结束标志,返回主程序
		END			;程序结束点

⌨️ 快捷键说明

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