企业网站建立昆山优化外包
整体思路
由于138译码器和LED灯都使用了P2口,因此此实验的两个目标需要分别完成;
对于LED灯的跑马灯程序,由于此开发板的LED灯是共阳极。可以通过对寄存器A预设一个只含一个‘0’,其余都为1的二进制数作为P2口状态的初值,并在循环内使用环移指令进行移动,即可实现跑马灯。
对于LED数码管的跑马灯程序,由于此开发板的LED数码管为共阴极,所以P0口为0时为灭,1为亮。为了节约IO口的使用,可以使用138译码器来生成控制八个数码管的位码。可以利用多个跳转指令来改变译码器的输入值,从而实现跑马灯。
程序源码:
ORG 0100H
START:MOV R2, #8 ;循环上限为8MOV A, #0FEH ;设置点亮LED灯的起始状态,即11111110LOOP: 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, D3DJNZ R4, D2DJNZ R3, D1 ;RETEND LED数码管跑马灯:ORG 0000HAJMP STARTORG 0030H
START:MOV P2, #0H ;显示位初始值0MOV R1, #3FH ;显示初值位3FH,0MOV R2, #08H ;上限
MAIN: CJNE R2, #08H, EQU7 ;仿switch语句,判断R2的值CLR P2.4CLR P2.3CLR P2.2 ;位码情况一:000AJMP FINISH ;break
EQU7: CJNE R2, #07H, EQU6SETB P2.2 ;位码情况二:001AJMP FINISH
EQU6: CJNE R2, #06H, EQU5SETB P2.3CLR P2.2 ;位码情况三:010AJMP FINISH
EQU5: CJNE R2, #05H, EQU4SETB P2.2 ;位码情况四:011AJMP FINISH
EQU4: CJNE R2, #04H, EQU3SETB P2.4CLR P2.3CLR P2.2 ;位码情况五:100AJMP FINISH
EQU3: CJNE R2, #03H, EQU2SETB P2.2 ;位码情况六:101AJMP FINISH
EQU2: CJNE R2, #02H, EQU1SETB P2.3CLR P2.2 ;位码情况七:110AJMP FINISH
EQU1: CJNE R2, #01H, FINISHSETB P2.2 ;位码情况八:111FINISH:MOV P0, R1 ;显示数字1LCALL DELAY ;延时DJNZ R2, MAIN AJMP START ;达到上限后重新循环DELAY:MOV R3, #100 ;延时约为1s
D1: MOV R4, #20
D2: MOV R5, #248
D3: DJNZ R5, D3DJNZ R4, D2DJNZ R3, D1 ;RETEND