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

//Su8Tem p_1 提取“十毫 秒”位。 Su8Temp_ 1=vGu32Coun tdownTimer Cnt/10%10; //实际精度是 0.001 秒,但显 示精度是 0. 01 秒 //判断 数据范围,来 决定最高位数 码管是否需 要显示。 if(vGu32 CountdownTi merCnt<100 00) //10. 000 秒。实际 4 位数 码管最大只能 显示 99.99 秒 { Su8Temp_ 4=1…

100%1 / 836
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 的“短按”
}
}
else if(0==Su8KeyLock1)
{
Su16KeyCnt1++;
if(Su16KeyCnt1>=KEY_FILTER_TIME)
{
Su8KeyShortFlag=1;
}
if(Su16KeyCnt1>=KEY_LONG_TIME)
{
Su8KeyLock1=1;
Su8KeyShortFlag=0;
vGu8KeySec=4; //触发 K1 的“长按”
}
}
if(0!=KEY_INPUT2)
{
Su8KeyLock2=0;
Su16KeyCnt2=0;
}
else if(0==Su8KeyLock2)
{
Su16KeyCnt2++;
if(Su16KeyCnt2>=KEY_FILTER_TIME)
{
Su8KeyLock2=1;
vGu8KeySec=2;
}
}
if(0!=KEY_INPUT3)
{
Su8KeyLock3=0;
Su16KeyCnt3=0;
}
else if(0==Su8KeyLock3)
{
Su16KeyCnt3++;
if(Su16KeyCnt3>=KEY_FILTER_TIME)
{
Su8KeyLock3=1;
vGu8KeySec=3;