📄 dsq.txt
字号:
ADDR_MIN EQU R6 ;存储分钟的单元
ADDR_SEC EQU R7 ;存储秒的单元
ORG 0000H
LJMP MAIN
ORG 1BH
JMP T1INT ;T1中断入口地址
ORG 0100H
MAIN:
MOV R2,#10 ;R2为0.1s的倍数,R2=10,定时1s
MOV TMOD,#10H ;T1设置为方式1
MOV TL1,#0B0H ;T1中断时间为0.1s
MOV TH1,#3CH
MOV IE,#88H ;允许T1中断
MOV DPTR,#4003H
MOV A,#88H
MOVX @DPTR,A
SETB TR1
;;;;;;;;;;;;;;;;;;;;;;;扫描K1,K2,设置时间(分,秒)
IFSEC:
JNB P1.1,IFMIN ;循环判断K1或K2是否按下?
ACALL DELAY10 ;延时10毫秒触点消抖
JNB P1.1,IFSEC ;如果是干扰就返回
JB P1.1,$ ;等待按键K2松开
CLR EA ;关中断
CLR C
MOV A,#60 ;判断当前是否为60秒
SUBB A,ADDR_SEC
ACALL CLR_SEC ;如果为60秒,秒清0,分钟加1
INC ADDR_SEC ;如果不为60秒,秒加1
ACALL DISPLAY
AJMP IFMIN
CLR_SEC:
ACALL INC_MIN
ACALL DISPLAY
MOV TL1,#0B0H
MOV TH1,#3CH
SETB EA
IFMIN:
JNB P1.0,IFSEC
ACALL DELAY10 ;延时10毫秒触点消抖
JNB P1.0,IFSEC ;如果是干扰就返回
JB P1.0,$ ;等待按键K1松开
CLR EA ;关中断
INC_MIN
ACALL DISPLAY
MOV TL1,#0B0H
MOV TH1,#3CH
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;分钟处理字程序
INC_MIN:
MOV A,#99 ;判断分钟是否为99
CLR C
SUBB A,ADDR_MIN
JZ A,CLR_MIN
INC ADDR_MIN
CLR_MIN:
MOV ADDR_MIN,#0
MOV ADDR_SEC,#0
RET
;;;;;;;;;;;;;;;;;;;;;;;10毫秒延时子程序
DELAY10:
MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
T1INT:
CLR EA ;关中断
CJNE R2,#0,SD
MOV R2,10
ACALL DISPLAY
CJNE ADDR_SEC,#0,SD
CJNE ADDR_MIN,#0,SD
ACALL BELL
SD: ;重新设置T1初值,开中断
DEC R2
MOV TL1,#0B0H
MOV TH1,#3CH
SETB EA
RETI
;;;;;;;;;;;;;;;;;;;;;;;报警子程序
BELL:
CLR P1.6
RET
;;;;;;;;;;;;;;;;;;;;;;;显示子程序
DISPLAY:
MOV A,ADDR_SEC
MOV B,#10
DIV AB
ORL A,B ;将十位和个位拼装成BCD码
MOV DPTR,#4000
MOVX @DTPR,A
MOV A,ADDR_MIN
MOV B,#10
DIV AB
ORL A,B
MOV DPTR,#4001
MOVX @DPTR,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -