独立按键扫描模块,注意两个事项:1 中断定时4MS ,2 IO口初始化设置时对应的按键IO口设置为输入状态,并且打开内部上拉功能.
单片机源程序如下(有非常详细的代码注释):
void KEY_SCAN(void)
{
if(!f_key_press) //首先来读取标志位状态, 为0标志已经弹起状态了,我们要做的就是如何确定其按下
{
if(P_KEY){press_cnt=0;} //消抖过程,因为开了上拉,只要中途检测到IO口为高电平就清除之前的计数
press_cnt++; //读取到的电平不论是低还是高都++;上一行代码是读取到低就清零 所以不需担心读取到高会一直加
if(press_cnt>=10) //低电平累加到10*4MS 即40ms的时候.表示按下已经稳定了
{
press_cnt=0; //清零累加次数.不管任何时候,累加的次数到了以后第一时间清零
f_key_press=1; //按下的标志位置1 ,这个时候只是表示按下了.非一个完整的按下弹起过程
//用户可以根据需要添加功能 比如亮灯 比如转动马达等
}
}
else //因为之前已经按下了f_key_press这个标志位已经置1了,现在我们要做的是如何确定弹起
{
if(!P_KEY){press_cnt=0;} //消抖过程,因为开了上拉,弹起IO口应该是读取到高电平,所以只要读取到低电平就清零之前的计数
press_cnt++; //高电平累加,原理同按下哪里一个原理
if(press_cnt>=10) //高电平累加10*4MS即40ms的时候,表示弹起已经稳定了,接下来要做的是如何确定其弹起
{ //就是清零计数 清零标志位 让其下一次读取的电平的时候按照程序走
press_cnt=0; //清零累加次数.不管任何时候,累加的次数到了以后第一时间清零
f_key_press=0; //清零标志位,为下一次按下做准备
//用户可以根据需要添加功能,这里是弹起的时候添加功能,上面是按下的时候增加功能,
}
}
} |