C51 单片机开发板跑马灯的实现

整体思路

由于138译码器和LED灯都使用了P2口,因此此实验的两个目标需要分别完成;

对于LED灯的跑马灯程序,由于此开发板的LED灯是共阳极。可以通过对寄存器A预设一个只含一个‘0’,其余都为1的二进制数作为P2口状态的初值,并在循环内使用环移指令进行移动,即可实现跑马灯。

对于LED数码管的跑马灯程序,由于此开发板的LED数码管为共阴极,所以P0口为0时为灭,1为亮。为了节约IO口的使用,可以使用138译码器来生成控制八个数码管的位码。可以利用多个跳转指令来改变译码器的输入值,从而实现跑马灯。

程序源码:
 

ORG 0100H
START:
		MOV R2, #8		;循环上限为8
		MOV A, #0FEH	;设置点亮LED灯的起始状态,即11111110

LOOP:	
		MOV P2, A		;将控制码写入P2口
		LCALL DELAY		;跳转至延时子程序
		RL A			;A左环移,使灯的状态切换
		DJNZ R2, LOOP	;R2自减,若不为零则继续循环
		LJMP START		;重新循环

DELAY:
		MOV R3, #100	;延时约为1s
D1:		MOV R4, #20
D2:		MOV R5, #248
D3:		DJNZ R5, D3
		DJNZ R4, D2
		DJNZ R3, D1	   	;
		RET
		END		

LED数码管跑马灯:
		ORG 0000H
     	AJMP START
		ORG 0030H
START:
		MOV P2, #0H			;显示位初始值0
		MOV R1, #3FH			;显示初值位3FH,0
		MOV R2, #08H			;上限
MAIN:	
		CJNE R2, #08H, EQU7   ;仿switch语句,判断R2的值
		CLR P2.4
		CLR P2.3
		CLR P2.2    			;位码情况一:000
		AJMP FINISH    		;break
EQU7:   CJNE R2, #07H, EQU6
		SETB P2.2   			;位码情况二:001
		AJMP FINISH
EQU6:   CJNE R2, #06H, EQU5
		SETB P2.3
		CLR P2.2     			;位码情况三:010
		AJMP FINISH
EQU5:   CJNE R2, #05H, EQU4
		SETB P2.2    			;位码情况四:011
		AJMP FINISH
EQU4:   CJNE R2, #04H, EQU3
		SETB P2.4
		CLR P2.3
		CLR P2.2     			;位码情况五:100
		AJMP FINISH
EQU3:   CJNE R2, #03H, EQU2
		SETB P2.2    			;位码情况六:101
		AJMP FINISH
EQU2:   CJNE R2, #02H, EQU1
		SETB P2.3
		CLR P2.2    			;位码情况七:110
		AJMP FINISH
EQU1:   CJNE R2, #01H, FINISH
		SETB P2.2    			;位码情况八:111

FINISH:
		MOV	P0, R1			;显示数字1
		LCALL DELAY				;延时
		DJNZ R2, MAIN		
		AJMP START				;达到上限后重新循环

DELAY:
		MOV R3, #100			;延时约为1s
D1:		MOV R4, #20
D2:		MOV R5, #248
D3:		DJNZ R5, D3
		DJNZ R4, D2
		DJNZ R3, D1	   	;
		RET
		END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值