原创 按键消抖的软硬件方法

2016-2-18 20:46 2339 11 14 分类: MCU/ 嵌入式

    刚才整理电脑时候发现的以前存的资料。整理了一些,分享给新手们~

     我们所用的按键一般都是机械式的按键,因此在按下的时候并不立即导通,都有一定的抖动过程。在单片机的学习过程中,大家都有了这样一个按键消抖的概念。记得博主的单片老师在上课的时候苦口婆心地反复提这。

一、软件消抖:

其实包括课本,很多课外的资料都有些偷工减料的意思,按键消抖消得不科学。仅仅通过间隔一段时间的两次检测一般是无法确定的一个按键确实按下是还是松开了。下面博主贴的软件消抖是通过一段时间内多次持续检测的方法来确定一个键值,这段时间中如果有一次是高电平,就从头开始计,直到记够连续低电平的次数足够才确定按键按下,同样按键松开也是如此

这个思路新手一般比较困惑,不过等以后遇到这类问题时候就会恍然大悟了。(当然大神们用脚趾头想想就get了。。。说得好像大声脚趾头里有脑袋。。囧。)

下面介绍下编程的思路:

我们写这个按键函数取名为:MnKey(),倘若以后要用到按键的都可以偷懒调用这个按键函数啦~ 这个函数由下面这三个小函数组成:

void  KeyIn(void);    void KeyChk(void);    void  KeyCvt(void)

(1)首先在编写程序的时候先定义一个键值:#define KeyTime     10 //防抖定时时间

(2)一些是这三个函数的具体内容及简单介绍:

//=======================  

//函数功能:读入按键,并取反;

//输出参数:Keyport输出参数:KeyInBuff

void      KeyIn(void)

{

      KeyInBuff = KeyPort;

      KeyInBuff ^=0xff;  

}

//=======================  

//函数功能按键防抖;

//输入参数:KeyInBuff;输出参数:  KeyCvtBuff

void      KeyChk(void)

{    

      if(KeyInBuff==KeyChkBuff)

           {

           if(KeyInFlag==0)

                 return;

           else

                 {

                 DeKeyTime();

                 if(KeyTimeBuff!=0)

                      return;

                 else

                      {

                      KeyInFlag = 0;

                      KeyCvtBuff = KeyChkBuff;

                      }

                 }

           }

      else

           {

           KeyChkBuff = KeyInBuff;

           KeyTimeBuff = KeyTime;

           KeyInFlag = 1;

           }

}

//=========================================

//函数功能: 键值转换

//输入参数: KeyCvtBuff;输出参数:EventFIFO

void      KeyCvt(void)

{

      if(KeyCvtBuff==KeyOldBuff)

           return;

      else

           {

           KeyOldBuff = KeyCvtBuff;

            //你想做的事,,,yeah~

           }

}

//=====================================================

//函 数 名: DeKeyTime()

//功能描述: 按键防抖时间处理函数

void DeKeyTime(void)

{ uchar i;

i=50000;

while(i--)

{

if(KeyTimeBuff!=0)

KeyTimeBuff--;//调整键盘按下有效判定时间

}

}


(3)因此,在按键函数中调用这几个函数就行啦~

//=========================================

void      MnKey(void)

{

      KeyIn();

      KeyChk();

      KeyCvt()

}

其实让新手一下子写出这个按键防抖的程序是蛮难的,这个时候硬件消抖更为方便快捷。
二、硬件防抖

硬件防抖可以通过触发器和电容。依博主之见:最快捷的办法就是通过电容消抖。

如下图所示:当按键松开的时候,单片机的引脚为高电平,当按键按下时,单片机的引脚为低电平。

20160207205715184.jpg

和按键并联的电容作用就是消除按键的抖动。画个图来解释下这个电容的巨大的作用,就是:(这个抖动有点豪放,请不要介意,,,)

20160207205819969.jpg

今天大家抢红包很嗨嘛~

今天本来没想写这,但是被这惹烦了,好几次快完工就莫名其妙刷了,给我一片空白,真是欲哭无泪,难道每次不能默认保存吗。。郁闷啊,是我不会玩还是这个现在有点坑。。囧。。临时换了一篇少点的内容。。写完就去抢红包了。。

明天看星爷的《美人鱼》,主动打个广告。。毕竟我俺心中的永远的男神啊。

祝大家新年快乐!年年有鱼@#¥%…………@@@@#¥¥%词穷中。。。。。囧。总之一切顺心。哈哈哈


文章评论3条评论)

登录后参与讨论

用户1868903 2016-2-19 16:32

没有延时啊心碎

用户377235 2016-2-18 19:30

按键延时函数占用mcu时间太多。

用户377235 2016-2-18 19:27

延时函数占用mcu时间,
相关推荐阅读
用户1868903 2016-04-24 11:12
Cadence 画原理图
    Cadence 里面很多库,但是用多了就会知道,很多芯片库都是没有的,这个时候就需要自己画原理图了。很多工程师为了更快捷的画原理图,都会建立自己的原理图库。    自己建立一个平时用得...
用户1868903 2016-04-03 18:54
Arduino模拟串口
      现在很多人喜欢  Arduino 因为简单好用方便。虽然Arduino的串口只有一个,但是不担心,因为还有其他的IO口可以模拟串口,这篇博文里咱就分享一个用其他IO口模拟串口的exam...
用户1868903 2016-03-27 22:20
学习心得
 最近的一个项目里涉及到文件的打开...
用户1868903 2016-03-10 14:11
学习心得
最近在做一个项目,里面要用到stm32的HTTP网页服务器相关的知识,于是开始学习各种网络知识,都是以前没接触过的。看了一大堆协议,绕得我晚上都睡不踏实了,, 囧。。。网上的资源丰富但是同时也很杂。...
用户1868903 2016-03-04 13:47
电子时钟的设计(三)
一个蛮简单的要用三篇博文也是够够的。主要是我把程序贴得太仔细了。。囧。。应该详略得当,,,好吧。就最后cut掉一点了。。继上面的电子时钟的设计(二)了。 /**********************...
用户1868903 2016-03-04 13:39
电子时钟的设计(二)
上接电子时钟的设计(一)。由于篇幅和板式的限制,将.h和.c 合并在同一个文件,便于大家查看。这里再贴上 模式选择函数和秒表函数。 /*********************************...
我要评论
3
11
关闭 站长推荐上一条 /2 下一条