整体思路
由于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