📄 timer.asm
字号:
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP INTRUPT0
ORG 0013H
LJMP INTRUPT1
MAIN:
SETB EX0 ;外部中断源0(P3.2--外部中断0申请,低电平有效)
SETB EX1
CLR IT0 ;脉冲触发方式,低电平有效
SETB EA
MOV 30H ,#00H ;个位秒
MOV 31H ,#00H ;十位秒
MOV 32H ,#00H ;个位分
MOV 33H ,#00H ;十位分
MOV 34H ,#00H ;个位小时
MOV 35H ,#00H ;十位小时
MOV 21H, #80H ;用于主程序计时1秒
MOV 22H, #0FEH ;位码显示,每次只显示一位码
MOV 38H, #0FFH ;闹钟十位秒初值
MOV 39H, #0FFH ;闹钟个位分初值
; ===================================================
;主程序
START:
MOV P3,#0FFH
MOV R1, 21H
MOV R2, 22H
MOV P0,#0FFH
START0: MOV A,39H ;闹钟的个位分的值
CJNE A,32H,START1 ;个位分的值与设定的个位分的值不等则转移
MOV A,38H ;闹钟的十位秒的值
CJNE A,31H,START1 ;个位分的值与设定的十位秒的值不等则转移
CLR P0.5
START1: ;MOV P3,#0FFH
CALL DELAY
CALL DISPLAY
DJNZ R1,START1 ;减 1,不为0转移
SETB P0.5
MOV R1,21H
MOV P0,#0FEH ;低电平亮,每1秒亮P0.0
CALL DELAY
INC 30H ;个位秒加1
MOV P0,#0FFH
MOV A,30H
CJNE A,#0AH,S1
MOV 30H,#00H
MOV P0,#0FCH ;低电平亮,每10秒亮P0.0 P0.1
CALL DELAY
INC 31H ;十位秒加1
MOV P0,#0FFH
MOV A,31H
CJNE A,#06H,S1
MOV 31H,#00H
MOV P0,#0F8H ;低电平亮,每1分亮P0.0 P0.1 P0.2
CALL DELAY
INC 32H ;个位分加1
MOV P0,#0FFH
MOV A,32H
CJNE A,#0AH,S1
MOV 32H,#00H
MOV P0,#0F0H ;低电平亮,每10分亮P0.0 P0.1 P0.2 P0.3
CALL DELAY
INC 33H ;十位分加1
MOV P0,#0FFH
MOV A,33H
CJNE A,#06H,S1
MOV 33H,#00H
INC 34H ;个位小时加1
MOV A,34H
CJNE A,#0AH,S1
MOV 34H,#00H
INC 35H ;十位小时加1
MOV A,35H
CJNE A,#06H,S1
LJMP START
S1:
LJMP START0
;==================================================
;中断0入口,设置对时或闹铃
INTRUPT0:
YS0: JNB P3.2,YS0 ;为0跳转(延时作用)
SETB P3.2
CLR EA
MOV P0,#0F0H ;低电平亮,进入中断0亮P0.0 P0.1 P0.2 P0.3
CALL DELAY
MOV P0,#0FFH
LOOP: JNB P3.3,BELL ;P3.3为0进入设置闹铃程序
CALL DISPLAY
JNB P3.2,LOP1 ;P3.2为0进入对时功能程序
SJMP LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对时重写代码如下:
LOP1:
YS2: JNB P3.2,YS2 ;为0跳转
SETB P3.2
LP: CALL DISPLAY
JNB P3.4,ADDHOUR ;P3.4按下则个位时增加1
JNB P3.2,MIDD1 ;P3.2按下则退出中断
JNB P3.5,ADDMINU ;P3.5按下则个位分增加1
AJMP LP
ADDHOUR:
JNB P3.2,MIDD1 ;P3.2按下则退出中断
YS4: JNB P3.4,YS4 ;为0跳转
SETB P3.4
MOV P0,#0F3H ;低电平亮,个位时增加亮P0.2 P0.3
CALL DELAY
JNB P3.2,MIDD1 ;P3.2按下则退出中断
MOV P0,#0FFH
INC 34H ;个位时增加1
MOV A,34H
CJNE A,#0AH,LOP1 ;个位时不等10则转移
MOV 34H,#00H
INC 35H
AJMP LOP1
ADDMINU:
JNB P3.2,MIDD1 ;P3.2按下则退出中断
YS5: JNB P3.5,YS5 ;为0跳转
SETB P3.5
MOV P0,#0FCH ;低电平亮,个位分增加亮P0.0 P0.1
CALL DELAY
JNB P3.2,MIDD1 ;P3.2按下则退出中断
MOV P0,#0FFH
INC 32H ;个位分增加1
MOV A,32H
CJNE A,#0AH,LOP1 ;个位分不等10则转移
MOV 32H,#00H
INC 33H
MOV A,33H
CJNE A,#06H,LOP1 ;十位分不等6则转移
MOV 33H,#00H
AJMP LOP1
MIDD1: LJMP YS11 ;因为JNB范围有限,利用了中转,除P3.2按下,不会进入该语句
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;设置闹铃
BELL:
YS3: JNB P3.3,YS3 ;为0跳转
SETB P3.3
MOV 36H,31H ;保存设置前十位秒的值
MOV 37H,32H ;保存设置前个位分的值
;设置闹钟重写代码如下:
LOP2: CALL DISPLAY
JNB P3.4,ADDMIN ;P3.4按下则个位分增加1
JNB P3.2,EXIT3 ;P3.2按下则退出中断
JNB P3.5,ADDTENSEC ;P3.5按下则十位秒增加1
AJMP LOP2
ADDMIN:
JNB P3.2,EXIT3 ;P3.2按下则退出中断
YS6: JNB P3.4,YS6 ;为0跳转
SETB P3.4
MOV P0,#0F3H ;低电平亮,个位分增加亮P0.2 P0.3
CALL DELAY
MOV P0,#0FFH
INC 32H ;个位分增加1
MOV A,32H
CJNE A,#0AH,LOP2 ;个位分不等10则转移
MOV 32H,#00H
INC 33H
MOV A,33H
CJNE A,#06H,LOP2 ;十位分不等6则转移
MOV 33H,#00H
INC 34H
AJMP LOP2
ADDTENSEC:
JNB P3.2,EXIT3 ;P3.2按下则退出中断
YS7: JNB P3.5,YS7 ;为0跳转
SETB P3.5
MOV P0,#0FCH ;低电平亮,十位秒增加亮P0.0 P0.1
CALL DELAY
MOV P0,#0FFH
INC 31H ;十位秒增加1
MOV A,31H
CJNE A,#06H,LOP2 ;十位秒不等6则转移
MOV 31H,#00H
AJMP LOP2
EXIT3:
SETB P3.2
MOV 38H,31H ;闹铃十位秒的值存入38H
MOV 39H,32H ;闹铃个位分的值存入39H
MOV 31H,36H
MOV 32H,37H
YS11: SETB P3.2
JNB P3.2,YS11 ;为0跳转
SETB P3.2
SETB EA
RETI
;==================================================
;中断1入口,设置秒表
INTRUPT1:
YS1: JNB P3.3,YS1 ;为0跳转
SETB P3.3
CLR EA
MOV P0,#0F0H ;低电平亮,进入中断1亮P0.0 P0.1 P0.2 P0.3
CALL DELAY
MOV P0,#0FFH
SETB P3.3 ;外中断1进入秒表功能
MOV 70H,30H ;保存原有个位秒
MOV 71H,31H
MOV 72H,32H
MOV 73H,33H
MOV 74H,34H
MOV 75H,35H
MOV 30H ,#00H ;0.01个位秒
MOV 31H ,#00H ;0.1个位秒
MOV 32H ,#00H ;个位秒
MOV 33H ,#00H ;十位秒
MOV 34H ,#00H ;个位分
MOV 35H ,#00H ;十位分
CALL DISPLAY
START2:
YS10: JNB P3.4,YS10 ;为0跳转
SETB P3.4
JNB P3.2,MIDD2 ;P3.2为0时退出中断
JNB P3.3,PAUSE
MOV R3,#1H
PER: CALL DISPLAY
JNB P3.4,YS10 ;为0跳转
MOV P0,#0FFH
CALL DISPLAY
DJNZ R3,PER
INC 30H ;0.01个位秒加1
MOV A,30H
CJNE A,#0AH,S2
MOV 30H,#00H
INC 31H ;0.1个位秒加1
MOV A,31H
CJNE A,#06H,S2
MOV 31H,#00H
MOV P0,#0FEH ;低电平亮,每1秒亮P0.0
CALL DELAY
INC 32H ;个位秒加1
;MOV P0,#0FFH
MOV A,32H
CJNE A,#0AH,S2
MOV 32H,#00H
MOV P0,#0FCH ;低电平亮,每10秒亮P0.0 P0.1
CALL DELAY
INC 33H ;十位秒加1
;MOV P0,#0FFH
MOV A,33H
CJNE A,#06H,S2
MOV 33H,#00H
INC 34H ;个位分加1
MOV A,34H
CJNE A,#0AH,S2
MOV 34H,#00H
MOV P0,#0F8H ;低电平亮,每十位分亮P0.0 P0.1 P0.2
CALL DELAY
INC 35H ;十位分加1
;MOV P0,#0FFH
MOV A,35H
CJNE A,#06H,S2
MOV 35H,#00H
MOV P0,#0F0H ;低电平亮,每达到60分亮P0.0 P0.1 P0.2 P0.3
CALL DELAY
;MOV P0,#0FFH
S2: CALL DISPLAY
JNB P3.2,YS8 ;P3.2为0时退出中断
LJMP YS10
MIDD2: AJMP YS8 ;因为JNB范围有限,利用了中转,除P3.2按下,不会进入该语句
PAUSE: SETB P3.3
JNB P3.4,START2
JNB P3.2,YS8 ;P3.2为0时退出中断
CALL DISPLAY
JNB P3.5,CLEAR
CALL DELAY
LJMP PAUSE
CLEAR:
YS9: JNB P3.5,YS9 ;为0跳转
SETB P3.5
MOV 30H ,#00H ;0.01个位秒 ;清零
MOV 31H ,#00H ;0.1个位秒
MOV 32H ,#00H ;个位秒
MOV 33H ,#00H ;十位秒
MOV 34H ,#00H ;个位分
MOV 35H ,#00H ;十位分
LJMP PAUSE
YS8: SETB P3.2
JNB P3.2,YS8 ;为0跳转
MOV 30H ,70H ;个位秒还原
MOV 31H ,71H ;十位秒
MOV 32H ,72H ;个位分
MOV 33H ,73H ;十位份
MOV 34H ,74H ;个位小时
MOV 35H ,75H ;十位小时
SETB EA
SETB P3.2
RETI
;===================================================
;显示子程序
DISPLAY:
;MOV P0,#0FFH
MOV DPTR,#TABLE ;共阳极
MOV A , 30H ;显示个位秒
MOVC A, @A+DPTR ;取段码
MOV P1, A ;P1对应段码
MOV R2,#0FEH ;设位码初值
MOV A, R2 ;位码
MOV P2, A ;P2对应位码
CALL DELAY
CALL DELAY
MOV A, R2 ;位码左移一位,显示左边相邻的数码管
RL A
MOV R2, A
MOV P2, A
MOV A , 31H ;显示十位秒
MOVC A, @A+DPTR
MOV P1, A
CALL DELAY
CALL DELAY
MOV A, R2
RL A
MOV R2, A
MOV P2, A
MOV A , 32H ;显示个位分
MOVC A, @A+DPTR
MOV P1, A
CALL DELAY
CALL DELAY
MOV A, R2
RL A
MOV R2, A
MOV P2, A
MOV A , 33H ;显示十位分
MOVC A, @A+DPTR
MOV P1, A
CALL DELAY
CALL DELAY
MOV A, R2
RL A
MOV R2, A
MOV P2, A
MOV A , 34H ;显示个位小时
MOVC A, @A+DPTR
MOV P1, A
CALL DELAY
CALL DELAY
MOV A, R2
RL A
MOV R2, A
MOV P2, A
MOV A , 35H ;显示十位小时
MOVC A, @A+DPTR
MOV P1, A
CALL DELAY
CALL DELAY
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DELAY: MOV R6,#11H
DEY0:MOV R7, #11H
DEY1: DJNZ R7, DEY1
DJNZ R6, DEY0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -