历史上的今天
返回首页

历史上的今天

今天是:2025年01月23日(星期四)

正在发生

2021年01月23日 | 51单片机教程(四):独立-矩阵键盘应用与设计

2021-01-23 来源:eefocus

简介:上讲介绍并应用了单片机的串口通信,并给出了实例。从这一讲开始将介绍单片机的外围电路。这讲向大家介绍单片机外接键盘电路,通过该讲,读者可以掌握单片机外接键盘的工作原理从而实现电路与程序设计。


一、原理简介

键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。我们可以通过键盘输入数据或命令来实现简单的人机通信。在设计键盘电路与程序前,我们需要了解键盘和组成键盘的按键的一些知识。


1. 按键的分类


一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。


按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。


全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。


2. 按键的输入原理


在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。因此,键信息输入是与软件结构密切相关的过程。 对于一组键或一个键盘,通过接口电路与单片机相连。单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。


3. 按键的特点与去抖


机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图1(a) 所示,抖动时间的长短与开关的机械特性有关,一般为5 ~ 10 ms。从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。( 本学习板采用软件去抖方式)。软件去抖的流程图如图1(b) 所示。

从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。


二、电路详解


电路图如图2 所示。

从图2 中可知独立式按键采用每个按键单独占用一根I/O 口线结构。当按下和释放按键时,输入到单片机I/O 端口的电平是不一样的,因此可以根据不同端口电平的变化判断是否有按键按下以及是哪一个按键按下。从图2(a) 中可以看出,按键和单片机引脚连接并加了上拉电阻,这样当没有按键按下的时候,I/O 输入的电平是高电平,当有按键按下的时候,I/O 输入的电平是低电平。


虽然独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O 口线,因此,在按键较多时,I/O 口线浪费较大。对于比较复杂的系统或按键比较多的场合,可以用到矩阵键盘,图2(b) 中所示的为4×4的矩阵式键盘,其他矩阵式键盘的设计方法类似。


4×4 的矩阵式键盘由4 根行线和4 根列线交叉构成,按键位于行列的交叉点上,这样就构成了16 个按键。其中交叉点的行列线是不连接的,当按键按下的时候,此交叉点处的行线和列线导通。图2(b) 行线通过上拉电阻接到VCC 上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线在交点导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的每条行线与4 条列线相交,交点的按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,键分析时必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。


值得注意的是本文介绍的矩阵键盘,在传统的矩阵键盘的输出端加了一个四输入与门芯片74HC21。当四路输入有一个为低电平的时候,输出为低电平。将74HC21 的输出端接到单片机的外部中断0(P32 管脚)上,这样在实时性要求较高的情况下,设P00~P03 为全低等待按键触发,当任何一个按键按下的情况下,系统都会进入中断服务程序,提高了键盘响应时间,在系统实时性要求较高的情况下非常实用。


三、程序设计


本文设计实例关键程序如下。


独立按键程序


……


#define keyio P0 ( 1)


#define key1 P0_3 ( 2)


……


keyio|=0X0F; ( 3)


if(key1==0) ( 4)


{


delay_nms(20); ( 5)


if(key1==0) ( 6)


{


while(key1==0); ( 7)


return 1; ( 8)


}


}


程序说明:


(1)定义按键管脚。


(2)定义按键连接管脚。


(3)将按键连接管脚输出高电平,从而接收输入。


(4)如果此时管脚所连接按键被按下。


(5)延时一段时间,去抖作业。


(6)如果此时按键仍然被按下,此时按键有效。


(7)等待按键抬起,死循环,如果按键一直按下则一直等待。


(8)返回键值。矩阵键盘程序


……


#define KEYIO P0 ( 1)


……


code ksp[4]={0x7F,0xBF,0xDF,0xEF}; ( 2)


unsigned char keypad_scan() ( 3)


