BEEP EQU P3.7 ;定义蜂鸣器(电铃)控制信号输出口
ORG 0000H ;程序入口地址
LJMP START
ORG 000BH ;定时器0中断入口地址
LJMP TIMER_0
ORG 0100H
;/*****程序开始,初始化*****/
START:
SETB BEEP ;关闭蜂鸣器(电铃)
SETB 48H ;使用一个bit位用于调时闪烁标志
SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基
CLR 45H ;关闭响铃方式1标志
CLR 44H ;关闭响铃方式2标志
MOV R1,#0 ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒
MOV 20H,#00H ;用于控制秒基准时钟源的产生
MOV 21H,#00H ;清零秒寄存器
MOV 22H,#00H ;清零分寄存器
MOV 23H,#00H ;清零时寄存器
MOV 24H,#00H ;用于控制调时闪烁的基准时钟的产生
MOV R2,#00H ;强制打铃标志
MOV R3,#00H ;强制打铃时长标志
MOV IP,#02H ;IP,IE初始化
MOV IE,#82H
MOV TMOD,#01H ;设定定时器0工作方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;赋定时初值,定时50ms
SETB TR0 ;启动定时器0
MOV SP,#40H ;重设堆栈指针
;/*****主程序*****/
MAIN:
CJNE R1,#00H,MAIN1 ;是否为正常走时状态
LCALL BIJIAO1 ;调用起床、熄灯打铃比较子程序
LCALL BIJIAO2 ;调用上、下课打铃比较子程序
LCALL DALING1 ;调用响铃方式1执行子程序
LCALL DALING2 ;调用响铃方式2执行子程序
LCALL DALING3
MAIN1:
LCALL DISPLAY ;调用显示子程序
LCALL KEY_SCAN ;调用按键检测子程序
JZ MAIN ;无键按下则返回重新循环
LCALL SET_KEY ;调用选择键处理子程序
JB 46H,MAIN ;如果已进行长按调整(调时快进),则不再执行下面的单步调整
LCALL ADD_KEY ;调用增加键处理子程序
LCALL DEC_KEY ;调用减少键处理子程序
LCALL DALING_KEY ;处理强制打铃/强制关闭铃声键
LJMP MAIN ;重新循环
;/*****定时中断服务程序*****/
TIMER_0:
PUSH ACC
PUSH PSW ;保护现场
MOV TH0,#3CH
MOV TL0,#0B0H ;重新赋定时初值
CPL 47H ;产生脉冲用于调时快进时基
INC 24H
MOV A,24H
CJNE A,#10,ADD_TIME ;产生0.5秒基准时钟,用于调时闪烁
CPL 48H ;取反调时闪烁标志位