原创 【博客大赛】MCU之心路分享--“弹奏手“—按键(五)

2013-11-15 00:25 3930 13 21 分类: MCU/ 嵌入式 文集: MCU之心路分享

本小节目录:

              5.1,键盘的分类

              5.2,键盘消抖问题

              5.3,按键连接单片机原理图

              5,4,独立和矩阵按键的程序

  

5.1)键盘的分类

 键盘是单片机系统中常见的信息输入部件,也是人机对话中不可缺少的输入设备,同时键盘有编码键盘和非编码键盘之分。

 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值,如计算机键盘;

 非编码键盘:靠软件编程来识的键盘,如单片机上的按键,就是非编码键盘。

 

5.2)键盘消抖问题

     按键是一种机械弹性器件,在按下或者松开按键的瞬间,都会有抖动现象。例如一个胖子,突然坐在一张有弹性的椅子,会有抖动现象一样咯,嘿嘿,,,,,,比喻不是很合适,但是多少可以理解和感觉按键抖动的现象了吧!

     

1.jpg

 

           图1 按键按下电压变化图(左)和硬件消抖示意图(图)     

 

消抖方法有:硬件消抖和软件消抖。

 

1、硬件消抖:在键数较少时可采用硬件方法消抖,如图1右图所示,用RS触发器来消抖。图中两个“与非”门构成一个RS触发器,当按键未按下时,输出1;反之,输出为0。

具体过程,有兴趣的读者可以去探究吧!

 

2、软件消抖:如果按键较多,常用软件方法来消抖,即检测到有按键按下时,执行一段延时程序,具体延时时间依机械性能而定,一般延时为:5MS ~ 20MS,即按键抖动的这段时间不进行检测,等到按键稳定时再读取状态,若仍然为闭合状态电平,则有按键按下。而平时所用的单片机开发实验板,绝大多数为软件消抖即可很容易解决抖动的问题。

5.3)按键连接单片机原理图

2.jpg

 

                图 2  独立按键原理图(左)和矩阵按键原理图(右)  

     

a)独立按键原理图分析:

      4个独立按键WR,RS,SCL,SDA分别连接单片机的WR,RS,SCL,SDA口,即P3^4--P3^7口,按键公共端连接GND,

      从原理图中很容易看出,只需单片机检测按键是否有低电平,则证明那个按键是否按下。

      优缺点:程序编写较简单,但是占用I/O口多。

 

b)矩阵按键原理图分析:

      按键的行一脚共同连接,列另一脚也共同连接,然后分别连接单片机8个I/O口,从而达到用8个端口控制16个按键;

      从原理图也很容易看出,若想知道其中哪个按键按下,则要单片机检测按键的两端连接的两个I/O口电平是否都为低电平,比如,若是S2按键按下,则RXD为“0”,RS也必须为“0”,S2按键才是按下了。再例如,若TXD为“0”,SCL也为“0”,则证明S7按键按下了。同理可检测别的按键是否按下。

      

     优缺点:程序编写较复杂,但是占用I/O口少。

     关于单片机I/O口资源往往比较宝贵,当使用按键较多的时候,就必须引入矩阵按键!

 

     当然,或许对于初学者来说,矩阵按键这里并不是很好理解,当初本人也是纠结了很久,但是多去看看程序,多分析分析,看看如何检测按键的,或许会理解的更快吧!

 

5.4)独立和矩阵按键的程序  

 

独立按键程序:

       按下K1按键LED亮,按下K2按键,LED灭。

#include

#define Uint16 unsigned int

sbit  Led = P2^7;

sbit  K1 = P3^4;

sbit  K2 = P3^5;

 

void  Delayms(Uint16 Xms)

{

    Uint16 i, j;

       for(i=Xms; i>0; i--)

            for(j=121; j>0; j--);

}

void  main(void)

