蓝桥杯篇---IAP15F2K61S2矩阵键盘


文章目录

  • 前言
  • 简介
  • 矩阵键盘的工作原理
    • 1.行扫描
    • 2.检测列状态
    • 3.按键识别
  • 硬件连接
    • 1.行线
    • 2.列线
  • 矩阵键盘使用步骤
    • 1.初始化IO口
    • 2.扫描键盘
    • 3.消抖处理
    • 4.按键识别
  • 示例代码:4x4矩阵键盘扫描
  • 示例代码:优化后的矩阵键盘扫描
  • 注意事项
    • 1.消抖处理
    • 2.扫描频率
    • 3.IO口配置
    • 4.按键映射
  • 总结


前言

本文仅仅简单介绍了IAP15F2K61S2矩阵键盘的使用以及示例代码。


简介

矩阵键盘是一种常见的输入设备,通过将按键排列成矩阵形式(如4x4、3x3等),可以减少IO口的使用。IAP15F2K61S2 是一款基于8051内核的单片机,可以通过扫描矩阵键盘的行和列来检测按键的按下状态。

矩阵键盘的工作原理

1.行扫描

行扫描:将行线设置为输出,列线设置为输入

2.检测列状态

检测列状态:逐行输出低电平,检测列线的状态。

3.按键识别

按键识别:根据行和列的状态确定按下的按键。

硬件连接

1.行线

行线:连接到单片机的输出引脚(如P1.0-P1.3)。

2.列线

列线:连接到单片机的输入引脚(如P1.4-P1.7)。

矩阵键盘使用步骤

1.初始化IO口

初始化IO口:设置行线为输出,列线为输入

2.扫描键盘

扫描键盘:逐行输出低电平,检测列线的状态。

3.消抖处理

消抖处理:检测到按键按下后,延时消抖

4.按键识别

按键识别:根据行和列的状态确定按下的按键。

示例代码:4x4矩阵键盘扫描

以下代码展示了如何在 IAP15F2K61S2 上实现4x4矩阵键盘的扫描,并将按键值显示在数码管上。

