51单片机汇编学习例程(0)——LED篇

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

发布了14 篇原创文章 · 获赞 1 · 访问量 5011

猜你喜欢

转载自blog.csdn.net/Smile_shao/article/details/103517795