这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 单片机系统中按键的检测与应用

共7条 1/1 1 跳转至

单片机系统中按键的检测与应用

工程师
2020-09-01 20:56:38     打赏

键盘是单片机应用系统中重要的输入设备,是实现人机对话的纽带。键盘主要分编码键盘和非编码键盘两大类,其中键的开闭的识别由硬件编码器来实现的称为编码键盘,如计算机键盘。而靠软件编程来识别键的开闭的称为非编码键盘,单片机系统中常用的键盘为非编码键盘。


键盘都是由一个一个小按键构成的,按键实际上就是一个开关元件,单片机系统中常用的按键主要有自锁按键和非自锁按键,分别如图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;       }}





关键词: 单片机     按键     检测     键盘    

工程师
2020-09-01 21:09:59     打赏
2楼

按键功能,确实经常用到!


工程师
2020-09-01 21:14:17     打赏
3楼

A/D 式按键,或许更简单~


工程师
2020-09-01 21:17:36     打赏
4楼

感谢您的分享


工程师
2020-09-01 21:18:40     打赏
5楼

这是单片机入门必备的基本功!


工程师
2020-09-03 09:38:13     打赏
6楼

学到经验了


高工
2020-09-07 23:11:48     打赏
7楼

应用还是非常广泛的


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]