#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit ROW1 = P1^0;  // 行线
sbit ROW2 = P1^1;
sbit ROW3 = P1^2;
sbit ROW4 = P1^3;sbit COL1 = P1^4;  // 列线
sbit COL2 = P1^5;
sbit COL3 = P1^6;
sbit COL4 = P1^7;uchar code KEY_MAP[4][4] = {  // 按键映射表{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'*', '0', '#', 'D'}
};void delay_ms(uint ms) {uint i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);
}uchar Key_Scan() {uchar row, col;ROW1 = 0; ROW2 = 1; ROW3 = 1; ROW4 = 1;  // 扫描第一行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[0][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[0][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[0][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[0][3]; }ROW1 = 1; ROW2 = 0; ROW3 = 1; ROW4 = 1;  // 扫描第二行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[1][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[1][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[1][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[1][3]; }ROW1 = 1; ROW2 = 1; ROW3 = 0; ROW4 = 1;  // 扫描第三行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[2][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[2][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[2][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[2][3]; }ROW1 = 1; ROW2 = 1; ROW3 = 1; ROW4 = 0;  // 扫描第四行if (!COL1) { delay_ms(10); if (!COL1) return KEY_MAP[3][0]; }if (!COL2) { delay_ms(10); if (!COL2) return KEY_MAP[3][1]; }if (!COL3) { delay_ms(10); if (!COL3) return KEY_MAP[3][2]; }if (!COL4) { delay_ms(10); if (!COL4) return KEY_MAP[3][3]; }return 0;  // 无按键按下
}void main() {uchar key;while (1) {key = Key_Scan();  // 扫描键盘if (key) {P2 = key;  // 将按键值输出到P2口(假设连接数码管)delay_ms(200);  // 延时消抖}}
}
代码说明
KEY_MAP:
定义4x4矩阵键盘的按键映射表。delay_ms:
毫秒级延时函数,用于消抖。Key_Scan:
扫描矩阵键盘,返回按下的按键值。
逐行输出低电平,检测列线的状态。
如果检测到按键按下,延时消抖后返回按键值。main:
循环扫描键盘,将按键值输出到P2口(假设连接数码管)。

示例代码:优化后的矩阵键盘扫描

以下代码展示了如何通过优化扫描方式减少代码量。

#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit ROW1 = P1^0;  // 行线
sbit ROW2 = P1^1;
sbit ROW3 = P1^2;
sbit ROW4 = P1^3;sbit COL1 = P1^4;  // 列线
sbit COL2 = P1^5;
sbit COL3 = P1^6;
sbit COL4 = P1^7;uchar code KEY_MAP[4][4] = {  // 按键映射表{'1', '2', '3', 'A'},{'4', '5', '6', 'B'},{'7', '8', '9', 'C'},{'*', '0', '#', 'D'}
};void delay_ms(uint ms) {uint i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);
}uchar Key_Scan() {uchar row, col;uchar row_code = 0xFE;  // 行扫描初值(1111 1110)for (row = 0; row < 4; row++) {P1 = row_code;  // 输出行扫描信号if (!COL1) return KEY_MAP[row][0];if (!COL2) return KEY_MAP[row][1];if (!COL3) return KEY_MAP[row][2];if (!COL4) return KEY_MAP[row][3];row_code = (row_code << 1) | 0x01;  // 左移一位,准备扫描下一行}return 0;  // 无按键按下
}void main() {uchar key;while (1) {key = Key_Scan();  // 扫描键盘if (key) {P2 = key;  // 将按键值输出到P2口(假设连接数码管)delay_ms(200);  // 延时消抖}}
}
代码说明
Key_Scan:
使用循环和位操作优化扫描过程。
逐行输出低电平,检测列线的状态。
如果检测到按键按下,返回按键值。main:
循环扫描键盘,将按键值输出到P2口。

注意事项

1.消抖处理

消抖处理:按键按下时可能会产生抖动,需通过延时或硬件消抖处理。

2.扫描频率

扫描频率:扫描频率不宜过高,否则可能导致检测不准确

3.IO口配置

IO口配置:确保行线和列线的IO口配置正确。

4.按键映射

按键映射:根据实际硬件连接调整按键映射表

通过以上代码和说明,你可以在 IAP15F2K61S2 上实现矩阵键盘的扫描功能,并将按键值用于控制其他外设(如数码管、LED等)。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了IAP15F2K61S2矩阵键盘的使用以及示例代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑲】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase19 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月19日 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-019测试用例 用例ID测试场景验证要点参考条款预期结果TC…

Vue 3 30天精进之旅:Day 29 - 项目实战

在学习了近一个月的Vue 3知识后&#xff0c;今天是我们学习旅程的第29天。在这一天&#xff0c;我们将专注于实践&#xff0c;通过一个小型项目来巩固之前的学习成果&#xff0c;并为之后的展示做好准备。 一、项目目标 我们将构建一个简单的个人博客应用&#xff0c;具备以下…

Windows Docker运行Implicit-SVSDF-Planner

Windows Docker运行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 设置环境 我将项目git clone在D:/Github目录中。 下载ubuntu20.04 noetic镜像 docker pull osrf/ros:noetic-desktop-full-focal 启动容器&#xff0c;挂载主机的D:/Github文…

PHP 安全与加密:守护 Web 应用的基石

PHP 学习资料 PHP 学习资料 PHP 学习资料 在当今数字化时代&#xff0c;Web 应用无处不在&#xff0c;而 PHP 作为一种广泛使用的服务器端脚本语言&#xff0c;承载着无数网站和应用的核心逻辑。然而&#xff0c;随着网络攻击手段日益复杂&#xff0c;PHP 应用面临着诸多安全…

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类&#xff0c;这就是QPdfWriter类。 &#xff08;1&#xff09;PDF文件生成 支持创建新的PDF文件或覆盖已有文件&#xff0c;通过构造函数直接绑定文件路径或QFile对象&#xff1b; 默认生成矢量图形PDF&#…

Golang GORM系列:GORM无缝集成web框架

高效的数据管理是每个成功的web应用程序的支柱。GORM是通用的Go对象关系映射库&#xff0c;它与流行的Go web框架搭配得非常好&#xff0c;提供了无缝集成&#xff0c;简化了数据交互。本指南将带你探索GORM和web框架&#xff08;如Gin&#xff0c; Echo和Beego&#xff09;之间…

SAM C++ TensorRT(实时图像分割)

SPEED SAM C TENSORRT &#x1f310; 1、概述 用于SAM&#xff08;segment anything model分割一切模型&#xff09;的TensorRT和CUDA优化的高表现C实现&#xff0c;特别适用于实时图像分割任务。 &#x1f4e2; 更新 模型转换&#xff1a;从ONNX模型构建TensorRT引擎以加速…

【LLAMA】羊驼从LLAMA1到LLAMA3梳理

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 LLAMA 1到3梳理 1. LLAMA 1 论文&#xff1a; LLaMA: Open and Efficient Foundation Language Models 时间&#xff1a; 2023.02 1.1 前言…

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…

【从0做项目】Java搜索引擎(7) web模块

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 文章导读 零&#xff1a;项目结果展示 一&#xff1a;后端web模块 1&#xff1a;思路 2&#xff1a…

Visual Studio Code 集成 Baidu Comate

文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标&#xff0c;然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮&#xff0c;等待安装完毕…

WeMos D1+PIR+Android 的小场景制作

最近在做一个有趣的小场景功能&#xff0c;其实已经有成熟产品&#xff0c;但是考虑到没法实现场景扩展&#xff0c;所以自己开始动手做。 场景描述&#xff1a;玄关人体感应&#xff0c;有人进门&#xff0c;致欢迎词&#xff0c;有人离开&#xff0c;致欢送词。 硬件设备&a…

Android ListPreference使用

Android ListPreference使用 参考 添加链接描述 导入 androidx.preference.ListPreferenceListPreference是Android中的一个Preference子类,用于显示一个可选择的列表,并且可以保存用户所选择的值。它继承自DialogPreference,可以在用户点击时弹出一个对话框,显示可选择的…

Spring Security实现记住我功能的实战指南

在现代Web应用中&#xff0c;"记住我"功能是提升用户体验的重要特性之一。用户无需在每次访问时重新登录&#xff0c;这不仅方便&#xff0c;还能增强用户对应用的粘性。今天&#xff0c;我们将通过一个具体的实例&#xff0c;详细探讨如何在Spring Security中实现&q…

用命令模式设计一个JSBridge用于JavaScript与Android交互通信

用命令模式设计一个JSBridge用于JavaScript与Android交互通信 在开发APP的过程中&#xff0c;通常会遇到Android需要与H5页面互相传递数据的情况&#xff0c;而Android与H5交互的容器就是WebView。 因此要想设计一个高可用的 J S B r i d g e JSBridge JSBridge&#xff0c;不…

ModuleNotFoundError: No module named ‘timm.optim.novogr两种解决方法

运行报错 from timm.optim.novograd import NovoGradModuleNotFoundError: No module named ‘timm.optim.novograd’。 问题原因 timm版本过高&#xff0c;novograd函数已被抛弃。 解决办法 方法1&#xff1a;安装更低版本的timm pip install timm0.4.12方法2&#xff1a…

DeepSeek 本地部署指南:从零开始搭建 AI 搜索工具

1. 引言 背景介绍 DeepSeek 是一款基于 AI 的搜索工具&#xff0c;能够高效处理海量数据&#xff0c;提供精准的搜索结果。它结合了 Ollama 的模型管理能力&#xff0c;使得部署更加便捷。 为什么选择本地部署 本地部署可以确保数据隐私&#xff0c;避免云端传输的风险&…

昇腾DeepSeek模型部署优秀实践及FAQ

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…

vscode复制到下一行

linux中默认快捷键是ctrl shift alt down/up 但是在vscode中无法使用&#xff0c;应该是被其他的东西绑定了&#xff0c;经测试&#xff0c;可以使用windows下的快捷键shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…

网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件

一、前言 最近几个月里&#xff0c;我一直在学习网络爬虫方面的知识&#xff0c;每有收获都会将所得整理成文发布&#xff0c;不知不觉已经发了7篇日志了&#xff1a; 网络爬虫学习&#xff1a;从百度搜索结果抓取标题、链接、内容&#xff0c;并保存到xlsx文件中 网络爬虫学…