找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8647|回复: 26
收起左侧

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

  [复制链接]
ID:191022 发表于 2017-4-25 09:44 | 显示全部楼层 |阅读模式
在做单片机按键程序的时候,灵敏度和效率难以取舍,各位大侠们,有没有更好的方法呢?

#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();
        }
}



回复

使用道具 举报

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 | 显示全部楼层
要有消抖函数
回复

使用道具 举报

ID:138155 发表于 2017-4-25 15:33 | 显示全部楼层
太灵敏容易误动作 一般加消抖程序
回复

使用道具 举报

ID:114924 发表于 2017-4-25 15:48 | 显示全部楼层
如果你C写的不好,可以增加一个RC电路一颗4.7K电阻一颗104电容即可
回复

使用道具 举报

ID:193502 发表于 2017-4-25 17:34 | 显示全部楼层
用消抖或者中断吧
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

ID:111634 发表于 2017-4-25 21:12 | 显示全部楼层
本帖最后由 zl2168 于 2017-4-25 21:19 编辑

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




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






回复

使用道具 举报

ID:112693 发表于 2017-4-27 11:53 | 显示全部楼层
延时去抖最简单,最好开关并联104电容
回复

使用道具 举报

ID:148552 发表于 2017-4-28 13:54 | 显示全部楼层
硬件去抖就灵敏了,软件优化只是辅助作用
回复

使用道具 举报

ID:190583 发表于 2017-4-28 16:47 | 显示全部楼层
硬件去做。软件辅助
回复

使用道具 举报

ID:194618 发表于 2017-4-28 18:27 | 显示全部楼层
加个延时函数进行消抖,一般10ms
回复

使用道具 举报

ID:108302 发表于 2017-4-28 22:15 | 显示全部楼层
使用中断
回复

使用道具 举报

ID:197448 发表于 2017-5-6 19:32 | 显示全部楼层
我也在找这资料...
回复

使用道具 举报

ID:191929 发表于 2017-5-6 20:13 | 显示全部楼层
按键一般要消抖,延时个5~~20ms
回复

使用道具 举报

ID:43128 发表于 2017-5-7 14:23 | 显示全部楼层
可以加电容
回复

使用道具 举报

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

使用道具 举报

ID:730009 发表于 2022-3-31 21:27 | 显示全部楼层
可以用系统rtx
回复

使用道具 举报

ID:971289 发表于 2022-4-1 08:17 | 显示全部楼层
只追求按键灵敏度就用中断,如果想提高按键稳定性就用硬件去抖。
回复

使用道具 举报

ID:1014820 发表于 2022-4-1 11:14 | 显示全部楼层

电容怎么选择的
回复

使用道具 举报

ID:1014855 发表于 2022-4-1 13:30 | 显示全部楼层
要加消抖,可以利用延时函数消除抖动
回复

使用道具 举报

ID:264021 发表于 2022-4-1 19:14 | 显示全部楼层
没有消抖程序,加个20MS的按键延时,就搞定
回复

使用道具 举报

ID:842688 发表于 2022-4-2 01:37 | 显示全部楼层
写个奇偶校验 没记错的话《手把手教你51单片机》这本书就有讲到
回复

使用道具 举报

ID:933803 发表于 2022-4-3 16:41 | 显示全部楼层
使用消抖中断方式
回复

使用道具 举报

ID:990881 发表于 2022-4-4 08:42 | 显示全部楼层
qianhuan 发表于 2022-4-1 11:14
电容怎么选择的

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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