标题: 按键检测非阻塞代码(2种模式) [打印本页]

作者: hutians    时间: 2015-2-10 16:05
标题: 按键检测非阻塞代码(2种模式)
按键检测的2种模式(低电平触发和高电平触发)
12f509为控制芯片 GP5口是按键检测口
key_time_cnt//延时计数器
key_flag//按键标志(key_flag=1按键有效,否则无效)
TIME_MAX//计数阀值
num//按键的功能变量
模式1(低电平触发)
if(GP5==1)//如果I/O是高电平,说明没有键按下
{
key_flag=0;//按键标志清零(无效)
key_time_cnt=0;//延时计数器清零
}
else if(key_flag==0)//这句话的意思其实是else if((key_flag==0)&&(GP5==0))按键被按下,而且是第一次被按下
{
   key_time_cnt++;//延时计数器开始延时计数
   if(key_time_cnt>TIME_MAX)//达到最大阀值(认为是按键真的被按下了)
    {
     key_time_cnt=0;//计数器清零
     key_falg=1;//按键标志置1,防止一直触发,
     num++;//按键有效后的动作指令,可以点亮一个灯,或者功能号变化等等事件
    }
}
模式2(高电平触发)//可以轻松检测交流电通断电的情况,只需要修改TIME_MAX值(与交流电同步信号波谷的10MS有关)。
if(GP5==0)//如果按键被按下
{
key_time_cnt++;//延时开始
if(key_time_cnt>TIME_MAX)//大于阀值
{
key_flag=1;//标志有效
}
}
else if(GP5==1)//按键松开,这句话对于单片机来说它并不知道,按键究竟是被按下弹起了,还是一直是处于没有被按下的状态,所以还要做进一步判断
{
key_time_cnt=0;//清延时计数器
if(key_flag==1)//如果按键被按下过,标志位为1说明按键曾经被按下过。这个条件和(GP5==1)组成松手状态
{
key_flag=0;//标志清零
num++;//按键有效后的动作指令,点亮等,功能变化等等事件
}
}

仅仅是为了防止自己忘记了这个思想而写。



作者: bg7nr    时间: 2017-2-24 00:31
试一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1