📄 new_clock_gai.asm
字号:
SJMP EXIT
MMADD:
INC month ;月份加1
SJMP EXIT
DDADD: INC DATE
SJMP EXIT
;***********退出中断0******************************************
EXIT:
POP ACC
POP PSW
RETI
;***********键盘子程序*****************************************
KEY: lcall keytest
jnb keystate,over
ajmp next00
over: ajmp keyend
next00:
acall DIS_JUDGE
acall DIS_JUDGE
acall DIS_JUDGE ;消除抖动
lcall keytest1
jnb keystate,over
MOV dptr,#duanxuan
MOV a,#00h
movx @dptr,a ;关显示
;***********读取键盘的值***************************************
MOV a,#01h
mov dptr,#weixuan
movx @dptr,a
movx a,@dptr
anl a,#0fh
key0: cjne a,#01h,key1
mov keys,#00h
setb keystate
ajmp keyend
key1: cjne a,#02h,key2
mov keys,#01h
setb keystate
ajmp keyend
key2: cjne a,#04h,key3
mov keys,#02h
setb keystate
ajmp keyend
key3: cjne a,#08h,keynext1
mov keys,#03h
setb keystate
ajmp keyend
keynext1:
mov a,#02h
mov dptr,#weixuan
movx @dptr,a
movx a,@dptr
anl a,#0fh
key4: cjne a,#01h,key5
mov keys,#04h
setb keystate
ajmp keyend
key5: cjne a,#02h,key6
mov keys,#05h
setb keystate
ajmp keyend
key6: cjne a,#04h,key7
mov keys,#06h
setb keystate
ajmp keyend
key7: cjne a,#08h,keynext2
mov keys,#07h
setb keystate
ajmp keyend
keynext2:
mov a,#04h
mov dptr,#8fffh
movx @dptr,a
movx a,@dptr
anl a,#0fh
key8: cjne a,#01h,key9
mov keys,#08h
setb keystate
ajmp keyend
key9: cjne a,#02h,keyA
mov keys,#09h
setb keystate
ajmp keyend
keyA: cjne a,#04h,keyB
mov keys,#0ah
setb keystate
ajmp keyend
keyB: cjne a,#08h,keynext3
mov keys,#0bh
setb keystate
ajmp keyend
keynext3:clr keystate
keyend: ret
;************键盘测试程序,返回结果在keystate中************************
keytest:
mov a,#0ffh
MOV dptr,#weixuan
MOVX @dptr,a
MOVX a,@dptr
anl a,#0fh
jz keytest0
setb keystate
jmp keytest1
keytest0: clr keystate
keytest1: ret
;************键盘处理子程序**********************************
dokey: jb keystate,key_all
ajmp keyend1
;判断键值
key_all:
mov a,keys
key_0: cjne a,#00h,key_1
ajmp key00
key_1: cjne a,#01h,key_2
ajmp key11
key_2: cjne a,#02h,key_3
ajmp key22
key_3: cjne a,#03h,key_4
ajmp key33
key_4: cjne a,#04h,key_5
ajmp key44
key_5: cjne a,#05h,key_6
ajmp key55
key_6: cjne a,#06h,key_7
ajmp key66
key_7: cjne a,#07h,key_8
ajmp key77
key_8: cjne a,#08h,key_9
ajmp key88
key_9: cjne a,#09h,key_a
ajmp key99
key_a: cjne a,#0ah,key_b
ajmp keyaa
key_b: cjne a,#0bh,keyend1
ajmp keybb
;执行相应的动作
key00: lcall houradd1 ;key0键按下,小时加1
ajmp keyend1
key11: lcall minuteadd1 ;key1键按下,分钟加1
ajmp keyend1
key22: lcall secondadd1 ;key2键按下,秒钟加1
ajmp keyend1
key33: lcall clock ;key3键按下,闹钟/时钟切换
ajmp keyend1
key44: lcall yearadd1 ;key4键按下,年数加1
ajmp keyend1
key55: lcall MONTHADD1 ;key5键按下,月份加1
ajmp keyend1
key66: lcall DATEADD1 ;key6键按下,天数加1
ajmp keyend1
key77: lcall DT ;key7键按下,日历/时钟切换
ajmp keyend1
key88: lcall killclock
ajmp keyend1
key99: lcall killclock
ajmp keyend1
keyaa: lcall killclock
ajmp keyend1
keybb: lcall killclock ;keyB键按下,停止闹铃
keyend1: lcall dis_JUDGE
ret
;*********日历/时钟切换***************************
DT:
CPL TIME_CAL ;TIME_CAL为日历/时钟切换标志位,其值为1进入日历状态,为0则退出
MOV SECTMP,SECOND1 ;获得按键时秒钟时刻
MOV MINTMP,MINUTE1 ;获得按键时分钟时刻
ret
;*********消除闹铃子程序**************************
killclock:
SETB P1.6 ;蜂鸣器停止
CLR alarm; ;闹钟归为无效
CLR MARK ;闹铃停止
over1: RET
;*********小时加1子程序***************************
houradd1:
jnb mark1,dao1
inc hour2
MOV A,hour2 ;在闹铃状态时,给闹铃的时加1
jmp dao2
dao1:
inc hour1
MOV A,hour1 ;在计时状态时,给计时的时加1
dao2:
CJNE A,#24,houradd1_end
jnb mark1,dao3
MOV hour2,#00H
jmp houradd1_end
dao3:
MOV hour1,#00H
houradd1_end:
ret
;*********分钟加1子程序**********************************
minuteadd1:
jnb mark1,dao11
inc minute2
MOV A,minute2 ;在闹铃状态时,给闹铃的分加1
jmp dao22
dao11:
inc minute1
MOV A,minute1 ;在计时状态时,给计时的分加1
dao22:
CJNE A,#60,minuteadd1_end
jnb mark1,dao44
MOV minute2,#00H
jmp minuteadd1_end
dao44:
MOV minute1,#00H
minuteadd1_end :
ret
;*********秒钟加1子程序**********************************
secondadd1:
jnb mark1,dao111
inc second2
MOV A,second2 ;在闹铃状态时,给闹铃的秒加1
jmp dao222
dao111:
inc second1
MOV A,second1 ;在计时状态时,给计时的秒加1
dao222:
CJNE A,#60,secondadd1_end
jnb mark1,dao444
MOV second2,#00H
jmp secondadd1_end
dao444:
MOV second1,#00H
secondadd1_end:
ret
;**********年月日加1子程序************************************
yearadd1:
MOV A,year2 ;取年数
CJNE A,#99,yadd1 ;是否为99年?未够99年转至YYADD
MOV year2,#00H
INC year1 ;够99年,年数低位复0,高位加1
jmp yearadd1_end
yadd1: INC year2
jmp yearadd1_end
yearadd1_end:
ret
monthadd1:
inc month ;月份数加1
MOV A,month
CJNE A,#13,monthadd1_end ;够12月则归一
MOV month,#1
jmp monthadd1_end
monthadd1_end:
ret
dateadd1:
inc date
MOV A,month
CJNE A,#2,NOTFEB_ad ;是否为二月,不是二月转至NOTFEB_ad
ISFEB_ad:
NOP
MOV A,YEAR2 ;判断是否闰年
MOV B,#4
DIV AB
MOV R5,B
CJNE R5,#0,PING_ad
RUN_ad: MOV A,date ;是闰年,取天数(2月份).
CJNE A,#30,dateadd1_end ;29天是否到?未够29天转至结尾
MOV date,#1
jmp dateadd1_end
PING_ad:
MOV A,date ;不是闰年,取天数
CJNE A,#29,dateadd1_end ;28天是否到?未够28天转至结尾
MOV date,#1 ;够28天,天数置为1
jmp dateadd1_end
NOTFEB_ad: ;不是2月份
CJNE A,#4,YUE1_ad ;是否为4月份?
AJMP T12_ad
YUE1_ad:
CJNE A,#6,YUE2_ad ;是否为6月份?
AJMP T12_ad
YUE2_ad:
CJNE A,#9,YUE3_ad ;是否为9月份?
AJMP T12_ad
YUE3_ad:
CJNE A,#11,T11_ad ;是否为11月份?
AJMP T12_ad
T11_ad: MOV A,date ;是大月,取天数
CJNE A,#32,dateadd1_end ;31天是否到?未够31天转至结尾
MOV date,#1
jmp dateadd1_end ;够31天转至T30_ad
T12_ad: MOV A,date ;是小月,取天数
CJNE A,#31,dateadd1_end ;30天是否到?未够30天转至结尾
MOV date,#1
jmp dateadd1_end
dateadd1_end:
ret
;***********闹钟子程序************************************
clock:
cpl keytime ;其值为1进入设置闹铃状态,为0则退出
setb mark1 ;设闹钟状态标志位为1
jnb keytime,goback
MOV hourall,hour2
MOV minuteall,minute2
MOV secondall,second2
jmp clockover
goback:
clr mark1 ;闹钟标志位清零
setb alarm ;退出时置1
clockover: ret
;************闹铃响子程序*********************************
voice:
mov a,hour2
cjne a,hour1,over2
mov a,minute2
cjne a,minute1,NOISE
mov a,second2
cjne a,second1,NOISE
mov a,second2
add a,#12 ;闹钟响应的默认时长定位12s
MOV COUNT,A
SUBB A,#60 ;当闹钟时刻位于48~60s之间时,闹铃时长控制位有可能大于60s,做差以判断
JC SET_MARK ;当ACC小于60s时,借位CY=0,当ACC大于60s时,借位CY等于1,转到SET_MARK
MOV COUNT,A ;ACC<60S,闹铃结束时刻移入计数器COUNT
SET_MARK:
SETB MARK ;用MARK来决定闹铃是否还该继续
noise:
JNB MARK,OVER2 ;根据MARK判断是否要闹铃,MARK=1,则闹铃;否则over
ACALL ALA_DELAY
SETB p1.6
ACALL ALA_DELAY
CLR P1.6
MOV A,COUNT
CJNE A,SECOND1,OVER2 ;判断闹铃是否已持续12s
clear:
setb p1.6
clr alarm
CLR MARK
MOV COUNT,#0 ;闹铃结束,关蜂鸣器,清除闹钟有效位,闹铃有效位,计数器清零
over2:
ret
;************闹铃用延迟子程序*******************************
ALA_DELAY:
MOV R3,#0FFH
MOV R4,#0FFH
MOV R5,#0FFH
DE1: DJNZ R4,DE1
DJNZ R3,DE1
DE2: DJNZ R5,DE2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -