在写单片机程序的过程中,难免会遇到按键的写法,比如一个按键实现长按,
短按。本文只针对这些操作说明一下自己按键的思想。可应用到实际工程中。

 

按键处理过程:设置一个按键标志,按下时为1,松开时为0,然后每xxms执行这个函数,有按键按下时,计数器+1,然后根据计数的数值做一个判断。
单次按键需要在松开的时候判断计数器的值,长按的话可以直接判断计数的值到达用户自定义的值即可,详细的程序框架如下:

 

流程分析:

程序框架:

//参考伪代码
int main(void)
{
...
key_flag_old = read_io(GPIO_xx) ? 1:0 ; //判断初始化按键的状态
...
while(1)
{
......
//是否调用软件定时器
.......
}
}

void soft_timer() //软件定时器,时间自定
{
key_process();//按键处理
time_sys = clock_time();//在此获取时间,重新计时
}

void key_process(void) //按键处理
{
key_flag_cur = read_io(GPIO_xx)? 1:0 ; //读取当前按键的状态

if(key_flag_cur != key_flag_old) //按键按下或者松开检测,按下时,状态一直为1,松开时为0
{
key_on = !key_on;
key_flag_old = key_flag_cur;//把当前状态给旧的状态,以免重复运行该判断
}

if(key_on) //单次和长按都可判断
{
key_always_cnt++;
}

if(key_always_cnt >= n)
{
key_always_cnt = 0;
key_always_process();//长按按键的操作
}

if(!key_on && key_always_cnt>0) //按键松开时候进行检测,如果一直按着执行长按,这里也可以写1,可用于消抖
{
key_once_process();//单次按键的函数操作
key_always_cnt = 0;
}
}

如果有什么疑问,欢迎大家讨论,转贴请注明出处,谢谢。

                ---------cofin_add 

 

posted on 2017-05-05 11:16  洋葱洋葱  阅读(16365)  评论(0编辑  收藏  举报