恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
单片机·按键
首页
资讯中心
/
单片机·按键
单片机·按键
发布时间:2026/9/1 15:11:16
文章目录1. 引言2. 按键基础概念3. 消抖3.1 抖动的产生3.2 硬件消抖3.3 软件消抖4. 键盘分类4.1 独立键盘4.2 行列键盘5. 独立键盘编程5.1 参考代码5.2 运行效果6. 矩阵键盘编程6.1 参考代码6.2 运行效果7. 总结1. 引言计算机的主要组成是运算器控制器存储器输入输出设备这一次讲一下常用的输入设备中的按键。按键组成键盘键盘是单片机应用系统中最常用的输入设备在单片机应用系统中操作人员一般都是通过键盘向单片机系统输入指令。2. 按键基础概念键盘是一组按键开关的集合按键是键盘中的一个。我们先看一下单个按键按下和弹起的状态。平时按键总是处于断开状态当按下按键是他才闭合。按下键后计算机将长生一个脉冲波。结构如图通过读入P1.1的高、低电平状态来判断按键开关是否按下。当按键未按下时开关处于断开状态向P1.1输入高电平.当按键开关按下时开关处于闭合状态向P1.1输入低电平。3. 消抖3.1 抖动的产生按键开关通常为机械式开关由于机械触点的弹性作用一个按键开关在闭合时王伟不会马上稳定的接通断开时也不会马上断开因而在闭合和断开的瞬间都会伴随着一串抖动。按下式产生的抖动为前沿抖动松开键位时产生的抖动为后沿抖动。如果对抖动不做处理会出现一次键而输入多次的问题为确保按一次键只确认一次必须消除按键抖动。消除按键抖动通常有硬件消抖和软件消抖两种方式。3.2 硬件消抖硬件消抖是通过在按键输出电路上添加一定的硬件线路来消除抖动一般采用 RS触发器或单稳态电路。下图是由两个与非门组成的RS触发器消抖电路。平时没有按键时开关倒向下方上面的与非门输入高电平下面的与非门输入低电平输出端输出高电平。当按下按键时开关倒向上方上面的与非门输入低电平下面的与非门输入高电平由于RS触发器的反馈作用使输出端迅速变为低电平而不会产生抖动波形而当按键松开时开关回到下方时也一样输出端迅速回到高电平而不会产生抖动波形。经过下图中的RS触发器消抖后输出端的信号就变为标准的矩形波。3.3 软件消抖软件消抖是利用延时程序消除抖动。由于抖动时间都比较短因此可以这样处理:当检测到有键按下时执行一段延时程序跳过抖动再去检测通过两次检测来识别一次按键这样就可以消除前沿抖动的影响。对于后沿抖动由于在接收一个键位后一般都要经过一定时间再去检测有无按键这样就自然跳过后沿抖动时间而消除后沿抖动了。如下图4. 键盘分类键盘可分为两类独立键盘和行列键盘。4.1 独立键盘每个按键接一根I/O接口线通过检测I/O接口线的电平状态就可以很容易地判断出哪个按键被按下了。独立式键盘的电路配置灵活软件简单。但每个按键要占用一根I/O接口线I/O接口线浪费很大。故在按键数量不多时采用这种形式。4.2 行列键盘行列键盘往往又叫矩阵键盘。用两组I/O接口线排列成行、列结构一组设定为输入另一组设定为 输出输入线要带上拉电阻键位设置在行、列线的交点上按键的一端接行线另一端接列线。由4根行线和4根列线组成44矩阵键盘行线为输入列线为输出可管理4416个键。矩阵键盘占用的I/O接口线数目少4*4矩阵键盘只用了8根I/O接口线比独立式键盘少了一半的I/O接口线而且键位越多越明显。键位的识别首先检测按键是否按下。其次识别哪一个键被按下。① 检测键盘上是否有按键被按下的处理方法将列线送入全扫描字读入行线的状态来判别。以上图为例其具体过程P2口高4位都输出低电平然后读连接行线的P2口低4位P2内部自带上拉电阻如果读入的内容都是高电平说明没有键被按下则不用进行下一步如果读入的内容不全为1则说明有键被按下再进行第2步识别哪一个键被按下。②识别键盘中哪一个键被按下的处理方式将列线逐列置成低电平检查行输入状态称为列扫描。其具体过程如下从P2.4开始依次输出“0”置对应的列线为低电平其他列为高电平然后从P2口低4位读入行线状态。在扫描某列时如果读入的行线全为“1”则说明按下的键不在此列;如果读入的行不全为“1”则说明按下的键必在此列。而且是该列与“0”电平行线交点上的那个键。5. 独立键盘编程例在P2口低4位增加了发光二级管LED-RED,当按键按下时相应的发光二极管亮1s。5.1 参考代码#includereg51.h#defineuintunsignedintsbit K0P1^0;sbit K1P1^1;sbit K2P1^2;sbit K3P1^3;sbit D0P2^0;sbit D1P2^1;sbit D2P2^2;sbit D3P2^3;voiddelay(uint k){uint i,j;for(i0;ik;i)for(j0;j125;j);}voidmain(void){while(1){if(K00){delay(10);if(K00){D00;delay(1000);D01;}}if(K10){delay(10);if(K10){D10;delay(1000);D11;}}if(K20){delay(10);if(K20){D20;delay(1000);D21;}}if(K30){delay(10);if(K30){D30;delay(1000);D31;}}}}5.2 运行效果6. 矩阵键盘编程例通过4*4的矩阵键盘输出十六进制1~9、A ~ F6.1 参考代码#includereg51.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedintvoiddelay(uint);voiddisplay(void);ucharcheckkey();ucharkeyscan(void);uchar disbuffer[8]{0,1,2,3,4,5,6,7};voidmain(void){uchar key;while(1){keykeyscan();if(key!0xff){disbuffer[0]disbuffer[1];disbuffer[1]disbuffer[2];disbuffer[2]disbuffer[3];disbuffer[3]disbuffer[4];disbuffer[4]disbuffer[5];disbuffer[5]disbuffer[6];disbuffer[6]disbuffer[7];disbuffer[7]key;}display();}}voiddelay(uint i){uint j;for(j0;ji;j){;}}voiddisplay(void){uchar codevalue[16]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar chocode[8]{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar i,p,temp;for(i0;i8;i){tempchocode[i];P2temp;pdisbuffer[i];tempcodevalue[p];P0temp;delay(20);}}ucharcheckkey(){uchar i;P30x0f;iP3;ii|0xf0;if(i0xff)return(0xff);elsereturn(0);}ucharkeyscan(){uchar scancode;uchar codevalue;uchar m;uchar k;uchar i,j;if(checkkey()0xff)return(0xff);else{delay(20);if(checkkey()0xff)return(0xff);else{scancode0xef;/**1110 1111**/for(i0;i4;i){k0x01;//0000 0001P3scancode;/**1101 1101**/m0x00;for(j0;j4;j){if((P3k)0)/**0000 1101**///0000 0010{codevaluemi;while(checkkey()!0xff);}else{kk1;mm4;}}scancodescancode1;/**1101 1110**/scancode;/**1101 1111**/}}return(codevalue);}}6.2 运行效果7. 总结通过本文的学习读者可以掌握按键输入的基本原理、消抖方法以及独立键盘和矩阵键盘的编程思路为后续设计更复杂的单片机人机交互系统打下基础。