<meta name="keywords" content="必胜时时彩开户,keywords" /> 第10课 键盘检测与应用 联系我们

第10课 键盘检测与应用

 

键盘是单片机应用系统中主要的输入装备,是完成人机对话的纽带。键盘主要分编码键盘和非编码键盘两年夜类,其中键的开闭的识别由硬件编码器来完成的称为编码键盘,如盘算机键盘。而靠软件编程来识别键的开闭的称为非编码键盘,单片机系统中经常应用的键盘为非编码键盘。
键盘都是由一个一个小按键组成的,按键现实上就是一个开关元件,单片机系统中经常应用的按键主要有自锁按键和非自锁按键,划分如图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;
       }
}