📄 clock.asm
字号:
#include <def.inc>
ORG 0000H
LJMP START
ORG 0003H ;恢复红灯开启时的初始状态
JMP RESTART
ORG 000BH ;1mS中断,动态扫描
JMP INT_T0
ORG 001BH ;10mS 中断,完成时钟计时
JMP INT_T1
ORG 0030H
START:
;--------- 重置堆栈 -------------
MOV SP, #60H
;---------- 端口初始化 -----------
MOV P1, #0FFH
MOV P3, #0FFH
;--------- 定时器设置 ------------
MOV TMOD, #19h ;设置C/T0 和 C/T1 工作在方式 1(16bit 定时)
MOV TL0, #DATA_TL0 ;初值
MOV TH0, #DATA_TH0
MOV TL1, #DATA_TL1
MOV TH1, #DATA_TH1
SETB TR0 ;启动
SETB TR1
;--------- 中断设置 -------------
MOV IP, #00000001B ; 外部中断0为高优先级
MOV IE, #10001011B ; 开放C/T0、C/T1、外部中断0中断
;--------- 变量初始化 ------------
MOV TIME_10mS, #100 ;计时变量
MOV TIME_1S, #9
MOV TIME_10S, #1
MOV CUR_DISP, #0 ;显示位
MOV LIGHT, #11 ;显示空格“-”的值
MAINLOOP: JMP MAINLOOP ;主循环
;-------- 10mS中断,计时 ----------
INT_T1: PUSH PSW ;保护现场
PUSH ACC
MOV TL1, #DATA_TL1 ;重置初值
MOV TH1, #DATA_TH1
DJNZ TIME_10mS, EXIT_T1
MOV TIME_10mS, #100 ;每1S
DEC TIME_1S
MOV A, TIME_1S
CJNE A, #-1, EXIT_T1
MOV TIME_1S, #9 ;每10S
DEC TIME_10S
MOV A, TIME_10S
CJNE A, #-1, EXIT_T1
MOV A, LIGHT
CJNE A, #11, AAA
CJNE A, #10, BBB
AAA: INC LIGHT
MOV TIME_10S, #1
JMP EXIT_T1
BBB: DEC LIGHT
MOV TIME_10S, #2
EXIT_T1: POP ACC ;恢复现场
POP PSW
RETI
;-------- 1mS中断,动态扫描 ----------
INT_T0: PUSH PSW ; 保护现场
PUSH ACC
PUSH DPH
PUSH DPL
SETB RS0 ; 选择工作寄存器1
MOV TL0, #DATA_TL0 ; 重置 T0 初值
MOV TH0, #DATA_TH0
MOV_BIT POS_CONTL1, CUR_DISP.0 ;输出位选
MOV_BIT POS_CONTL2, CUR_DISP.1
MOV A, CUR_DISP ;输出段选
MOV DPTR, #TAB_DIS ;计算段显示内容的地址
MOVC A, @A+DPTR ; A= 在该位上要显示内容的地址
MOV R0, A
MOV A, @R0 ; A= 在该位要显示内容的值
MOV DPTR, #TAB_CODE
MOVC A, @A+DPTR ; A= 要显示内容的段码
MOV SEG_OUT, A ;段显输出
INC CUR_DISP ;计算下次(1mS后)要显示的位
MOV A, CUR_DISP
CJNE A, #N_DISP, EXIT_T0
MOV CUR_DISP, #0
EXIT_T0: POP DPL
POP DPH
POP ACC
POP PSW ;恢复现场
RETI
;----------- 复位 ------------
RESTART: PUSH PSW ;保护现场
PUSH ACC
MOV TIME_1S, #9
MOV TIME_10S, #1
MOV LIGHT, #11
POP ACC ;恢复现场
POP PSW
SETB TR0
RETI
TAB_CODE:
DB 0C0H ;0 0 0
DB 0F9H ;1 1 1
DB 0A4H ;2 2 2
DB 0B0H ;3 3 3
DB 099H ;4 4 4
DB 092H ;5 5 5
DB 082H ;6 6 6
DB 0F8H ;7 7 7
DB 080H ;8 8 8
DB 098H ;9 9 9
DB 0FFH ;绿灯 10
DB 080H ;红灯 11
TAB_DIS:
DB DIS0
DB DIS1
DB DIS2
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -