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

default: //都没有被选 中的时 候 if(Gu32Set Data_Coun tdown<10000) { Su8Temp_4= 10; //显示“无” } else { Su8Temp_ 4=Gu8EditDa ta_4; //显示 “十秒”的临 时中间个体, 属于动态 数据。 } Su8Temp_3= Gu8EditDa ta_3; //显示“个秒 ”的临时中间 个体,属于 动态数据 。 Su8Temp_ 2=Gu8…

100%1 / 836
break;
case 2:
if(0==Su8BlinkFlag) //两种状态的切换判
{
Su8BlinkFlag=1;
Su8Temp_3=10; //右起第 3 个显示“不显示”10 代表不显示
}
else
{
Su8BlinkFlag=0;
Su8Temp_3=Gu8EditData_3; //显示“个秒”的临时中间个体,属于动态数据
}
break;
case 3:
if(0==Su8BlinkFlag) //两种状态的切换判
{
Su8BlinkFlag=1;
Su8Temp_2=10; //右起第 2 个显示“不显示”10 代表不显示
}
else
{
Su8BlinkFlag=0;
Su8Temp_2=Gu8EditData_2; //显示“百毫秒”的临时中间个体,属于动态数据。
}
break;
case 4:
if(0==Su8BlinkFlag) //两种状态的切换判
{
Su8BlinkFlag=1;
Su8Temp_1=10; //右起第 1 个显示“不显示”10 代表不显示
}
else
{
Su8BlinkFlag=0;
Su8Temp_1=Gu8EditData_1; //显示“十毫秒”的临时中间个体,属于动态数据。
}
break;
default: //都没有被选中的时
if(Gu32SetData_Countdown<10000)
{
Su8Temp_4=10; //显示“无”
}
else
{
Su8Temp_4=Gu8EditData_4; //显示“十秒”的临时中间个体,属于动态数据。
}
Su8Temp_3=Gu8EditData_3; //显示“个秒”的临时中间个体,属于动态数据
Su8Temp_2=Gu8EditData_2; //显示“百毫秒”的临时中间个体,属于动态数据。
Su8Temp_1=Gu8EditData_1; //显示“十毫秒”的临时中间个体,属于动态数据。
break;
}
vGu8Display_Righ_4=Su8Temp_4; //过渡需要显示的数据到底层驱动变量
vGu8Display_Righ_3=Su8Temp_3; //过渡需要显示的数据到底层驱动变量
vGu8Display_Righ_2=Su8Temp_2; //过渡需要显示的数据到底层驱动变量
vGu8Display_Righ_1=Su8Temp_1; //过渡需要显示的数据到底层驱动变量
}
}
void Wd2(void) //窗口 2 显示函数。倒计时的运行显示窗口。
{
//需要借用的中间变量,用来拆分数据位。
static unsigned char Su8Temp_4,Su8Temp_3,Su8Temp_2,Su8Temp_1; //需要借用的中间变
if(1==Gu8WdUpdate) //如果需要整屏更新
{
Gu8WdUpdate=0; //及时清零,只更新一次显示即可,避免一直进来更新显示
//先分解数据,注意,这里分解的时候,“先整除后求余”必须用一行代码一气呵成,不能拆
//分成两行代码,否则会有隐患会 bug。除非,把四个临时变都改成 unsigned long 类型。
//Su8Temp_4 提取“十秒”位。
Su8Temp_4=vGu32CountdownTimerCnt/10000%10; //实际精度是 0.001 秒,但显示精度是 0.01
//Su8Temp_3 提取“个秒”位。
Su8Temp_3=vGu32CountdownTimerCnt/1000%10; //实际精度是 0.001 秒,但显示精度是 0.01
//Su8Temp_2 提取“百毫秒”位。
Su8Temp_2=vGu32CountdownTimerCnt/100%10; //实际精度是 0.001 秒,但显示精度 0.01
//Su8Temp_1 提取“十毫秒”位。
Su8Temp_1=vGu32CountdownTimerCnt/10%10; //实际精度是 0.001 秒,但显示精度是 0.01
//判断数据范围,来决定最高位数码管是否需要显示。
if(vGu32CountdownTimerCnt<10000) //10.000 秒。实际 4 位数码管最大只能显示 99.99
{
Su8Temp_4=10; //在数码管转换表里,10 代表一个“不显示”的数据
}
//上面先分解数据之后,再过渡需要显示的数据到底层驱动变量里,让过渡的时间越短越好
vGu8Display_Righ_4=Su8Temp_4; //过渡需要显示的数据到底层驱动变量
vGu8Display_Righ_3=Su8Temp_3;
vGu8Display_Righ_2=Su8Temp_2;
vGu8Display_Righ_1=Su8Temp_1;
vGu8Display_Righ_Dot_4=0;
vGu8Display_Righ_Dot_3=1; //保留显示 2 位小数点
vGu8Display_Righ_Dot_2=0;
vGu8Display_Righ_Dot_1=0;
}
}
void KeyScan(void) //按键底层的驱动扫描函数,放在定时中断函数
{
static unsigned char Su8KeyShortFlag=0; //按键“短按”触发的标志
static unsigned char Su8KeyLock1;
static unsigned int Su16KeyCnt1;
static unsigned char Su8KeyLock2;
static unsigned int Su16KeyCnt2;
static unsigned char Su8KeyLock3;
static unsigned int Su16KeyCnt3;
//需要详细分析以下这段“短按”与“长按”代码的朋友,请参考第 96 节。
if(0!=KEY_INPUT1)
{
Su8KeyLock1=0;
Su16KeyCnt1=0;
if(1==Su8KeyShortFlag)
{
Su8KeyShortFlag=0;
vGu8KeySec=1; //触发 K1 的“短按”
}
}