(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 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中我们可以看出实实电压波形在按下松手的时候都会出现一定的抖动经过实验知道这个一时间大概在510ms所在在做单片机与按键相关的系统时必须考虑消抖的方ڡ按键消抖的方法有两种一个是硬件方法   一个是软件的方法而从节约成本和尽考化硬件电路的角度出发话是采用在程序中由消抖的方法实现通常是采用延时的方法具体的作法是
检测出键闭合后执行一个延时程序产生5ms10ms的延时们沿抖动消失后再一次检测键的状态如果仍保持闭合状态电平则确认为真正有键按下当检测到按键释放后也要给5ms10ms的延时待后沿抖动消失后才能转入该键的处理程序后面会结系程序进行讲解
下面我写一个简单的程序功能为当一个键按下时让一个发光二极管发光我们先看下按键模块在实验板系原理图如图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;
       }
}
发表评论告诉好友收藏此文关闭窗口

文章评论

相关文章

ձһhƬձƵ ձƵɫwww ձƵ:ɫ