这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 汇编写的51跑马灯

共1条 1/1 1 跳转至

汇编写的51跑马灯

助工
2014-11-13 19:35:05     打赏

; MCU : AT89S52 at 12MHZ
; Compiler: Keil C51
; Author : Etual
; Date : 2012-1-7


; P1 口接8个LED,低电平亮
; P0 口接数码管的 A-H,位线比较特殊,是用 138 驱动的,所以送的电平不同


;-------------------------------------------------
;                    Variable
;-------------------------------------------------
; 因为要位操作,所以得分配在 20H~2FH
LED_DAT     EQU     20H


;-------------------------------------------------
;                   vector
;-------------------------------------------------
    ORG     00H
    JMP     RESET_HANDLER
    ; TABLE DATA
DYP_TABLE:
    DB      3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H


;-------------------------------------------------
;                 main program
;-------------------------------------------------
    ; RESET HANDLER
RESET_HANDLER:  
    ; SETUP STACK   
    MOV     SP,#70H
MAIN:
    ; 初始化,关闭端口,只点亮1个LED,LED_DAT就是输出端口的映射的
    ; 一般来说,不应该直接操作端口,而应该寄存器里面处理好再输出到端口
    ; 因为如果其他引脚有其他用的话,就会影响了。
    CALL    SYSTEM_INIT
    MOV     LED_DAT,#0FFH
    CLR     LED_DAT.4
    MOV     P1,LED_DAT
    
    ; 只显示一位数码管而已,不是动态扫描
    MOV     P2,#0
    MOV     DPTR,#DYP_TABLE
    MOV     A,#5
    MOVC    A,@A+DPTR
    MOV     P0,A
    ; 下面就是显示跑马灯,延时->输出移位->延时 -->循环以上操作
    ; 这就是所谓的跑马灯了。
LOOP:
    ; 先延时 0.2s,延时就是喜闻乐见的死循环了
    CALL    DELAY
    ; 将数据移动一位,注意是循环移动,不要C进位参与
    MOV     A,LED_DAT
    RL      A
    MOV     LED_DAT,A
    ; 移动好之后再统一输出,初学者记得要学习这种顺序!以后有用的。
    MOV     P1,A
    ; 循环下去,就能看到跑马灯了。
    JMP     LOOP


;-------------------------------------------------
;             sub  routine
;-------------------------------------------------
DELAY:
    MOV     R3,#20     ;   0.2s
D1:   
    MOV     R4,#20
D2:   
    MOV     R5,#248
    DJNZ    R5,$
    DJNZ    R4,D2
    DJNZ    R3,D1
    RET


; SYSTEM INIT
SYSTEM_INIT:
    MOV     A,#0FFH
    MOV     P1,A
SYSTEM_INIT_END:
    RET


    END


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]