{

       while(1)

      {

          if(K1==0) // 检测按键,若K1为0则按键按下 

            {

                Delayms(10);  //延时10ms去抖

               if(K1==0)          // 再次检测按键

            {      Led = 0};      // Led 亮}

         if(K2==0) // 同上

           {

               Delayms(10);

               if(K2==0)

                { Led = 1; }

           }

     }

}        

说实话,像独立按键这么简单的程序若还有初学者看不懂,那直接无语了,对吧?

 

 矩阵按键程序:

 

       由于程序太长,为了更好编辑,本人已将程序上传,菜鸟可以下载看看,同时在程序下方已经写下几点程序总结以及个人感受,当然,非菜鸟就不必看了吧!    

        说明:所用开发板为:麦光电子单片机开发板      

        本系列《MCU之心路分享》博文,本人将尽自己所能,以菜鸟的身份,写下初学者最详细,最具体的入门博客,同时分享DIY的乐趣,如有误之处,欢迎拍砖,本人也很乐意接受各位大神的批评和指点,在此谢谢啦!

  

                                                                                         于2013年11月14日 夜 

 

 

 

 

 

 

 

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

644398774_263592779 2014-4-7 21:17

确实不好,但是对于初学的来说,确实最好理解的!你可以去看看状态机法的按键检测喔!

用户567054 2014-4-4 16:13

去抖还是延时啊~这个方法真不好!

用户425366 2013-11-25 21:41

学习了,期待下一篇!

DiracFatCat 2013-11-24 15:44

是的。所以如果要求实时性的话,可以使用或门产生一个外部中断信号,然后在外部中断中扫描,使用定时器中断去抖;如果不要求实时性的话,使用定时期中断扫描加去抖就行了。在主函数里面延时来去抖,按键少的时候没问题,多了就很麻烦,特别是还有需要实时处理的按键信息的时候。

644398774_263592779 2013-11-24 15:14

这确实是好办法,但是51定时器和中断少,珍贵喔!

DiracFatCat 2013-11-23 14:18

按键使用外部中断,检测抖动使用定时器中断,实时性要好很多。

644398774_263592779 2013-11-23 00:09

关于这个方式,我还不了解,欢迎赐教!

用户1616399 2013-11-21 01:23

应该去参考状态机方式 这种消抖方式并不实用
相关推荐阅读
流年一束光 2014-05-20 13:32
有时候,我也不知道我是否还能坚持下去
       退学?真的要退学么? 这个问题伴随着我整个大学,从第一天开始就一直到现在!       一面是对未来,或许说是梦想的追求,渐渐清晰地看见,并学会接受现实,走在自己选择未来的电子路...
流年一束光 2014-04-07 00:55
【博客大赛】MCU之心路分享-----前言
        如果你想要得到从未有过的东西,那就去做你从未做过的事情!!!                                                          ...
流年一束光 2014-04-07 00:46
【博客大赛】MCU之心路分享--倾听你的改变--AD/DA转换(十一)
         用勇气来改变可以改变的事情,用胸怀来接受不可改变的事情,用智慧来分辨两者的不同                                                  ...
流年一束光 2014-04-05 17:28
【博客大赛】MCU之心路分享—有种爱叫:IIC(十)
         在工科男的世界里,连IIC都能想象成浪漫的牵手,而一个对单片机充满热爱的工科男,有什么理由不去认识它,学会它,并去驾驭它啊!当然,在我知道的世界里,貌似大学老师从来都没有真正教过...
流年一束光 2014-03-20 00:34
【博客大赛】MCU之心路分享—你小小的心令我感动(九)
          如果说,学过单片机,却连单片机最小系统都没有焊接过或者搭建过!甚至连电烙铁都没有摸过,那是个多么巨大的笑话呀?          但现实不幸的是,这样的笑话,一直重演在许多...
流年一束光 2014-03-10 20:29
【博客大赛】MCU之心路分享—偷偷爱你--12864液晶(八)
       时隔3个月没有更新《MCU之心路分享》了,不知道我是否有幸,让胖螃蟹小编对我拍拍砖呢?嘿嘿…….这3个月,一直都没有离开过EDN,一直都潜伏着,这3个月中,见证,陪伴,小小地参与...
EE直播间
更多
我要评论
8
13
关闭 站长推荐上一条 /1 下一条