{


char key,i; ( 4)


KEYIO=0xF0; ( 5)


if (KEYIO!=0xF0) ( 6)


{


for(i=0;i《=3;i++) ( 7


{


delaykey(10); ( 8)


KEYIO=ksp[i]; ( 9)


delaykey(10); ( 10)


if(KEYIO!=ksp[i]) ( 11)


{


delaykey(10); ( 12)


key=KEYIO; ( 13)


while(KEYIO==key); ( 14)


return(key); ( 15)


}


}


}


}


程序说明:


(1)定义矩阵键盘管脚。


(2)将扫描时用到的管脚四种输出电平状态定义成一个数组。


(3)按键扫描程序。


(4)定义两个临时变量key,i。


(5)让键盘管脚的高四位输出高电平,第四位为低电平,为扫描按键准备。


(6)如果此时管脚状态电平发生变化。


(7)将之前定义的数组中的值赋予管脚,开始逐次扫描。


(8)延时一段时间,去抖。


(9)输出扫描按键的电平。


(10)再延时一段时间。


(11)如果此时按键管脚电平依旧不是输出的默认电平,表示有键按下。


(12)延时一段时间,让电平稳定。


(13)读取当前按键管脚电平,即键值。


(14)等待按键抬起,死循环,如果按键一直按下则一直等待。


(15)返回键值。


四、调试要点与实验现象


接好硬件,通过冷启动方式将程序所生成的。hex文件下载到单片机运行后,打开串口调试助手软件,设置好波特率9600,复位单片机,然后按下板上的4×4按键中的任意一个,并注意观串口调试助手上的显示。(见图3),可以观察到在接收窗口有按键的数据显示。

图3 按键通过串口调试助手显示界面


此外,在本文所附的实验程序中,其中与串口通信中调用了发送字符函数与发送字符串函数。在没有仿真器和遇到需要显示一些提示信息的时候,可以采用串口打印的方式,这样不仅直观方便而且不增加其他成本。


五、总结


本文介绍了单片机外接键盘的工作原理并给出了实例,通过该文,我们可以知道一个完善的键盘控制程序应具备以下功能:


(1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。


(2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。


(3) 准确输出按键值(或键号),以满足按键功能要求。对于矩阵键盘而言,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。


此外,按键的扫描方式有多种,本文中所述的是程序扫描方式,另外常见的还有定时扫描方式和中断扫描方式,这些方式均可以在本学习板上实现,因此希望读者结合前几讲的知识,自行进行程序的编写与调试。下讲将讲述单片机动态驱动数码管原理与实例,敬请期待。


推荐阅读

史海拾趣

德旭电子(DEXU)公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,德旭电子开始注重品牌建设和市场拓展。公司积极参加各类行业展会和交流活动,展示自身实力和产品优势。同时,德旭电子还加大了广告宣传力度,通过线上线下相结合的方式提升品牌知名度和美誉度。

在市场拓展方面,德旭电子不仅深耕国内市场,还积极开拓国际市场。公司凭借优质的产品和专业的服务赢得了越来越多客户的信赖和支持。国际市场的拓展为德旭电子的持续发展注入了新的动力。

安森德(Ascend)公司的发展小趣事

在快速发展的过程中,安森德公司始终注重品牌建设和文化塑造。公司坚持以客户为中心的服务理念,不断提升产品质量和服务水平。同时,安森德还积极参与各类行业活动和公益事业,提升公司的社会形象和品牌价值。在内部管理方面,公司倡导创新、协作、担当的企业文化,为员工提供了一个良好的工作环境和发展平台。这些举措不仅增强了员工的归属感和凝聚力,也为公司的长远发展奠定了坚实的基础。

eLED.com Corp公司的发展小趣事

作为一家有影响力的企业,eLED.com Corp始终关注社会责任的履行。公司积极参与各类公益活动,关注教育、环保和扶贫等领域。通过捐款捐物、志愿服务等方式,eLED.com Corp为社会做出了积极的贡献。此外,公司还注重员工培训和福利待遇的提升,努力为员工创造一个良好的工作环境和发展空间。通过这些举措的实施,eLED.com Corp不仅赢得了社会的广泛赞誉和支持,还为企业的发展注入了新的动力。

Dytran Instruments Inc公司的发展小趣事

作为一家技术驱动型企业,Dytran始终将技术创新作为公司的核心竞争力。公司不断投入研发资源,推动传感器技术的升级和产业升级。在单轴和三轴IEPE加速度计、超高温充电模式传感器、高冲击传感器、电容式MEMS传感器等领域,Dytran都取得了显著的技术突破。这些新技术不仅提高了传感器的性能和精度,还拓展了其应用领域和市场空间。

同时,Dytran还注重与其他行业的合作与交流。通过与航空航天、汽车等行业的合作,Dytran将传感器技术应用于更多领域,推动了相关产业的发展。此外,公司还积极参与国际标准的制定和推广工作,为传感器技术的国际化和标准化做出了贡献。

General Instrument Optoelectronics公司的发展小趣事
用于拆卸焊接在电路板上的元件。
E-tec Interconnect Ltd公司的发展小趣事

为了满足全球客户的需求,E-tec开始在全球范围内进行布局。他们在亚洲、欧洲和北美等地设立了生产基地和研发中心,实现了全球范围内的生产和销售。同时,E-tec还注重供应链的整合和优化,与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和成本控制。

问答坊 | AI 解惑

16舵机双足机器人-----全资料奉上!

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3648721&bbs_page_no=1&bbs_id=9999 暑假学校里做机器人比赛,就是做出一个人型机器人来互相对打,要求无线控制的。 我因为去年做过这个 ...…

查看全部问答>

DIY微功耗基础无线网络

DIY微功耗基础无线网络…

查看全部问答>

直流接触器和交流接触器的区别?

应用场合不同,选择交流或直流取决于线圈,直流接触器的线圈只能通直流,交流接触器的线圈只能通交流工作。一般来说,在交流回路当中,主回路用的交流,辅助助回路一般都是从主回路上取电做控制回路,那么控制回路显然也是交流的,那么就要用交流接 ...…

查看全部问答>

PB5编写FLASH驱动

小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手…

查看全部问答>

在这里居然看到母校的技术交流贴

在这里居然看到母校的技术交流贴,热泪盈眶 老泪纵横!…

查看全部问答>

用过AT24C02的高手请指教!

#include <STM8S105C_S.h> #define uchar unsigned char #define uint unsigned int #define data_out PB_DDR|=0X04; #define data_in PB_DDR&=~0X04; #define scl_H PB_ODR|=0X02; #define scl_L PB_ODR&=~0X02; #define sda_ ...…

查看全部问答>

【求助】换了片子,烧写不成,是什么问题?急!!!

用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...…

查看全部问答>

【求助】【讨论】关于用149做交流电流0-5mA得采样电路问题

互感器输出为交流0-5mA,用149采样确定电流值!!!! 请高手指点!!!!…

查看全部问答>

请问大家IAR和CCS哪个用的人数多?

新手问一下,IAR和CCS哪个用的人数多,哪个更好用一点?你们更喜欢哪一个?…

查看全部问答>

lowlevel_init.S的system_clock_init函数放到C语言下面实现——更好处理

在uboot原来的代码里,有系统时钟的初始化函数,在board/samsung/smdkv210/lowlevel_init.S的system_clock_init函数,我大概看了一下,寄存器不一样,而且是汇编写的,所以我就改成用c语言来实现,在BL1阶段初始化一下,BL2阶段就不用重新初始化了 ...…

查看全部问答>