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

{ return; //按键的触发 序号是 0 意味着无按 键触发 ,直接退出当 前函数,不执 行此函数下面 的代码 } switch(v Gu8KeySec) //根据不同的 按键触发序 号执行对 应的代码 { case 1 : //K1 触 发的任务 if(Gu8LedS tatus>0) { Gu8LedSt atus--; //控制 LE D“往左 边跑” Gu8Displ ayUpdate=1; // 刷新显示 } if…

100%1 / 836
Su16KeyContinuityCnt1=0; //清零,为了继续连击。
vGu8KeySec=1; //触发一次 K1 按键
vGu8ShieldVoiceFlag=1; //把当前按键触发的声音屏蔽掉
}
}
//K2 按键
if(0!=KEY_INPUT2)
{
Su8KeyLock2=0;
Su16KeyCnt2=0;
Su16KeyContinuityCnt2=0;
}
else if(0==Su8KeyLock2)
{
Su16KeyCnt2++;
if(Su16KeyCnt2>=KEY_SHORT_TIME)
{
Su8KeyLock2=1;
vGu8KeySec=2; //触发一次 K2 按键
Su16KeyCnt2=0;
}
}
else if(Su16KeyCnt2<=KEY_ENTER_CONTINUITY_TIME)
{
Su16KeyCnt2++;
}
else
{
Su16KeyContinuityCnt2++;
if(Su16KeyContinuityCnt2>=KEY_CONTINUITY_TIME)
{
Su16KeyContinuityCnt2=0;
vGu8KeySec=2; //触发一次 K2 按键
vGu8ShieldVoiceFlag=1; //把当前按键触发的声音屏蔽掉
}
}
}
void KeyTask(void) //按键任务函数,放在主函数内
{
if(0==vGu8KeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8KeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //K1 发的任务
if(Gu8LedStatus>0)
{
Gu8LedStatus--; //控制 LED“往左边跑”
Gu8DisplayUpdate=1; //刷新显示
}
if(0==vGu8ShieldVoiceFlag) //声音没有被屏蔽
{
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
}
vGu8ShieldVoiceFlag=0; //及时把屏蔽标志清零,避免平时正常的单击声音也被淹没。
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触
break;
case 2: //K2 发的任务
if(Gu8LedStatus<7)
{
Gu8LedStatus++; //控制 LED“往右边跑”
Gu8DisplayUpdate=1; //刷新显示
}
if(0==vGu8ShieldVoiceFlag) //声音没有被屏蔽
{
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
}
vGu8ShieldVoiceFlag=0; //及时把屏蔽标志清零,避免平时正常的单击声音也被淹没。
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触
break;
}
}
void T0_time() interrupt 1
{
VoiceScan();
KeyScan(); //按键识别的驱动函
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}
void BeepOpen(void)
{
P3_4=0;
}
void BeepClose(void)
{
P3_4=1;
}
void VoiceScan(void)