从单片机基础到程序框架(全集 2019pdf版).pdf - 第687页

{ switch(u 8Part) { case 1 : Gu8PartUpd ate_1=1; break; case 2 : Gu8PartUpd ate_2=1; break; case 3 : Gu8PartUpd ate_3=1; break; case 4 : Gu8PartUpd ate_4=1; break; } } void RunTa sk(void) //倒计 时的应用程序 { if(0==Gu 8RunStart…

100%1 / 836
unsigned char Gu8RunStart=0; //应用程序的总启动
unsigned char Gu8RunStep=0; //应用程序的总运行步骤。建议跟 vGu8RunStart 成双成对出
unsigned char Gu8RunStatus=0; //当前倒计时的状态。0 代表停止,1 代表正在工作中
unsigned char Gu8EditData_4=0; //对应显示右起第 4 位数码管的“位”数据,是中间变量
unsigned char Gu8EditData_3=0; //对应显示右起第 3 位数码管的“位”数据,是中间变量
unsigned char Gu8EditData_2=0; //对应显示右起第 2 位数码管的“位”数据,是中间变量
unsigned char Gu8EditData_1=0; //对应显示右起第 1 位数码管的“位”数据,是中间变量
unsigned char Gu8Wd=1; //窗口选择变量。人机交互程序框架的支点。初始化开机后显示第 1 个窗口。
unsigned char Gu8WdUpdate=1; //整屏更新变量。初始化为 1 开机后整屏更新一次显示。
unsigned char Gu8Part=0; //局部选择变量。0 代表当前窗口下没有数据被选中
unsigned char Gu8PartUpdate_1=0; //局部 1 的更新变量,
unsigned char Gu8PartUpdate_2=0; //局部 2 的更新变量
unsigned char Gu8PartUpdate_3=0; //局部 3 的更新变量,
unsigned char Gu8PartUpdate_4=0; //局部 4 的更新变量
volatile unsigned char vGu8Display_Righ_4=1; //显示“1”,跟 vGu32CountdownTimerCnt 高位一致
volatile unsigned char vGu8Display_Righ_3=0;
volatile unsigned char vGu8Display_Righ_2=0;
volatile unsigned char vGu8Display_Righ_1=0;
volatile unsigned char vGu8Display_Righ_Dot_4=0;
volatile unsigned char vGu8Display_Righ_Dot_3=1; //开机默认保留显示 2 个小数点
volatile unsigned char vGu8Display_Righ_Dot_2=0;
volatile unsigned char vGu8Display_Righ_Dot_1=0;
volatile unsigned char vGu8KeySec=0;
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
KeyTask(); //按键的任务函数
DisplayTask(); //数码管显示的上层任务函数
RunTask(); //倒计时的应用程序
}
}
void PartUpdate(unsigned char u8Part) //局部选择对应的某个局部变量更新显示输出
{
switch(u8Part)
{
case 1:
Gu8PartUpdate_1=1;
break;
case 2:
Gu8PartUpdate_2=1;
break;
case 3:
Gu8PartUpdate_3=1;
break;
case 4:
Gu8PartUpdate_4=1;
break;
}
}
void RunTask(void) //倒计时的应用程序
{
if(0==Gu8RunStart)
{
return; // 如果总开关处于停止状态,则直接退出当前函数,不执行该函数以下的其它代码
}
switch(Gu8RunStep)
{
case 0: //在这个步骤里,主要用来初始化一些参
vGu8UpdateTimerFlag=0;
vGu16UpdateTimerCnt=10; //每 10ms 更新显示一次当前倒计时的时间
vGu8UpdateTimerFlag=1;
Gu8RunStep=1; //跳转到每 10ms 更新显示一次的步骤里
break;
case 1: //每 10ms 更新一次显示,确保实时显示当前倒计时的时
if(0==vGu16UpdateTimerCnt) //每 10ms 更新显示一次当前倒计时的时间
{
vGu8UpdateTimerFlag=0;
vGu16UpdateTimerCnt=10; //重置定时器,为下一 10ms 更新做准备
vGu8UpdateTimerFlag=1;
Gu8WdUpdate=1; //整屏更新一次显示当前倒计时的时间
if(0==vGu32CountdownTimerCnt) //如果倒计时的时间到,则跳转到结束的步骤
{
Gu8RunStep=2; //跳转到倒计时结束的步骤
}
}
break;
case 2: //倒计时结束的步骤
//Gu8RunStatus=0; //这行代码注释掉,让每次新启动之前都必须按一次 K1 复位按键才有效
Gu8RunStart=0; //倒计时的运行步骤的停止
Gu8RunStep=0; //总运行步骤归零。建议跟 vGu8RunStart 成双成对出
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=VOICE_TIME; //蜂鸣器发出“滴”一声
vGu8BeepTimerFlag=1;
Gu8WdUpdate=1; //整屏更新一次显示当前倒计时的时间
break;
}
}
void KeyTask(void) //按键的任务函数
{
if(0==vGu8KeySec)
{
return;
}
if(0!=Gu8RunStatus) //在“非停止”状态下,用 return 来拦截一些“不该响应”的按键
{
if(2==vGu8KeySec) //在“非停止”状态下,只响应[复位]这个按键
{
; //这里没有 return 语句,表示可以继续往下扫描本函数余下的代码,没有被拦截。
}