📄 计时.txt
字号:
************初始化**************
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INTT0
KEYB EQU 08H ;键盘值存储
NAOB EQU 09H ;闹钟单元标识
MENUB EQU 0AH ;菜单显示存储标识
First EQU 0BH ;显示缓冲单元
Second EQU 0CH
Third EQU 0DH
Fourth EQU 0EH
Fifth EQU 0FH
HOUR EQU 10H ;时钟单元
MIN EQU 11H
SEC EQU 12H
MSEC EQU 13H
ANJIANB EQU 14H ;存储按键位
QUEDB EQU 15H ;菜单级存储
BI bit 00 ;去抖动标识
KAIJIB bit 01 ;开机标识
MB bit 02 ;菜单标识
NB bit 03 ;闹钟启动标识
SI bit 04 ;“-”闪烁标识
SB bit 05 ;调分标识
HB bit 06 ;调时间闪烁标识
PB bit 07 ;秒表标识
UI bit 08 ;查询闹钟标识
************主程序MAIN***************
MAIN:
MOV SP,#70H ;初始化
MOV KEYB,#0FFH
MOV QUEDB,#00H
CLR BI
CLR KAIJIB
CLR SI
CLR MB
CLR HB
CLR PB
CLR UI
MOV R1,#0BH ;显示缓存单元清空
XX1:
MOV @R1,#11H
INC R1
CJNE R1,#10H,XX1
MOV R1,#10H ;时钟单元初始化,设为“00-00”
XX2:
MOV @R1,#00H
INC R1
CJNE R1,#14H,XX2
MOV 16H,#11H ;调时闪烁转换单元初始化
MOV 17H,#11H
MOV 30H,#02H ;预置菜单显示,调时菜单为“ZHONG”
MOV 31H,#12H
MOV 32H,#00H
MOV 33H,#14H
MOV 34H,#09H
MOV 35H,#11H ;设置闹钟菜单为“ NAO ”
MOV 36H,#14H
MOV 37H,#0AH
MOV 38H,#00H
MOV 39H,#11H
MOV 3AH,#11H ;取消闹钟菜单为“ DEL ”
MOV 3BH,#0DH
MOV 3CH,#0EH
MOV 3DH,#13H
MOV 3EH,#11H
MOV 3FH,#11H ;秒表菜单为“ SEC ”
MOV 40H,#05H
MOV 41H,#0EH
MOV 42H,#0CH
MOV 43H,#11H
MOV R0,#50H ;闹钟存储单元初始化
MOV R1,#14H
GG:
MOV @R0,#0FFH
INC R0
DJNZ R1,GG
MOV P1,#0FFH ;P1口初始化
MOV TMOD,#01H ;定时器初始化
MOV TL0,#0F0H
MOV TH0,#0D8H
MOV R6,#02H ;0.5秒计时两次
KAI:
LCALL START ;等待第一次开机
JNB KAIJIB,KAI
SETB EA ;启动定时器,开启中断
SETB ET0
SETB TR0
BEGIN:
JB KAIJIB,BEGIN1 ;选择显示类型,关机态为黑屏
BEGIN0:
LCALL PLAY
SJMP CAIJIAN
BEGIN1:
JNB MB,BEGIN2 ;菜单态为相应的菜单显示
SJMP BEGIN0
BEGIN2:
LCALL DISPLAY ;否则显示时钟
CAIJIAN:
JB BI,PANNAO ;判断KEYB有无按键值
MOV A,KEYB
SUBB A,#0FFH
JZ PANNAO ;没有跳到闹钟判断
LCALL KEY ;有调键盘处理子程序
PANNAO:
JNB UI,BACK1 ;到一分,进行闹钟检测,看有无
MOV R0,#50H ;闹钟到时
TT0:
MOV R1,#14H
MOV A,@R0
CJNE A,HOUR,TT1
INC R0
MOV A,@R0
CJNE A,MIN,TT2
SETB NB
MOV NAOB,R0
CLR UI
LCALL NAOZHONG ;有,清UI调闹钟提示音
LJMP BACK1
TT1:
INC R0
TT2:
INC R0
DJNZ R1,TT0
CLR UI ;没有,清UI返回显示
BACK1:
SJMP BEGIN
**************TO中断INTT0****************
INTT0:
PUSH PSW ;保护现场
PUSH ACC
CLR TR0 ;关定时器
MOV A,#0F0H ;定时器重新赋值,并加中断后又计
ADD A,TL0 ;的值
MOV TL0,A
MOV A,#0D8H
ADD A,TH0
MOV TH0,A
SETB TR0
MOV A,P1 ;查询有无键输入
ANL A,#0FFH
JB BI,YBI ;判断是否为去抖动
MOV KEYB,A
SUBB A,#0FFH ;判断是否有键输入
JZ JIAYI ;没键,转JIAYI
SETB BI ;有键,不是去抖,设BI下次去抖动
SJMP JIAYI
YBI:
CJNE A,KEYB,WKEYB ;有键,是去抖,去抖动,有按键就
CLR BI ;存入KEYB
SJMP JIAYI
WKEYB:
MOV KEYB,#0FFH
CLR BI
JIAYI:
INC MSEC ;毫秒位加一
MOV A,MSEC
CJNE A,#32H,BACK2 ;是否到0.5s,没到中断返回
MOV MSEC,#00H ;毫秒单元清零,
MOV A,QUEDB ;是否为调时菜单
CJNE A,#01H,JJ
CPL HB
LCALL HUANWEI ;是,闪烁调整位
JJ:
DJNZ R6,BACK2 ;是否到一秒,没到中断退出
MOV R6,#02H
JNB PB,TT ;到1秒,判断秒表是否开启
INC 0FH ;开启就加1计时
MOV A,0FH
CJNE A,#0AH,TT
MOV 0FH,#00H
INC 0EH
MOV A,0EH
CJNE A,#06H,TT
MOV 0EH,#00H
INC 0CH
MOV A,0CH
CJNE A,#0AH,TT
MOV 0CH,#00H
INC 0BH
MOV A,0BH
CJNE A,#06H,TT ;秒表加满,显示“ FULL”,退出秒表
MOV 0BH,#11H
MOV 0CH,#0FH
MOV 0DH,#15H
MOV 0EH,#13H
MOV 0FH,#13H
LCALL DL2S
CLR PB
CLR MB
TT:
MOV MSEC,#00H
CPL SI ;闪烁标识取反
INC SEC ;秒单元加1
MOV A,SEC ;是否到60秒,否中断返回
CJNE A,#3CH,BACK2
MOV SEC,#00H ;是,秒单元清1
SETB UI ;设闹钟查询标识
INC MIN ;分单元加1
MOV A,MIN ;是否到60分,否中断返回
CJNE A,#3CH,BACK2
MOV MIN,#00H ;是,分单元清0
INC HOUR ;小时单元加1
MOV A,HOUR ;是否到24小时,否中断返回
CJNE A,#18H,BACK2
MOV HOUR,#00H ;是,小时单元清0BACK2:
POP ACC ;恢复现场
POP PSW
RETI
*************开机START************
START:
JB P1.3,BACK0 ;是否是开机键,否返回
LCALL DL2S ;是,延时2秒
JB P1.3,BACK0 ;是否还按着开机键,否返回
PD1:
LCALL PLAY ;是,松开按键调开机画面
JNB P1.3,PD1
SETB KAIJIB ;设开机位为1
MOV 0BH,#12H ;开机画面“HELLO”显示两秒
MOV 0CH,#0EH
MOV 0DH,#13H
MOV 0EH,#13H
MOV 0FH,#00H
LCALL DL2S
BACK0:
RET
*************关机CLOSE**************
CLOSE:
JB P1.3,BACK4 ;是否为关机键,否返回
LCALL DL2S ;是,延时两秒
JB P1.3,BACK4 ;是否还按着关机键,否返回
PD2:
LCALL DISPLAY ;是,松开按键调关机显示
JNB P1.3,PD2
CLR KAIJIB ;清开机标识
MOV 0BH,#11H ;关机显示“ BYE ”显示两秒
MOV 0CH,#0BH
MOV 0DH,#04H
MOV 0EH,#0EH
MOV 0FH,#11H
LCALL DL2S
MOV R1,#0BH ;显示缓存置黑屏值
HEIPING:
MOV @R1,#11H
INC R1
MOV A,R1
CJNE A,#10H,HEIPING
BACK4:
RET
****************时钟显示DISPLAY*****************
DISPLAY:
MOV R0,#HOUR ;时钟单元地址放R0
DISPLAY1:
MOV R1,#0BH ;显示缓存单元地址放R1
DIS:
MOV A,@R0 ;时钟数值转为BCD码放显示缓存单元
MOV B,#0AH
DIV AB
MOV @R1,A
MOV A,B
INC R1
MOV @R1,A
INC R1
INC R1
INC R0
CJNE R1,#11H,DIS
JNB SI,SS ;闪烁标识是否为1
MOV 0DH,#11H ;是,不显示
SJMP PLAY
SS:
MOV 0DH,#10H ;否,显示“-”
PLAY:
MOV R1,#0BH ;把显示缓存单元动态显示
MOV R2,#0FDH
MOV A,R2
PLAY1:
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1MS
INC R1
MOV A,R2
JNB ACC.5,ENDOUT
RL A
MOV R2,A
AJMP PLAY1
ENDOUT:
RET
TAB:
DB 88H,0EEH,94H,0C4H0E2H,0C1H,81H,0ECH,80H,0C0H,0A0H, 83H,
99H,86H,91H,0B1H, 0F7H,0FFH,0A2H,09BH,0A8H,08AH
;字段码表
;“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“A”,“B”,“C”,“D”,
;“E”,“F”,“-”,“ ”,“H”,“L”,“N”,“U”
***************延时DL1M***************
DL1MS:
MOV R4,#14H ;延时1ms
DL11: ;20*25=500us
MOV R5,#19H ;500*2=1ms
DL12:
DJNZ R5,DL12
DJNZ R4,DL11
RET
****************延时DL2S*****************
DL2S:
MOV R3,#0FAH ;延时2s
DL21: LCALL PLAY ;显示一次大约4ms
DJNZ R3,DL21 ;250*4=1s,1000*2=2 s
RET
*************键盘处理KEY************
KEY:
MOV ANJIANB,#00H ;存储按键位初始化
MOV R2,#05H ;判断按键值,看是否只有1个
MOV R4,#00H ;键按下
CLR C
MOV A,KEYB
KEYTEST:
RRC A
JNC TEST0
INC R4
SJMP TEST1
TEST0:
MOV ANJIANB,R4 ;判断按的是哪个键
TEST1:
DJNZ R2,KEYTEST
CJNE R4,#04H,BACK3 ;不是1个,返回
JB NB,KK ;是1个,判断闹钟是否启动
JB KAIJIB,ANJIAN ;判断是否为开机态,是转ANJIAN
LCALL START ;没开机,判断是否为开机操作
SJMP BACK3 ;是开机操作,开机返回,不是也返回
KK:
LCALL PLAY ;闹钟启动,任意键关闭,返回
MOV A,P1
CJNE A,#0FFH,KK
CLR NB
SETB P1.7
MOV R0,NAOB
MOV @R0,#0FFH
DEC R0
MOV @R0,#0FFH
SJMP BACK3
ANJIAN:
JB MB,ANJIAN0 ;是否为菜单态,否转ANJIAN0
LCALL CLOSE ;否,是否为关机操作
JNB KAIJIB,BACK3 ;是关机操作,关机
ANJIAN0:
MOV A,ANJIANB
CJNE A,#01H,ANJIAN1 ;是否是功能键,否转ANJIAN1
LCALL GONGNENG ;是,调功能子程序
LJMP BACK3
ANJIAN1:
CJNE A,#02H,ANJIAN2 ;是否是加一键,否转ANJIAN2
LCALL JIAJIAN ;是,调加一子程序
LJMP BACK3
ANJIAN2:
CJNE A,#03H,ANJIAN3 ;是否是确定键,否转ANJIAN3
LCALL QUEDING ;是,调确定子程序
LJMP BACK3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -