; 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