找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何让单片机按键检测更灵敏?

  [复制链接]
跳转到指定楼层
楼主
在做单片机按键程序的时候,灵敏度和效率难以取舍,各位大侠们,有没有更好的方法呢?

#include <REGX51.H>
#include <intrins.h>

//独立键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key
extern unsigned char keyboard_self()
{
        unsigned char num_key=0;//按键号
        unsigned char temp=0;//用于读取P2线上按键值
        static unsigned char temp_code=0;//保存按键值
        static unsigned char num_check=0;//低电平有效次数
        static unsigned char key_flag=0;//按键有效标识

        temp=P2&0xF0;//读取P2线数据

        if(temp!=0xF0)//低电平判断
        {
                num_check++;
                if(num_check==10)//连续10次(10ms)低电平有效,则认为按键有效
                {
                        key_flag=1;//使能按键有效标识
                        temp_code=temp;//保存按键值
                }
        }
        else//松手时判断
        {
                num_check=0;

                if(key_flag==1)//按键有效
                {
                        key_flag=0;

                        switch(temp_code)//读取按键号
                        {
                                case 0xE0: num_key=1;  P1=0xf0;
                                           break;
                                case 0xD0: num_key=2;  P1=0x0f;
                                           break;
                                case 0xB0: num_key=3;  P1=0xaa;
                                           break;
                                case 0x70: num_key=4;  P1=0xff;
                                           break;
                        }
                }
        }

        return(num_key);
}

void main()
{
        while(1)
        {
                keyboard_self();
        }
}



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

使用道具 举报

来自 2#
ID:283954 发表于 2022-4-2 16:58 | 只看该作者
看了很多抗抖动的讨论,想说几句,这些抗抖动的例子都只是停留在原理的解说,在实际应用时就是另一回事,必须看应用时按钮的实际用途。

一个按钮被按下,单片机一定能被检测到,如果需要在其他程序被用来处理事件,就SETB一个位做识别,然后离开,根本无需抗抖动,因为大多数程序完成事件处理后回来,早就过了抖动期。如果处理事件的程序事件太短,可以用这个SETB的位跳过按钮检测程序,等事件处理程序完成处理事件,把被SETB的位CLR掉,自然就会运行按钮检测程序,这样就不会发生按一次钮而多次触发的问题。如果希望按下钮后确保按钮必须放开,则在检测到按下后,进入检测放开的程序,不断循环,直到按钮被放开,但这就浪费单片机的时间了。

这说明在真实应用的中,抗抖动程序是很少用到的,教材只是教你原理。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:191022 发表于 2017-4-25 09:45 | 只看该作者
请各位大侠们多多指点
回复

使用道具 举报

地板
ID:130231 发表于 2017-4-25 13:27 | 只看该作者
要有消抖函数
回复

使用道具 举报

5#
ID:138155 发表于 2017-4-25 15:33 | 只看该作者
太灵敏容易误动作 一般加消抖程序
回复

使用道具 举报

6#
ID:114924 发表于 2017-4-25 15:48 | 只看该作者
如果你C写的不好,可以增加一个RC电路一颗4.7K电阻一颗104电容即可
回复

使用道具 举报

7#
ID:193502 发表于 2017-4-25 17:34 | 只看该作者
用消抖或者中断吧
回复

使用道具 举报

8#
ID:187614 发表于 2017-4-25 18:32 | 只看该作者
键盘操作在ms级,灵敏度根据自己设计需要吧,也可以增加硬件设计;效率高就需要中断方式。
回复

使用道具 举报

9#
ID:7485 发表于 2017-4-25 18:39 | 只看该作者
按键消抖只是毫秒级的,不至于影响什么效率吧?如果不加消抖或消抖时间短,容易产生误动作。
即便是使用中断,也要防止误动作。
只要键没问题,也不存在灵敏度的问题。
回复

使用道具 举报

10#
ID:111634 发表于 2017-4-25 21:12 | 只看该作者
本帖最后由 zl2168 于 2017-4-25 21:19 编辑

按键抖动一般是5~10ms,有少数超过10ms。手指按动按键最快50~100ms。因此,按键消抖不会影响按键动作灵敏度,影响按键动作灵敏度的是程序编制,程序中按键扫描实时性才会影响按键动作灵敏度。





以上摘自张志良编著《80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。






回复

使用道具 举报

11#
ID:112693 发表于 2017-4-27 11:53 | 只看该作者
延时去抖最简单,最好开关并联104电容
回复

使用道具 举报

12#
ID:148552 发表于 2017-4-28 13:54 | 只看该作者
硬件去抖就灵敏了,软件优化只是辅助作用
回复

使用道具 举报

13#
ID:190583 发表于 2017-4-28 16:47 | 只看该作者
硬件去做。软件辅助
回复

使用道具 举报

14#
ID:194618 发表于 2017-4-28 18:27 | 只看该作者
加个延时函数进行消抖,一般10ms
回复

使用道具 举报

15#
ID:108302 发表于 2017-4-28 22:15 | 只看该作者
使用中断
回复

使用道具 举报

16#
ID:197448 发表于 2017-5-6 19:32 | 只看该作者
我也在找这资料...
回复

使用道具 举报

17#
ID:191929 发表于 2017-5-6 20:13 | 只看该作者
按键一般要消抖,延时个5~~20ms
回复

使用道具 举报

18#
ID:43128 发表于 2017-5-7 14:23 | 只看该作者
可以加电容
回复

使用道具 举报

19#
ID:798954 发表于 2020-8-16 11:37 | 只看该作者
我觉得中断时最灵敏的,其次就是用一个定时器,然后每个一段时间扫描一下按键,32中的滴答定时器就是不错的选择
回复

使用道具 举报

20#
ID:730009 发表于 2022-3-31 21:27 | 只看该作者
可以用系统rtx
回复

使用道具 举报

21#
ID:971289 发表于 2022-4-1 08:17 | 只看该作者
只追求按键灵敏度就用中断,如果想提高按键稳定性就用硬件去抖。
回复

使用道具 举报

22#
ID:1014820 发表于 2022-4-1 11:14 | 只看该作者

电容怎么选择的
回复

使用道具 举报

23#
ID:1014855 发表于 2022-4-1 13:30 | 只看该作者
要加消抖,可以利用延时函数消除抖动
回复

使用道具 举报

24#
ID:264021 发表于 2022-4-1 19:14 | 只看该作者
没有消抖程序,加个20MS的按键延时,就搞定
回复

使用道具 举报

25#
ID:842688 发表于 2022-4-2 01:37 | 只看该作者
写个奇偶校验 没记错的话《手把手教你51单片机》这本书就有讲到
回复

使用道具 举报

26#
ID:933803 发表于 2022-4-3 16:41 | 只看该作者
使用消抖中断方式
回复

使用道具 举报

27#
ID:990881 发表于 2022-4-4 08:42 | 只看该作者
qianhuan 发表于 2022-4-1 11:14
电容怎么选择的

估一下延时时间,RC延时
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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