0.ASM0_LED_Flash:LED闪烁,3种方式
汇编代码:
/**
******************************************************************************
* @file main.asm
* @author Alex——小白
* @version V1.0
* @date 2019.9.1
* @brief 3种方法LED Flash 共阳极
* @store 有家Proteus仿真店子
* @Link https://shop484534014.taobao.com/
* @Email [email protected]
******************************************************************************
* @attention All Rights Reserved
**/
ORG 0000H ;程序执行的起始地址
LJMP Main ;跳转到main函数
ORG 0100H ;程序跳转到0100H开始执行
;方法1:
Main: ;最简单的LED闪烁
MOV P1,#0FEH ;11111110
LCALL Delay ;调用延时函数
MOV P1,#0FDH ;11111101
LCALL Delay ;调用延时函数
MOV P1,#0FBH ;11111011
LCALL Delay ;调用延时函数
MOV P1,#0F7H ;11110111
LCALL Delay ;调用延时函数
MOV P1,#0EFH ;11101111
LCALL Delay ;调用延时函数
MOV P1,#0DFH ;11011111
LCALL Delay ;调用延时函数
MOV P1,#0BFH ;10111111
LCALL Delay ;调用延时函数
MOV P1,#07FH ;01111111
LCALL Delay ;调用延时函数
SJMP Main ;跳转到main,死循环
;方法2:
; Main: ;通过数组的遍历取值来流水
; MOV DPTR,#LED_table ;数组
; MOV R4,#00H ;R4寄存器存储遍历的变量,类似于c语言中的变量i
; While:
; MOV A,R4 ;将R4赋值给A
; CJNE A,#08H,Next ;判断A是否为8,若是,继续执行,否则跳转Next
; MOV R4,#00H ;若A是8,R4赋值0
; SJMP While ;跳转到While循环
; Next:
; MOVC A,@A+DPTR ;通过A的值来选择数组中的值,如A=3,则@A+DPTR=0F7H,然后赋值给A
; MOV P1,A ;P1=A=0F7
; LCALL Delay ;调用延时函数
; INC R4 ;R4自加
; SJMP While ;跳转到While循环
;方法3:
; Main: ;通过左移流水灯,RR是右移
; MOV A,#0FEH ;11111110
; While:
; MOV P1,A ;P1 = A = 11111110
; LCALL Delay ;调用延时函数
; RL A ;A左移,11111110左移后=11111101,
; SJMP While
Delay: ;t=t1*8=1s,修改R5的值即可更改时间(不精准)
MOV R5, #08H ;单周期,8次
D1: ;t1=t2*250=500*250=125000
MOV R6, #0FAH
D2:
MOV R7, #0FAH ;t2=250*2=500
D3:
DJNZ R7, D3 ;R7=250自减,直到为0跳出循环,双周期
DJNZ R6, D2 ;R6=250自减,直到为0跳出循环,双周期
DJNZ R5, D1 ;R5=100自减,直到为0跳出循环,双周期
RET
LED_table:
DB 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 07FH
END
如需其他代码,请联系QQ844545015