找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4731|回复: 1
收起左侧

按键检测非阻塞代码(2种模式)

[复制链接]
ID:73477 发表于 2015-2-10 16:05 | 显示全部楼层 |阅读模式
按键检测的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++;//按键有效后的动作指令,点亮等,功能变化等等事件
}
}

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


回复

使用道具 举报

ID:159270 发表于 2017-2-24 00:31 | 显示全部楼层
试一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表