Key_1Key_1Key_1程序开始A: 时钟状态(默认)B: 设置闹铃状态C: 秒表状态(处理时钟状态下的所有事务)(处理设置闹铃状态下的所有事务)(处理秒表状态下的所有事务)多功能时钟流程图一. 功能确认 时钟功能:1.时钟显示小时和分钟2.用户可以通过按键调整时钟的时间3.无论当前时钟是否在前台显示,时钟始终是运行的。 定时闹铃功能:1.用户可以通过按键设置闹铃时间(小时和分钟),设置完成后可以按确定键退出设置。2.当系统时钟的时间等于预设的闹铃时间时,系统蜂鸣器响 5 秒钟。3.用户可以设置两个闹铃。 秒表功能:1.用户可以通过按键进入秒表功能,也可以退出秒表状态。2.秒表高 2 位显示秒,低 2 位显示百分之一秒。3.可以通过按键暂停、(继续)运行秒表,可以通过按键对秒表清零。二. 状态分析及模块分割根据以上的分析,系统共有三个大的功能:时钟、设置定时、秒表,各个功能之间可以通过按键来切换,且各个功能内部仍需要使用按键来处理,故可以考虑将系统定义为三个状态(status):时钟状态、设置定时状态、秒表状态。显然,同一个按键在不同状态下的功能是不一样的。这样,在某种状态下,按下某个按键,代表唯一确定的含义。这种处理方法可以称为“状态—按键”法。这样我们可以把程序对应地分成以下三个任务模块。这个流程就可以作为主流程(main()函数),当然,A、B、C 三框内部的流程仍有待于细化。分析用户按下了什么键?切换到设置闹铃状态,显示 ON01Key_1 键:时钟调校:小时数加 1Key_2 键:时钟调校:分钟数加 1Key_3 键:结束分析用户按下了什么键?切换到秒表状态调用秒表显示Key_1 键:闹铃预设:小时数加 1Key_2 键:闹铃预设:分钟数加 1Key_3 键:结束显示 ON01 或者预设的闹铃时间没有按键:三. 详细设计A 框内部要处理的事务见第一部分:功能确认。在此,为了完成时钟调整功能,我们可以定义 Key_2 为小时调整键,Key_3 为分钟调整键,每次按下键,小时数或分钟数加 1。当然,当用户没有按键的时候,我们还得常常保持显示屏上的时间刷新。A 框:时钟状态下的处理流程:B 框要处理的功能是设置定时闹铃的事务,这里需要预设闹铃时间,同样可以定义 Key_2 为小时预设键,Key_3 为分钟预设键,而 Key_1 则负责状态切换,当我们预设好时间之后,按下 Key_1,就算完成了闹铃预设,让系统离开当前状态,转到秒表状态上去。B 框:设置闹铃状态下的处理流程:C ...