(玩电子) 电子技术学习与研讨
casino
当时方位:单片机教程网 >> 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口由高电平变为低电平时,阐明按键被按下,此刻立刻履行相应的动作,这便是按键检测的原理。
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet
 
 
 
 
 
 
图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;
       }
}
宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

相关文章