news 2026/9/1 15:11:10

单片机·按键

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单片机·按键

文章目录

  • 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. 按键基础概念

键盘是一组按键开关的集合,按键是键盘中的一个。我们先看一下单个按键按下和弹起的状态。平时按键总是处于断开状态,当按下按键是他才闭合。按下键后计算机将长生一个脉冲波。结构如图:

  1. 通过读入P1.1的高、低电平状态来判断按键开关是否按下。
  2. 当按键未按下时,开关处于断开状态,向P1.1输入高电平.
  3. 当按键开关按下时,开关处于闭合状态,向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矩阵键盘,行线为输入,列线为输出,可管理44=16个键。

矩阵键盘占用的I/O接口线数目少,4*4矩阵键盘只用了8根I/O接口线,比独立式键盘少了一半的I/O接口线,而且键位越多越明显。


键位的识别

  1. 首先检测按键是否按下。
  2. 其次识别哪一个键被按下。

① 检测键盘上是否有按键被按下的处理方法:将列线送入全扫描字,读入行线的状态来判别。以上图为例,其具体过程:P2口高4位都输出低电平,然后读连接行线的P2口低4位(P2内部自带上拉电阻),如果读入的内容都是高电平,说明没有键被按下,则不用进行下一步;如果读入的内容不全为1,则说明有键被按下,再进行第2步,识别哪一个键被按下。
②识别键盘中哪一个键被按下的处理方式:将列线逐列置成低电平,检查行输入状态,称为列扫描。其具体过程如下:从P2.4开始,依次输出“0”,置对应的列线为低电平,其他列为高电平,然后从P2口低4位读入行线状态。在扫描某列时,如果读入的行线全为“1”,则说明按下的键不在此列;如果读入的行不全为“1”,则说明按下的键必在此列。而且是该列与“0”电平行线交点上的那个键

5. 独立键盘编程

例:在P2口低4位增加了发光二级管(LED-RED),当按键按下时,相应的发光二极管亮1s。

5.1 参考代码

#include<reg51.h>#defineuintunsignedintsbit K0=P1^0;sbit K1=P1^1;sbit K2=P1^2;sbit K3=P1^3;sbit D0=P2^0;sbit D1=P2^1;sbit D2=P2^2;sbit D3=P2^3;voiddelay(uint k){uint i,j;for(i=0;i<k;i++)for(j=0;j<125;j++);}voidmain(void){while(1){if(K0==0){delay(10);if(K0==0){D0=0;delay(1000);D0=1;}}if(K1==0){delay(10);if(K1==0){D1=0;delay(1000);D1=1;}}if(K2==0){delay(10);if(K2==0){D2=0;delay(1000);D2=1;}}if(K3==0){delay(10);if(K3==0){D3=0;delay(1000);D3=1;}}}}

5.2 运行效果

6. 矩阵键盘编程

例:通过4*4的矩阵键盘,输出十六进制1~9、A ~ F

6.1 参考代码

#include<reg51.h>#include<absacc.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){key=keyscan();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(j=0;j<i;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(i=0;i<8;i++){temp=chocode[i];P2=temp;p=disbuffer[i];temp=codevalue[p];P0=temp;delay(20);}}ucharcheckkey(){uchar i;P3=0x0f;i=P3;i=i|0xf0;if(i==0xff)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{scancode=0xef;/**1110 1111**/for(i=0;i<4;i++){k=0x01;//0000 0001P3=scancode;/**1101 1101**/m=0x00;for(j=0;j<4;j++){if((P3&k)==0)/**0000 1101**///0000 0010{codevalue=m+i;while(checkkey()!=0xff);}else{k=k<<1;m=m+4;}}scancode=scancode<<1;/**1101 1110**/scancode++;/**1101 1111**/}}return(codevalue);}}

6.2 运行效果

7. 总结

通过本文的学习,读者可以掌握按键输入的基本原理、消抖方法以及独立键盘和矩阵键盘的编程思路,为后续设计更复杂的单片机人机交互系统打下基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 15:02:03

PolarDB-X 关系型数据库支持向量检索:一体化方案选型指南

在 AI 应用全面落地的今天&#xff0c;越来越多企业希望在关系型数据库中直接支持向量检索能力&#xff0c;从而避免引入独立向量数据库带来的额外运维成本和数据同步复杂度。阿里云瑶池数据库旗下的 PolarDB-X 作为分布式关系型数据库&#xff0c;内置了高性能向量引擎&#x…

作者头像 李华
网站建设 2026/9/1 14:58:14

【TDengine】TDengine 的测试框架是如何组织的?如何编写单元测试?

TDengine 3.4.x 测试框架深度解析:从 CDN 日志分析模块到高质量单元测试实践 引言:质量是高性能系统的基石 用户问题原文:“TDengine 的测试框架是如何组织的?如何编写单元测试?” 对于一位拥有 8 年大数据生态(Spring/Flink/ClickHouse/Hudi/Kafka/Parquet)开发经验的…

作者头像 李华
网站建设 2026/9/1 14:56:13

从奇安信面试复盘:安全开发工程师的路径遍历与代码审计实战

1. 想清楚再投简历&#xff1a;安全开发工程师到底是干什么的 2020年那会儿&#xff0c;我陆续面了几家做安全产品的公司&#xff0c;奇安信是其中一家。当时“安全开发工程师”这个岗位在招聘网站上的名字五花八门&#xff0c;有的叫安全研发&#xff0c;有的叫安全工具开发&a…

作者头像 李华
网站建设 2026/9/1 14:54:05

MKVToolNix 无损封装教程:快速合并视频与音频轨道

1. 先搞清楚 MKVToolNix 到底能帮你解决什么实际问题 如果你手头有独立的视频文件&#xff08;比如 .mp4, .avi&#xff09;和独立的音频文件&#xff08;比如 .mp3, .aac, .flac&#xff09;&#xff0c;想把它们“组装”成一个完整的视频&#xff0c;或者想给一个无声视频配上…

作者头像 李华
网站建设 2026/9/1 14:51:03

yuzu Switch 模拟器使用教程:从安装密钥到跑通第一局

yuzu Switch 模拟器使用教程&#xff1a;从安装密钥到跑通第一局 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu 是一个开源的任天堂 Switch 模拟器&#xff0c;用 C 编写&#xff0c;目前官方维护 Windows、…

作者头像 李华