找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4077|回复: 9
打印 上一主题 下一主题
收起左侧

分享一个单片机按键抬起不用死等的代码

  [复制链接]
跳转到指定楼层
楼主
ID:101869 发表于 2021-5-23 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们经常用到按键抬起检测,很多人用while(!key)程序走到这里会死等,影响效率。分享一个不用死等的代码,实际用着还不错。代码如下
if(key==0&&key_sign==0) //检测输入如果为0(按键按下)并且按键标志为0.
        {
                   delay(10);  //抗抖延时                  

                      key_sign=1; //按键状态标志置1。        

        }
              if(key==1&&key_sign==1)//如果松开按键
              {
                 key_sign=0;//按键状态标志置0。
                           //写执行的程序。
                                                      
                }        

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:907675 发表于 2021-5-23 18:27 | 只看该作者
好思路
回复

使用道具 举报

板凳
ID:584814 发表于 2021-5-23 18:35 | 只看该作者
为何不在中断中用 ?
回复

使用道具 举报

地板
ID:47286 发表于 2021-5-24 01:22 来自触屏版 | 只看该作者
man1234567 发表于 2021-5-23 18:35
为何不在中断中用 ?

因为中断资源少 而且按键没必要
回复

使用道具 举报

5#
ID:451718 发表于 2021-5-24 16:32 | 只看该作者
在按键检测过程中用delay 有很多弊端,如下解决方法,即可防止抖动,又可调节按键手感,更加不会出现while(!key)的尴尬。  而且资源占用少。
switch(key)
{
    case 0:
        if((Systick-Tpress)<100) break;
        //------------按键响应操作
        Tpress = Systick;
    break;
    case 1:
        Tpress = Systick;
    break;
}
Systick和Tpress是什么变量? 不做解释了,不懂的看多点例程就知道了。
回复

使用道具 举报

6#
ID:299626 发表于 2021-5-26 00:09 | 只看该作者
mark,如果可以的话,按键用带中断的IO是最方便的,
回复

使用道具 举报

7#
ID:47286 发表于 2021-5-26 10:26 来自触屏版 | 只看该作者
我还是觉得用定时器好点 一个定时器中断可以给多个变量累加 中断只有2 扩展了也没几个 相比中断资源比定时器宝贵 一个按键就用中断有点可惜
回复

使用道具 举报

8#
ID:951974 发表于 2021-8-30 20:24 | 只看该作者
  delay(10);  //抗抖延时  这就是瞎胡闹
回复

使用道具 举报

9#
ID:624769 发表于 2021-9-1 20:49 | 只看该作者
delay(10) 抗抖这个,和 While 等按键抬起,半斤八两。不管你括号里的10代表什么,真要达到消抖的效果至少需要10毫秒。用死等消抖,和等按键抬起其实是同根同源。
真要不死等,就是定时器计数,连续5次为0表示确实按下,为1的时候就是释放,计数到200就标记为长按。
回复

使用道具 举报

10#
ID:119977 发表于 2021-9-7 10:15 | 只看该作者
我见过的 大师板子都是硬件加个104电容消抖  不差那几分钱
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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