标题: 如何让单片机按键检测更灵敏? [打印本页]

作者: whj023    时间: 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();
        }
}




作者: whj023    时间: 2017-4-25 09:45
请各位大侠们多多指点
作者: zqy181818    时间: 2017-4-25 13:27
要有消抖函数
作者: wuyibin2003    时间: 2017-4-25 15:33
太灵敏容易误动作 一般加消抖程序
作者: wenjiulin    时间: 2017-4-25 15:48
如果你C写的不好,可以增加一个RC电路一颗4.7K电阻一颗104电容即可
作者: sdgffg    时间: 2017-4-25 17:34
用消抖或者中断吧
作者: 51Lovers    时间: 2017-4-25 18:32
键盘操作在ms级,灵敏度根据自己设计需要吧,也可以增加硬件设计;效率高就需要中断方式。
作者: ahshmj    时间: 2017-4-25 18:39
按键消抖只是毫秒级的,不至于影响什么效率吧?如果不加消抖或消抖时间短,容易产生误动作。
即便是使用中断,也要防止误动作。
只要键没问题,也不存在灵敏度的问题。
作者: zl2168    时间: 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和汇编)语句条条有注解,便于阅读理解,便于自学。







作者: dragon19790000    时间: 2017-4-27 11:53
延时去抖最简单,最好开关并联104电容
作者: 你像风儿来了    时间: 2017-4-28 13:54
硬件去抖就灵敏了,软件优化只是辅助作用
作者: 614600455    时间: 2017-4-28 16:47
硬件去做。软件辅助

作者: metalbei    时间: 2017-4-28 18:27
加个延时函数进行消抖,一般10ms
作者: 00xx    时间: 2017-4-28 22:15
使用中断
作者: xiaoheiwushouji    时间: 2017-5-6 19:32
我也在找这资料...
作者: 惜缘2008    时间: 2017-5-6 20:13
按键一般要消抖,延时个5~~20ms
作者: 雄仔    时间: 2017-5-7 14:23
可以加电容
作者: jack678    时间: 2020-8-16 11:37
我觉得中断时最灵敏的,其次就是用一个定时器,然后每个一段时间扫描一下按键,32中的滴答定时器就是不错的选择
作者: 底层用户    时间: 2022-3-31 21:27
可以用系统rtx
作者: 电工小明    时间: 2022-4-1 08:17
只追求按键灵敏度就用中断,如果想提高按键稳定性就用硬件去抖。
作者: qianhuan    时间: 2022-4-1 11:14
雄仔 发表于 2017-5-7 14:23
可以加电容

电容怎么选择的
作者: 洛今夏    时间: 2022-4-1 13:30
要加消抖,可以利用延时函数消除抖动
作者: 单片机学习习    时间: 2022-4-1 19:14
没有消抖程序,加个20MS的按键延时,就搞定
作者: ziyundehao    时间: 2022-4-2 01:37
写个奇偶校验 没记错的话《手把手教你51单片机》这本书就有讲到
作者: dalaoshi    时间: 2022-4-2 16:58
看了很多抗抖动的讨论,想说几句,这些抗抖动的例子都只是停留在原理的解说,在实际应用时就是另一回事,必须看应用时按钮的实际用途。

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

这说明在真实应用的中,抗抖动程序是很少用到的,教材只是教你原理。
作者: 3346661547    时间: 2022-4-3 16:41
使用消抖中断方式
作者: 东方木青龙    时间: 2022-4-4 08:42
qianhuan 发表于 2022-4-1 11:14
电容怎么选择的

估一下延时时间,RC延时




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1