第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘
文章目录
- 一、按键原理
- 二、独立键盘&矩阵键盘
- 2.1 独立按键
- 2.2 矩阵键盘
- 2.2.1 列扫描
- 2.2.2 行扫描
- 2.2.3 代码实现(行扫描实现)
- 三、矩阵键盘注意事项
- 3.1 为什么要设置C1=C2=C3=C4=1
- 3.2 按键消抖
一、按键原理

原理很简单,当我们没有按下SW2时,由于上拉电阻得作用,使得输入引脚得信号为高电平,当按下按键后,引脚直接接地,输入单片机引脚的信号就为低电平。
二、独立键盘&矩阵键盘

在比赛的板子上,独立键盘和矩阵键盘是合在一起的,通过跳线帽来选择是独立按键还是矩阵键盘(图中已经框起)。上图所示的是矩阵键盘,将跳线帽拔了换到另一边就是独立按键了。
2.1 独立按键

独立按键一段接着GND,说明只要按下按键引脚就输入低电平。这时候我们只需要读取按键所连接的IO口状态就可以判断按键是否被按下。
2.2 矩阵键盘
矩阵键盘中每个按键两端都接着单片机IO口,如果我们要使用某个按键就先设置按键一段IO为低电平,然后读取另一端IO口电平状态。矩阵键盘的原理就是键盘扫描,按照扫描的方式可以分为列扫描和行扫描
2.2.1 列扫描
以下图为例,设置第二列的按键的一端为低电平(P42=0;),然后读取另一端的按键电平状态,如果读取到低电平就说明哪个按键被按下。例如读取P30口,如果P30==0,那么S11被按下。
2.2.2 行扫描
类似的,设置第一行的按键的一端为低电平(P30=0;),然后读取另一端的按键电平状态,如果读取到低电平就说明哪个按键被按下。例如读取P42口,如果P42==0,那么S11被按下。
2.2.3 代码实现(行扫描实现)
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;sbit C4=P3^4;
sbit C3=P3^5;
sbit C2=P4^2;
sbit C1=P4^4;void delayForKeyboard() //@12.000MHz
{unsigned char i, j;i = 234;j = 115;do{while (--j);} while (--i);
}void keyBoard(){R1=0;R2=R3=R4=1; // 设置第一行按键一段为低电平,其他行(hang)为高电平C1=C2=C3=C4=1; // 将按键另一端设置为高电平(上拉)if(C1==0){ // 读取按键状态delayForKeyboard(); // 延时20ms,按键消抖if(C1==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C2==0){delayForKeyboard();if(C2==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C3==0){delayForKeyboard();if(C3==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C4==0){delayForKeyboard();if(C4==0){//...... // 在这里编写按下按键你想要完成的任务}}R2=0;R1=R3=R4=1; // 设置第二行按键一段为低电平,其他行(hang)为高电平C1=C2=C3=C4=1;if(C1==0){delayForKeyboard();if(C1==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C2==0){delayForKeyboard();if(C2==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C3==0){delayForKeyboard();if(C3==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C4==0){delayForKeyboard();if(C4==0){//...... // 在这里编写按下按键你想要完成的任务}}R3=0;R1=R2=R4=1; // 设置第三行按键一段为低电平,其他行(hang)为高电平C1=C2=C3=C4=1;if(C1==0){delayForKeyboard();if(C1==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C2==0){delayForKeyboard();if(C2==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C3==0){delayForKeyboard();if(C3==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C4==0){delayForKeyboard();if(C4==0){//...... // 在这里编写按下按键你想要完成的任务}}R4=0;R1=R3=R3=1; // 设置第四行按键一段为低电平,其他行(hang)为高电平C1=C2=C3=C4=1;if(C1==0){delayForKeyboard();if(C1==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C2==0){delayForKeyboard();if(C2==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C3==0){delayForKeyboard();if(C3==0){//...... // 在这里编写按下按键你想要完成的任务}}else if(C4==0){delayForKeyboard();if(C4==0){//...... // 在这里编写按下按键你想要完成的任务}}
}
三、矩阵键盘注意事项
3.1 为什么要设置C1=C2=C3=C4=1
为什么要设置C1=C2=C3=C4=1,原因在于51系列单片机的I/O端口设计为双向的,当没有指明IO的状态时,我们不知道IO口是处于高电平还是低电平,处于一种不稳定的状态,举个例子,如果不指定IO为高电平,那么这个时候由于之前的程序设置或IO的状态不确定导致按键还没被按下IO就为低电平,这时候我们读取到的按键状态就是不正确的,所以需要我们指定它默认为高电平,然后才能通过读取IO判断按键是否按下。
3.2 按键消抖
按键抖动是由于按键的机械特性引起的,解决办法可以分为硬件消抖和软件消抖。
这个问题有很多人已经总结了,我就不再赘述。
【单片机】按键消抖及原理(硬件和软件方法详解)
相关文章:
第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘
文章目录 一、按键原理二、独立键盘&矩阵键盘2.1 独立按键2.2 矩阵键盘2.2.1 列扫描2.2.2 行扫描2.2.3 代码实现(行扫描实现) 三、矩阵键盘注意事项3.1 为什么要设置C1C2C3C413.2 按键消抖 一、按键原理 原理很简单,当我们没有按下SW2时,由于上拉电阻…...
HCIA—— 16每日一讲:HTTP和HTTPS、无状态和cookie、持久连接和管线化、(初稿丢了,这是新稿,请宽恕我)
学习目标: HTTP和HTTPS、无状态和cookie、持久连接和管线化、HTTP的报文、URI和URL(初稿丢了,这是新稿,请宽恕我😶🌫️) 学习内容: HTTP无状态和cookieHTTPS持久连接和管线化 目…...
使用JavaScript实现一个复杂功能:日期范围选择器
日期范围选择器是一个常见的Web应用功能,它允许用户选择一个日期范围。在本篇文章中,我们将使用JavaScript来实现这个功能。 一、实现思路 创建一个开始日期输入框和一个结束日期输入框。 添加事件监听器,监听开始日期输入框和结束日期输入…...
[C#]winform部署openvino调用padleocr模型
【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR 【算法介绍】 OpenVINO和PaddleOCR都是用于计算机视觉应用的工具,但它们有不同的特点和用途。OpenVINO是一个由Intel开发的开源工具套件,主要用于加速深度学习推理,而PaddleOC…...
【docker-compose】【nginx】内网环境https配置
目录 1、openssl生成自签名证书和私钥2、nginx.conf配置ssl3、docker-compose挂载 1、openssl生成自签名证书和私钥 在部署服务器上,新建cert目录,执行以下指令,然后生成.crt和.key文件 openssl req -newkey rsa:2048 -nodes -keyout rsa_pri…...
大语言模型无代码构建知识图谱概述
2023年3月15日,ChatGPT4.0的横空出世,将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现,业界一度出现了不再需要发展知识图谱相关技术的观点,知识图谱相关概念严重受挫。无可置…...
链表回文结构
链表回文结构 编写一个函数,检查输入的链表是否是回文的。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 链表的回文结构,应该先找到中间节…...
MyBatis框架基础到进阶
1、为什么要学习MyBatis 如果没有MyBatis框架,我们依靠JDBC和连接池已经能够很好的和数据库进行交互了,而学习MyBatis框架最核心的原因是为了减少SQL语句对代码的侵入性。 因为在过往不管是使用连接池还是JDBC Templete,所有的SQL语句都写在代…...
【答案】2023年国赛信息安全管理与评估正式赛答案-模块1任务一
1.根据网络拓扑图所示,按照IP 地址规划表,对防火墙的名称、各接口IP 地址进行配置。共8 分,每错1 处(行)扣1 分,扣完为止。地址、安全域、接口(状态为UP)、名称都正确。 2.根据网络…...
【REMB 】翻译:草案remb-03
REMB REMB消息 以及 绝对时间戳选项 在带宽估计中的使用 :an absolute-value timestamp option for use in bandwidth estimatoin. 接收方带宽估计的RTCP消息 REMB 这位大神翻译的更好。 RTCP message for Receiver Estimated Maximum Bitrate draft-alvestrand-rmcat-remb-03…...
力扣(leetcode)第830题较大分组的位置(Python)
830.较大分组的位置 题目链接:830.较大分组的位置 在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。 例如,在字符串 s “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的…...
【导航】繁星学习随想录
导航:繁星学习随想录 一、编程启示录 01 数据结构漫谈 序号博文名称/链接01扁扁笨算法-AVL树的插入与删除02扁扁笨算法-B树的插入与删除 02 概念小扫盲 序号博文名称/链接01简单理解决策树_如何理解决策树的生长过程-CSDN博客02白盒测试方法与黑盒测试方法简析…...
Oracle 隐式数据类型转换
目录 Oracle类型转换规则: 看如下实验: 1、创建一张表,字段id的类型为number,id字段创建索引,插入一条测试数据 2、我们做如下查询,id的值设置为字符型的1 3、查看执行计划: Oracle类型转换…...
压缩编码之不同缩放参数对重建图像质量的影响的python实现——JPEG变换编码不同压缩率的模拟
原理 JPEG(Joint Photographic Experts Group)是一种常用的图像压缩标准,它通过采用离散余弦变换(DCT)和量化来实现图像的压缩。 离散余弦变换(DCT): JPEG首先将图像分割成8x8的块…...
大数据导论(2)---大数据与云计算、物联网、人工智能
文章目录 1. 云计算1.1 云计算概念1.2 云计算的服务模式和类型1.3 云计算的数据中心与应用 2. 物联网2.1 物联网的概念和关键技术2.2 物联网的应用和产业2.3 大数据与云计算、物联网的关系 1. 云计算 1.1 云计算概念 1. 首先从商业角度给云计算下一个定义:通过网络…...
有序矩阵中第 K 小的元素
题目链接 有序矩阵中第 K 小的元素 题目描述 注意点 每行和每列元素均按升序排序找到一个内存复杂度优于 O(n) 的解决方案 解答思路 使用二分查找,思路为: (1)因为左上角的元素值更小,右下角的元素值更大…...
Nginx详细介绍(并从技术层面深度剖析)
nginx介绍 1.nginx 介绍2.nginx的优势3.Nginx VS Apache3.1.内核、语言、诞生时间比较3.2.功能比较3.3.Nginx 相对 apache 的优点 4.Nginx为什么有这么多的优势?4.1.IO多路复用(I/O multiplexing【多并发】)4.2.nginx的驱动模型介绍4.3.nginx…...
单元测试基本概念
单元测试一般是开发来做的,但是因为业务需要也曾涉及过单元测试。目前就单元测试的基础概念做下总结。 一、 单元测试定义: 单元测试是软件开发中的一种测试方法,用于验证程序中的最小可测单元——即代码中的单个函数、方法或模块。单元测试…...
ECTouch 电商微信小程序 SQL注入漏洞复现(CVE-2023-39560)
0x01 产品简介 ECTouch是一款开源的电商系统,为中小企业提供最佳的新零售解决方案 0x02 漏洞概述 ECTouch 电商系统 /ectouch-main/include/apps/default/helpers/insert.php 文件中第285行的 insert_bought_notes 函数中,传入的 $arr[id] 参数未进行验证和过滤,导致未经…...
MCM备赛笔记——熵权法
Key Concept 熵权法是一种基于信息熵概念的权重确定方法,用于多指标决策分析中。信息熵是度量信息量的不确定性或混乱程度的指标,在熵权法中,它用来反映某个指标在评价过程中的分散程度,进而确定该指标的权重。指标的分散程度越高…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

