历史上的今天
返回首页

历史上的今天

今天是:2025年12月08日(星期一)

正在发生

2022年12月08日 | 单片机 键盘检测与应用

2022-12-08 来源:zhihu

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

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

#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


#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;

       }

}


推荐阅读

史海拾趣

Discera公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Discera公司始终保持着对技术创新的追求。他们不断投入研发资源,推动产品的升级和换代。同时,Discera还积极探索新的应用领域和市场机会,为公司的未来发展描绘出更加广阔的蓝图。

以上五个故事概要基于Discera公司的发展历程和公开信息构建,旨在展示公司在电子行业中的成长和进步。请注意,这些故事并非真实事件,仅供参考。

B&F Fastener Supply公司的发展小趣事

凭借优质的产品和服务,B&F Fastener Supply公司逐渐赢得了大型电子厂商的青睐。多家知名电子企业选择与B&F建立长期合作关系,将其作为紧固件和电子元器件的主要供应商。这不仅为B&F带来了稳定的订单和收入来源,还进一步提升了公司在电子行业的地位和影响力。

Grand Halo Technology Co Ltd公司的发展小趣事

随着电子产品的日益小型化和复杂化,对紧固件的要求也越来越高。B&F Fastener Supply公司紧跟行业趋势,投入大量资源进行技术创新。公司成功研发出一系列适用于微型电子设备的紧固件产品,不仅满足了市场的迫切需求,还凭借出色的性能和稳定的品质赢得了客户的广泛认可。

Davico Industrial Ltd公司的发展小趣事

随着电子产品的日益小型化和复杂化,对紧固件的要求也越来越高。B&F Fastener Supply公司紧跟行业趋势,投入大量资源进行技术创新。公司成功研发出一系列适用于微型电子设备的紧固件产品,不仅满足了市场的迫切需求,还凭借出色的性能和稳定的品质赢得了客户的广泛认可。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

随着技术实力的不断提升,银河微电开始积极拓展市场。公司深入分析市场需求,针对不同行业和领域的特点,推出了定制化的产品解决方案。同时,银河微电还加大了营销力度,通过参加行业展会、举办技术研讨会等方式,与潜在客户建立联系,推动产品销售。在市场的不断拓展中,银河微电实现了跨越式发展,市场份额逐年提升。

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

问答坊 | AI 解惑

创建一个NIOS环境的视频教程

视频内容为如何创建一个NIOS环境的视频教程,入门级的,很不错…

查看全部问答>

1.4亿IC卡安全有隐患:掌握技术可修改钱数

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑   非接触式IC卡核心技术被破解 涉及高校公交及其他公共领域   日前,工业和信息部发布了《关于做好应对部分IC卡出现严重安全漏洞工作的通知》,要求各地各机关和部门开展对IC卡使用情 ...…

查看全部问答>

linux 内核 模块索引图

分享一下,因为不好引用,所以直接放上链接: http://www.linuxdriver.co.il/kernel_map http://cs.jhu.edu/~razvanm/fs-expedition/tux3.html…

查看全部问答>

有人做过单片机的液体流量计么?

老师就给了这么一题目,我们打算用单片机做,不知道谁有这方面或这类的资料,或者指点一二,谢谢了啊…

查看全部问答>

请教各位关于gui的问题!

我刚刚实习,做嵌入式,想彻底学习一个gui系统的源码,哪位前辈指点下: 1.学习哪个开源gui的代码? 2.怎么样最快的入手,进步? 感谢~…

查看全部问答>

wince linux xp PPP连接问题

要做一个Wince PPP方式接入Linux主机的通信,要求Wince 通过串口直接与Linux主机相连,通过PPP方式连接,网上有关于这个连接的资料,但是按照上面的配置无法实现PPP通信; 目前做过: Linux - Linux PPP 通信实验,已经OK;      ...…

查看全部问答>

TCPMP 0.72RC1用VS2005编译出错

使用VS2005编译TCPMP 0.72RC1出错。 安装了CE6.0的SDK. 设置如下: Properties->C/C++->Advanced->Compile For Architecture->ARM4(/QRarch4) Properties->Linker->Advanced->Targer Machine->MachineTHUMB 首先编译的的common,可是提示出错: ...…

查看全部问答>

本人有6410开发板刚刚上市,宇宙最低价1300元,联系方式QQ:767800652

本人有6410开发板刚刚上市,宇宙最低价1300元,联系方式QQ:767800652 QQ: 767800652 手机:15914387571 Email:LongFei_Y@163.com 地址:广州科学城香山路17号B栋6楼 idea6410是一款高端ARM11处理器开发板,专为消费类电子、工业控制、车载导 ...…

查看全部问答>

UCGUI能否开发GIS系统,可以的话怎么开发??

UCGUI能否开发GIS系统,可以的话怎么开发??…

查看全部问答>

谁知道为什么AVR要用熔丝位和高压编程器?

这样有什么意义呢?高压编程究竟是什么原理呢?…

查看全部问答>