从单片机基础到程序框架(全集 2019pdf版).pdf - 第474页
void KeyTa sk(void) // 按键任务函 数,放在主函 数内 { if(0==vG u8KeySec) { return; //按键的触发 序号是 0 意味着无按 键触发 ,直接退出当 前函数,不执 行此函数下面 的代码 } switch(v Gu8KeySec) //根据不同的 按键触发序 号执行对 应的代码 { case 1 : //S1 触 发的任务 vGu8BeepTi merFlag=0 ; vGu16Beep…

Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
if(0==Su8ColumnRecord) //第 1 列输出低电平
{
vGu8KeySec=4; //触发 4 号键 对应 S4 键
}
else if(1==Su8ColumnRecord) //第 2 列输出低电平
{
vGu8KeySec=5; //触发 5 号键 对应 S5 键
}
else if(2==Su8ColumnRecord) //第 3 列输出低电平
{
vGu8KeySec=6; //触发 6 号键 对应 S6 键
}
}
}
else if(1==ROW_INPUT1&&1==ROW_INPUT2&&0==ROW_INPUT3)
{
Su16KeyCnt++; //去抖动延时计数器
if(Su16KeyCnt>=KEY_SHORT_TIME)
{
Su16KeyCnt=0;
Su8KeyLock=1;//自锁置 1,避免一直触发,只有松开按键,此标志位才会被清零
if(0==Su8ColumnRecord) //第 1 列输出低电平
{
vGu8KeySec=7; //触发 7 号键 对应 S7 键
}
else if(1==Su8ColumnRecord) //第 2 列输出低电平
{
vGu8KeySec=8; //触发 8 号键 对应 S8 键
}
else if(2==Su8ColumnRecord) //第 3 列输出低电平
{
vGu8KeySec=9; //触发 9 号键 对应 S9 键
}
}
}
}
break;
}
}

void KeyTask(void) //按键任务函数,放在主函数内
{
if(0==vGu8KeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8KeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //S1 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 2: //S2 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 3: //S3 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 4: //S4 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发

break;
case 5: //S5 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 6: //S6 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 7: //S7 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 8: //S8 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 9: //S9 触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //发出“嘀”一声
vGu8BeepTimerFlag=1;