从单片机基础到程序框架(全集 2019pdf版).pdf - 第485页
vGu8Single KeySec=0; //响应 按键服务处理 程序后 ,按键编号必 须清零,避免 一直触发 break; default: / /其它按键触发 的单击 vGu8Single KeySec=0; //响应 按键服务处理 程序后 ,按键编号必 须清零,避免 一直触发 break; } } void Doubl eKeyTask( void) //双击 按键任务函数 ,放在 主函数内 { if(0==vG u8Double…

if(0==Su8ColumnRecord) //第 1 列输出低电平
{
vGu8SingleKeySec=7; //触发 7 号键 对应 S7 键
}
else if(1==Su8ColumnRecord) //第 2 列输出低电平
{
vGu8SingleKeySec=8; //触发 8 号键 对应 S8 键
}
else if(2==Su8ColumnRecord) //第 3 列输出低电平
{
vGu8SingleKeySec=9; //触发 9 号键 对应 S9 键
}
}
}
}
break;
}
}
void SingleKeyTask(void) //按键单击的任务函数,放在主函数内
{
if(0==vGu8SingleKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8SingleKeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //S1 按键的单击任务
//通过 Gu8LedStatus 的状态切换,来反复切换 LED 的“灭”与“亮”的状态
if(0==Gu8LedStatus)
{
Gu8LedStatus=1; //标识并且更改当前 LED 灯的状态。0 就变成 1。
LedOpen(); //点亮 LED
}
else
{
Gu8LedStatus=0; //标识并且更改当前 LED 灯的状态。1 就变成 0。
LedClose(); //关闭 LED
}

vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
default: //其它按键触发的单击
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
void DoubleKeyTask(void) //双击按键任务函数,放在主函数内
{
if(0==vGu8DoubleKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8DoubleKeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //S1 按键的双击任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发双击后,发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8DoubleKeySec=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)
{
/* 注释三:
* 把 LED 的初始化放在 PeripheralInitial 而不是放在 SystemInitial,是因为 LED 显示内容对上电
* 瞬间的要求不高。但是,如果是控制继电器,则应该把继电器的输出初始化放在 SystemInitial。
*/
//根据 Gu8LedStatus 的值来初始化 LED 当前的显示状态,0 代表灭,1 代表亮
if(0==Gu8LedStatus)
{
LedClose(); //关闭 LED
}
else
{
LedOpen(); //点亮 LED
}
}
void BeepOpen(void)
{
P3_4=0;
}
void BeepClose(void)
{
P3_4=1;
}
void LedOpen(void)
{
P1_4=0;