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

Gu8EditDat a_4=Gu32S etData_Count down/1000 0%10; //分解 成“十秒”个体 Gu8EditDat a_3=Gu32S etData_Count down/1000 %10; //分解成“个秒 ”个体 Gu8EditDat a_2=Gu32S etData_Count down/100% 10; //分解成“ 百毫秒”个体 Gu8EditDat a_1=Gu32S etData_Count…

100%1 / 836
case 4: //局部 4 被选中,代表右起第 1 位数码管被选中。
if(Gu8EditData_1>0)
{
Gu8EditData_1--; //编辑“十毫位”个体的中间变量
}
PartUpdate(Gu8Part); //当前局部更新显示输出到数码管
break;
}
break;
}
}
else //处于“没有闪烁”的时候,是[开始健]
{
if(0==Gu8RunStatus) //在停止状态下
{
vGu8CountdownTimerFlag=0;
vGu32CountdownTimerCnt=Gu32SetData_Countdown; //从“设置值”开始倒计时
vGu8CountdownTimerFlag=1; //允许倒计时的软件定时器的启动
Gu8RunStatus=1; //倒计时处于工作状态(并且,这一瞬间才正式启动倒计时)
Gu8RunStart=1; //倒计时的运行步骤的总开关开启
Gu8RunStep=0; //总运行步骤归零。建议跟 vGu8RunStart 成双成对出现
Gu8Wd=2; //进入倒计时运行的窗口
Gu8WdUpdate=1; //整屏更新一次显示,确保在启动的时候能显示到最新的数据
}
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=VOICE_TIME; //蜂鸣器发出“滴”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0;
break;
case 4: //K1 键的“长按”,具有进入和退出“闪烁模式”的功能。“退出”隐含“确定
switch(Gu8Wd) //在某个窗口
{
case 1: //在窗口 1
if(0==Gu8Part) //处于“没有闪烁”的时候,将进入“闪烁模式
{
Gu8EditData_4=Gu32SetData_Countdown/10000%10; //分解成“十秒”个体
Gu8EditData_3=Gu32SetData_Countdown/1000%10; //分解成“个秒”个体
Gu8EditData_2=Gu32SetData_Countdown/100%10; //分解成“百毫秒”个体
Gu8EditData_1=Gu32SetData_Countdown/10%10; //分解成“十毫秒”个体
Gu8Part=1; //进入“闪烁模式”,从“局部 1”开始闪烁
}
else //处于“闪烁模式”的时候,将退出到“没有闪烁,隐含“确定”功能
{
//把个体合并还原成数据
Gu32SetData_Countdown=Gu8EditData_4*10000+Gu8EditData_3*1000;
Gu32SetData_Countdown=Gu32SetData_Countdown+Gu8EditData_2*100;
Gu32SetData_Countdown=Gu32SetData_Countdown+Gu8EditData_1*10;
Gu8Part=0; //退出“闪烁模式”
Gu8WdUpdate=1; //整屏更
}
break;
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=VOICE_TIME; //蜂鸣器发出“滴”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0;
break;
}
}
void DisplayTask(void) //数码管显示的上层任务函
{
switch(Gu8Wd) //以窗口选择 Gu8Wd 为支点,去执行对应的窗口显示函数。又一次用到 switch 语句
{
case 1:
Wd1(); //窗口 1 显示函数。用来设置参数。
break;
case 2:
Wd2(); //窗口 2 显示函数。倒计时的运行显示窗口。
break;
}
}
void Wd1(void) //窗口 1 显示函数。用来设置参数
{
//需要借用的中间变量,用来拆分数据位。
static unsigned char Su8Temp_4,Su8Temp_3,Su8Temp_2,Su8Temp_1; //需要借用的中间变
static unsigned char Su8BlinkFlag=0; //两种状态的切换判断的中间变量
if(1==Gu8WdUpdate) //如果需要整屏更新
{
Gu8WdUpdate=0; //及时清零,只更新一次显示即可,避免一直进来更新显示
//属于静态数据,起“装饰”作用,切换窗口后只扫描一次的代码。
vGu8Display_Righ_Dot_4=0;
vGu8Display_Righ_Dot_3=1; //保留显示 2 位小数点
vGu8Display_Righ_Dot_2=0;
vGu8Display_Righ_Dot_1=0;
Gu8PartUpdate_1=1; //局部 1 更新显示
Gu8PartUpdate_2=1 ;//局部 2 更新显示
Gu8PartUpdate_3=1 ;//局部 3 更新显示
Gu8PartUpdate_4=1 ;//局部 4 更新显示
}
if(1==Gu8PartUpdate_1) //局部 1 更新显示
{
Gu8PartUpdate_1=0; //及时清零,只更新一次显示即可,避免一直进来更新显示
if(Gu32SetData_Countdown<10000)
{
Su8Temp_4=10; //显示“无
}
else
{
Su8Temp_4=Gu8EditData_4; //显示“十秒”的临时中间个体,属于动态数据。
}
vGu8Display_Righ_4=Su8Temp_4; //过渡需要显示的数据到底层驱动变量
}
if(1==Gu8PartUpdate_2) //局部 2 更新显示
{
Gu8PartUpdate_2=0; //及时清零,只更新一次显示即可,避免一直进来更新显示