;
LCALL TIME_TEST ;检查闹钟时间 LCALL DISP LCALL GET_KEY MOV A,#15
CJNE A,#9,LOOP_TO_10 LCALL BEEP LCALL SET_TIME LJMP LOOP
CJNE A,#10,LOOP_TO_11 LCALL BEEP
LCALL SET_ALARM_TIME JMP LOOP
CJNE A,#11,LOOP_TO_12 LCALL BEEP
LCALL SET_DOWN_TIMER ;设置倒计时间 JMP LOOP
CJNE A,#12,LOOP_TO_13 LCALL BEEP LCALL COUNTER JMP LOOP
CJNE A,#13,LOOP_TO_14 LCALL BEEP
LCALL DATE_ROLLER LJMP LOOP
CJNE A,#14,LOOP_TO_2 LCALL SET_DATE LJMP LOOP
CJNE A,#2,LOOP_TO_15 JB ALARM,ALARM_OFF LCALL BEEP LCALL BEEP SETB ALARM JMP LOOP LCALL BEEP CLR ALARM LJMP LOOP
LOOP_TO_10:
LOOP_TO_11:
LOOP_TO_12:
LOOP_TO_13:
LOOP_TO_14:
LOOP_TO_2:
ALARM_OFF:
NO_KEY:
LJMP LOOP
CJNE A,#1,NO_KEY JNB SOUND_ON,L1 CLR SOUND_ON LJMP L11 LCALL BEEP
LOOP_TO_1:
L1: SETB SOUND_ON L11: LJMP LOOP LOOP_TO_15:
CJNE A,#15,LOOP_TO_16 LCALL BEEP LCALL UART_HOST LJMP LOOP
CJNE A,#16,LOOP_TO_1 LCALL BEEP LCALL UART_SLAVE LJMP LOOP
LOOP_TO_16:
;;;检查是否启动闹钟 TIME_TEST:
JB ALARM,TI3 RET
;检查闹钟时间是否到了 TI3:
MOV A,HOUR
MOV B,HOUR_ALARM CJNE A,B,BK MOV A,MIN
MOV B,MIN_ALARM CJNE A,B,BK
LCALL TIME_OUT ;闹钟时间到了,开始提示 RET
MOV R0,#1 ;#256 ;MOV SEC_OLD,#100
MOV MUSIC_SELECT,#1 ;选择第一首歌曲 LCALL MUSIC ;LCALL GET_KEY
;CJNE A,#4,AL1 ;响铃次数没到,但是用户按K4停止闹钟
BK: TIME_OUT:
ALARMING:
;LJMP AL2
;响铃的次数到了就停
;AL1:DJNZ R0,ALARMING ;AL2: ;;;
;;;显示时钟初始值000000 INIT_SHOW: ;;;
;;;中断服务程序 INT_T0:
PUSH PSW PUSH ACC
CLR EA ;关中断 CLR TR0
MOV DPTR,#8000H MOV A,# B MOVX @DPTR,A MOV DPTR,#9000H MOV A,# B MOVX @DPTR,A RET RET
CLR ALARM
MOV A,#7 ;加上执行到SET TR0处需要的时间 ADD A,TL0 MOV TL0,A MOV A,#0DCH ADDC A,TH0 MOV TH0,A SETB TR0
INC COUNT ;秒输出 MOV A,COUNT
CJNE A,#100,TT1 ;是否一秒到了 MOV COUNT,#0 INC SEC MOV A,SEC CJNE A,#60,TT1 ;分输出 INC MIN MOV SEC,#0 MOV A,MIN CJNE A,#60,TT1
;是否一小时到了 ;是否一分钟到了
;时输出 INC HOUR MOV MIN,#0 MOV A,HOUR CJNE A,#24,TT1 MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0
MOV A,MONTH CJNE A,#2,NOT_2 MOV A,YEAR1 CJNE A,#0,NOT_100 MOV A,YEAR0 MOV B,#4 DIV AB MOV A,B CJNE A,#0,NOT_2 MOV R0,#28 LJMP DAY_TEST MOV A,YEAR1 MOV B,#4 DIV AB MOV A,B CJNE A,#0,NOT_2 MOV R0,#29 LJMP NO1
MOV DPTR,#(MONTHS-1) MOV A,MONTH MOVC +DPTR MOV R0,A LJMP DAY_TEST
;如果放在最后会出现 OUT OF RANGE 错误!
POP ACC POP PSW
SETB EA ;开中断 RETI INC DAY MOV A,DAY INC R0
NOT_100:
NOT_2:
NO1: TT1:
DAY_TEST:
MOV B,R0 CJNE A,B,TT1 MOV DAY,#1 INC MONTH MOV A,MONTH CJNE A,#13,TT1 MOV MONTH,#1 INC YEAR1 MOV A,YEAR1 CJNE A,#100,TT1 MOV YEAR1,#0 INC YEAR0 MOV A,YEAR0 CJNE A,#100,TT1 MOV YEAR0,#0 JMP TT1
;;;使用定时器T0 模式0 计时 INIT_TIMER: ;;;
;;;初始化:计时单元清零 INIT:
CLR ALARM ;关闭闹钟功能 MOV COUNT,#0 MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0
MOV HOUR_ALARM,#0 MOV MIN_ALARM,#0 MOV SEC_ALARM,#0
MOV SEC_OLD,#0 ;保存的秒值 以便对比 判断是否过了一秒 MOV HOUR_DOWN,#0 MOV MIN_DOWN,#0 MOV SEC_DOWN,#0
MOV TIME_BUF+2,# B ;显示时分秒之间的分隔符 MOV TIME_BUF+5,# B ;显示时分秒之间的分隔符 MOV YEAR0,#20 MOV YEAR1,#12 MOV TMOD,#01H MOV IE,# B MOV TL0,#00H MOV TH0,#0DCH SETB TR0 ;启动定时器T0 RET