0.ASM0_LED_Flash:LED闪烁,3种方式
- /**
- ******************************************************************************
- * @file asm.asm
- * @author Alex——小白
- * @version V1.0
- * @date 2019.9.1
- * @brief 3种方法LED Flash 共阳极
- ******************************************************************************
- * @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
复制代码
工程文件:
ASM0_LED_Flash.zip
(64.98 KB, 下载次数: 11)
|