;***************************************
;*******定时0中断(0.5秒中断一次)********
t0_isr:
mov acc_bak,a
mov a,status
mov status_bak,a
inc half_second
mov a,half_second
sub a,2
snz c ;到了1秒吗?
jmp t0_ret ;没到,则退出
clr half_second
set second_change_b ;1S时间变化标志位
inc rtc_second ;秒变量加一
mov a,60
xor a,rtc_second
snz z ;到了1minute吗?
jmp t0_ret
clr rtc_second ;清1秒变量
set minute_change_b ;1minute时间变化标志位
inc rtc_minute ;分钟变量加一
mov a,60
xor a,rtc_minute
snz z ;到了1hour吗?
jmp t0_ret
clr rtc_minute ;清分钟变量
inc rtc_hour ;小时变量加一
mov a,24
xor a,rtc_hour
snz z
jmp t0_ret
clr rtc_hour
inc rtc_week ;星期变量加一
mov a,8
xor a,rtc_week
snz z ;到了星期天了没有?
jmp RTC_NEXT ;没到,则跳到RTC_NEXT处检查其它时间变量
mov a,1
mov rtc_week,a ;到了,则变为星期一
RTC_NEXT:
inc rtc_day ;日期变量加一
mov a,rtc_month ;查表看当前月份一共有多少天
mov disp_ram,a
dec rtc_month ;因为1月~12月,而表中(地址是F00H)是从0~11,故TBLP减一
mov a,rtc_month
add a,dig_month_tab
mov tblp,a
tabrdl L_day
mov a,disp_ram
mov rtc_month,a ;再保存回到rtc_month
mov a,28
xor a,L_day
snz z ;当月是28天的吗?
jmp RTC_NEXT1 ;不是,则跳到RTC_NEXT1处计算,看是否是到了当前月份的最后一天
mov a,rtc_year ;是的,则判断是否是平年还是闰年
and a,03h
snz z ;是闰年吗?
;闰年:能被4整除,2月为29天,当年为366天
;平年:3个平年后,就变为闰年,2月为28天,当年为365天
jmp RTC_NEXT1 ;不是,是平年,则跳到RTC_NEXT1处计算,看是否是到了当前月份的最后一天
mov a,29
mov L_day,a ;是闰年的话,则2月为29天
RTC_NEXT1:
mov a,L_day
sub a,rtc_day
sz c ;到了当前月份的最后一天吗?
jmp t0_ret ;不是,则直接退出定时中断子程序
mov a,1
mov rtc_day,a ;是的话,;就变为1号
inc rtc_month ;月变量加一
mov a,13
xor a,rtc_month
snz z ;到了12月份吗?
jmp t0_ret ;没到,则直接退出定时中断子程序
mov a,1
mov rtc_month,a ;到了,则月份变为1月
inc rtc_year ;年变量加一
mov a,100
xor a,rtc_year
snz z ;到了2100年吗?
jmp t0_ret ;没到,则直接退出定时中断子程序
clr rtc_year ;最大计算到2100年
t0_ret:
mov a,status_bak
mov status,a
mov a,acc_bak
reti |