3.2 子程序设计
3.2.1 实时时钟日历子程序设计
该程序主要实现对DS1302写保护、充电,对年、月、日、时、分、秒等寄存器的读写操作。在读写操作子程序中都执行了关中断指令,因为在串行通信时对时序要求比较高,而且在此是用I/O口软件模拟串行时钟脉冲,所以在通信过程中最好保证传输的连续性,不要允许中断。其流程图如图3.2
开始初始化写入时钟初值开始计时读出数据返回 图3.2实时时钟日历子程序流程图
DS1302每次上电时自动处于暂停状态,必须把秒寄存器的位7置位0,时钟才开始计时。如果DS1302一直没有掉电,则不存在此问题。
在进行写操作时,需要先解除写保护寄存器的“禁止”状态。当用多字节模式进行操作时,必须写够8字节。 3.2.2 显示子程序设计
用9012三极管驱动显示电路位选,将从DS1302读取出来的数编辑成对应的
BCD码,通过开各位的位选,将要显示的数字的BCD码送段选,就可以正常的显示,通过中断0键的切换判断是时、分、秒显示,还是年、月、日的显示。
时间显示子程序流程图参见图3.3。 3.2.3中断0子函数设计
当中断键S3有按下,程序跳转到中断子函数,显示相应的切换到如期显示,
如果在显示期间有修改日期按键按下,则相应的修改日期值。 中断0子程序流程图参见图3.5。 3.2.4 时间设置函数ftion0
用户每次按下S4键是都会调用该函数进行处理,每按一次修改时钟修改位
14
置记录,再根据该记录判断选择设置时钟的秒分时。在此主要通过按下S4键的次数设置对应时间的时、分、秒修改标志位,然后统一由时间加1修改功能函数进行修改,流程图如图3.4。 3.2.5 加1修改时间功能函数cum
用户按下S2键后,根据时间设置模块设置的修改标志位将时间相应的时、
分、秒、计数单元加1,其中需要针对时、分、秒的进制进行归零处理,流程图如图3.6。
3.2.6 日期设置函数ftion1
在日期显示状态下,用户每次按下S1键是都会调用该函数进行处理,毎按
一次修改时钟修改位置记录,再根据该记录判断选择设置时钟的秒分时。在此主要通过按下S1键的次数设置对应日期的年、月、日修改标志位,然后统一由日期加1修改功能函数进行修改,流程图如图3.7。 3.2.7 加1修改日期功能函数cum1
用户按下S2键后,根据日期设置模块设置的修改标志位将日期相应的年、
月、日计数单元加1,其中需要针对年、月、日的进制进行归零处理,流程图如图3.8。
15
开始 开始 从DS1302读取秒值 从DS1302读取日值 调秒显示子函数 调日显示子函数 从DS1302读取分值 从DS1302读取月值 调分显示子函数 调月显示子函数 从DS1302读小时值 从DS1302读年值 调小时显示子函数 调年显示子函数 返回 返回 图3.3显示子程序流程图
图3.4 时间设值函数流程图
16
中断0 现场保护 调日期显示子函数 N 判断是否有键按下? Y 调用LED显示函数和延时函数去抖 Y 是抖动吗? N 是时钟修改键吗? N 是加1功能键吗? Y 调初始化DS1302函数 Y N 调用时钟设置函数 调用加1修改函数 N 判断t是否到0? Y 恢复现场 中断返回 图3.5中断0子函数流程图
17
相关推荐: