第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘
文章目录
- 一、按键原理
- 二、独立键盘&矩阵键盘
- 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 熵权法是一种基于信息熵概念的权重确定方法,用于多指标决策分析中。信息熵是度量信息量的不确定性或混乱程度的指标,在熵权法中,它用来反映某个指标在评价过程中的分散程度,进而确定该指标的权重。指标的分散程度越高…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

