(3)动态显示的核心在于依次选中一块数码管,并在此之前将相应数码管要显示的数字的段码送到端口,进行相应的延时后关闭数码管选通信号。不断执行上述过程就可以实现较为稳定的动态显示。
每次进入主程序都首先判断是否到了1s,到了则继续执行,否则,返回中断。
为了在显示完秒之后还能继续显示小时的十位,必须有一个用来计数的单元,用以区分当前显示的是小时还是分钟,还是秒,并以此作为仅次于显示次数N的循环。
对每一个单元(30H~32H)的两位BCD码的显示,用一位(21H).0来指示即将显示的是十位还是各位,据此控制刚才所说的单元指示数值是否用该加一或者重新初始化。
由此在DISPLAY子程序中有3重循环。调用入口参数为30H~32H单元的数值。
(4)半秒提示:采用两个发光二极管,每隔半秒闪烁。
中断5次就是半秒,并在相应的分支里设置P3.6和P3.7,保证二者同时取反即可。
这可以放在显示子程序内部,保证时间显示和半秒闪烁的同步,同时可以节约计数器。
(5)上下午指示:采用两个发光二极管来指示上下午。
只要判断30H单元的内容与11H相比较就可以知道是上午还是下午了,在分支语句里控制相应的灯亮了就行。如上所述,将它放置在显示子程序里较为方便。
时间显示模块的仿真结果
时分秒 上午
半秒提示
(三)按键模块
ADJUST的主体部分就是检测是否有按键按下,如果没有只是调用显示子程序,而有的话转去执行相应的分支语句。
为了防止干扰,我们便写了一个延时5ms左右的子程序,若是经过延时后,按键信号依然有效,则认定是有效信号,否则为干扰,返回程序起始点重新检测。
K1可以控制实现定时,所以定时器计数器依然是0在起作用,在其分支语句里根据按键次数使指针指向不同的单元(小时、分钟),然后检测K2\\K3的信号到来。
在K2\\K3的分支语句里实现指针所指向单元的加一或者减一,但是注意要按照时间规则来,对加一或者减一结果进行调整,否则可能出错。
对单元的加一或者减一直接反映到显示子程序和定时器计数器0或者1的16位计数单元里,所以,每次更改后的值就相当于对时间确定调节,并从该处继续计时,这样就实现了调时功能。
K4的分支语句要求实现定闹,它与K1分支语句的不同之处是更
改当前计数器为1,关闭0,在计数器1的中断服务程序里可以实现倒计时功能。
元器件:按钮开关
K1:控制调时 K3:对应单元减一 K2:对应单元加一 K4:控制定闹
(四)闹钟模块
(1)计时器T1的倒计时
同样是1s的倒计时,只是在中断程序里实现对
计时单元的减一,但在减一之前检测是否为0,如果是就调用报警子程序,如果不是则按照规则减一,注意的同样是数值的调整。
调整结束后返回ADJUST程序,继续检测,这样就可以实现连续调节。
相关推荐: