234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

    第10课 键盘检测与应用

    作者:huqin   来源:本站原创   点击数:x  更新时间:2013年12月30日   【字体:

     

    键盘是单片机应用系统中重要的一输入设备,是实现人机对话的一纽带 。键盘主要分编码键盘№和非编码键盘两大类,其中键的一开闭的一识别由硬件编码器来实现的一称为编码键盘,如计算︻机键盘 。而靠软件编程来识别键的一开闭的一称为非编码键盘,单片机系统中常用的一键盘为非编码键盘 。
    键盘都是由一个一个小按键构成的一,按键实际上    就是一个开关元件,单片机系统中常用的一按键主要有自锁按键№和非自锁按键,分别如图1、图2所示 。
    图1 自锁按键                  图2 非自锁按键
    非编码键盘通常又●分为独立键盘№和矩阵键盘两大类 。所谓独立键盘是指按键在与单片机相连时,每一个按键都与一个单片机单片机的一I/O口相连,如图3所示;而对于一些应用系统中若需要较多按键时,采用独立键盘的一连接方法,则比较耗费单片机的一I/O口,此时我们一般会用到矩阵键盘,如图4所示,16个按键排成4行4列,称为4X4矩阵键盘,如按独立按键法,需要16个I/O口,而按图4的一接法只需要8个I/O.
    图3 独立键盘
    图4 4X4矩阵键盘
    由于在单片机在应用系统中,更多的一会用到独立键盘,加之两者的一检测原理基本相似,所以这一节里我主要讲解独立键盘的一检测原理及程序实现的一方法 。
    1、 按键的一检测原理
    按键与单片机的一连接如图5所示,按键的一一端与地相连,另一端直接与单片机的一I/O口相连 。此时我们在程序中先给I/O口赋值高电平,然后不 断的一检测I/O口电平的一变化 。当按键没有被按下时,此I/O口的一电平一直为高;当按键被按下时,由于按键的一另一端直接与地相连,相当于低电平,此时我们从I/O口读出的一即为高电平,程序一旦检测到I/O口由高电平变为低电平时,说明按键被按下,此时马上    执行相应的一动作,这就是按键检测的一原理 。
     
     
     
     
     
     
    图5 按键与单片机连接图
    2、 按键的一抖动与消除
    由于机械触点的一弹性作用,一个按键开关在闭合时不 会马上    稳定地接通,在断开时也不 会一下子断开 。因 而在闭合及断开的一瞬间均伴随有一连串的一抖动,与单片机I/O口相接的一一端的一电压会出现相应的一变化,如图6所示 。
    图6 按键按下时电压的一变化情况
    从图6中我们可以看出,实际的一电压波形在按下松手的一时候都会出现一定的一抖动,经过实验ζ知道,这个一时间大概在5-10ms 。所在在做单片机与按键相关的一系统时必须考虑消抖的一环节 。按键消抖的一方法有两种,一个是硬件方法   一个是软件的一方法,而从节约成本№和尽量简化硬件电路的一角度出发,一般是采用在程序中加上    消抖的一方法实现,通常是采用延时的一方法 。具体的一作法是:
    检测出键闭合后执行一个延时程序,产生5ms~10ms的一延时,让前沿抖动消失后再一次检测键的一状态,如果仍保持闭合状态电平,则确认为真正有键按下 。当检测到按键释放后,也要给5ms~10ms的一延时,待后沿抖动消失后才能转入该键的一处理程序 。后面会结合到程序进行讲解 。
    下面我写一个简单的一程序,功能为:当一个键按下时,让一个发光二极管发光,我们先看下按键模块在实验ζ板上    的一原理图,如图7№和图8所示 。
    图7 发光二极管模块原理图
    图8 按键模块原理图
    例1 按键检测程序
    //功能:当按下S8键时,L1灯发光,松手后,L1灯熄灭 。相应程序如例1.
    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
     
    sbit D1=P1^0;
    sbit S1=P3^4;
     
    void main()
    {
           P3=0xff;
           while(1)
           {
                  if(S1==0)
    delay(20);//消除按下时的一抖动
    if(S1==0)
    {
                         D1=0;        
    while(!S1);//松手检测
                  delay(20);//消除松手时的一抖动
    }
                  else
                         D1=1;           
           }
    }
     
     
    例2 按键检测程序
    //功能:当每按下S8键时,数码管自动加1,当加到F时又●从零开始 。
    #include<reg52.h>
     
    #define uint unsigned int
    #define uchar unsigned char
     
    sbit duan=P2^6;
    sbit wei=P2^7;
    sbit S1=P3^4;
    uchar temp;
    uchar code table[]=
    {0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};
     
    void delay(uint z )
    {
           uint x ,y;
           for(x=z;x>0;x--)
                  for(y=110;y>0;y--);
    }
    void main()
    {
           P3=0xff;
           wei=1;
           P0=0xfe;
           wei=0;
           temp=0;
           while(1)
           {
                  if(S1==0)
                  {
                         delay(20);//消除按下时的一抖动
                         if(S1==0)//
                         {
                                temp++;
                                if(temp==16)temp=0;
                         }
                         while(!S1);//松手检测,防止temp一次多加
                         delay(20);//消除松手时的一抖动
                         while(!S1);
                  }    
               duan=1;
                  P0=table[temp];
                  duan=0;
           }
    }
    发表评论】【告诉好友】【收藏此文】【关闭窗口
    上    一篇:第9课 定时器

    文章评论

    相关文章