蓝桥杯篇---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矩阵键盘的使用以及示例代码。
相关文章:
蓝桥杯篇---IAP15F2K61S2矩阵键盘
文章目录 前言简介矩阵键盘的工作原理1.行扫描2.检测列状态3.按键识别 硬件连接1.行线2.列线 矩阵键盘使用步骤1.初始化IO口2.扫描键盘3.消抖处理4.按键识别 示例代码:4x4矩阵键盘扫描示例代码:优化后的矩阵键盘扫描注意事项1.消抖处理2.扫描频率3.IO口配…...
【ARM】MDK在编译 i.MXRT1芯片的时候出现报错Error: L6079E
1、 文档目标 解决MDK在编译 i.MXRT1芯片的时候出现报错Error: L6079E 2、 问题场景 客户在使用NXP 的NXP i.MXRT1050的芯片进行工程构建的时候出现下面的报错信息: Error: L6079E: Subtool invocation error: Error executing armcc. The system could not find…...
论文笔记(七十二)Reward Centering(二)
Reward Centering(二) 文章概括摘要2 简单的奖励中心 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…...
LeetCode 2595.奇偶位数:位运算
【LetMeFly】2595.奇偶位数:位运算 力扣题目链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示…...
推荐几款较好的开源成熟框架
一. 若依: 1. 官方网站:https://doc.ruoyi.vip/ruoyi/ 2. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Vue 3. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Cl…...
基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)
基于知识图谱的问答系统:后端PythonFlask,数据库Neo4j,前端Vue3 引言 随着人工智能技术的不断发展,知识图谱作为一种结构化的知识表示方式,逐渐成为问答系统的重要组成部分。本文将介绍如何构建一个基于知识图谱的问答…...
【华为机试】HJ80 整型数组合并
解法一: HashSet>List列表 Collections.sort(list)对列表进行排序 import java.util.*; import java.util.HashSet;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(…...
day17-后端Web原理——SpringBoot原理
目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 4. Web后端开发总结…...
我们来学nginx -- work process
题记 工作进程能处理大量的并发请求几乎不会阻塞Worker进程可绑定到固定的核,避免CPU频繁地上下文切换看样子,还得转为人话 大白话 作为一般的应用的开发大部分人没有很强的底层技术基础如果深究,涉及复杂技术点,很容易迷惘为什…...
马拉车算法
Manacher算法 ,用于处理最长回文字符串的问题,可以在O(n)的情况下,求出一个字符串的最长回文字符串 回文串的基础解法: 以每个点为中心对称点,看左右两边的点是否相同。这种算法的时间复杂度为O࿰…...
【PLL】应用:同步
1. 用于时钟去偏移的PLL 时钟频率增加内部时钟与外部时钟的偏移,在芯片之间通信时很重要时钟偏移可能是由时钟树引起的,该时钟树缓冲外部时钟以驱动大量内部节点 芯片间通信中的时钟偏移问题 芯片1和芯片2共享外部时钟CKext芯片内部逻辑电路操作的实际时…...
golang常用库之-swaggo/swag根据注释生成接口文档
文章目录 golang常用库之-swaggo/swag库根据注释生成接口文档什么是swaggo/swag golang常用库之-swaggo/swag库根据注释生成接口文档 什么是swaggo/swag github:https://github.com/swaggo/swag 参考文档:https://golang.halfiisland.com/community/pk…...
Go入门之数组与切片
var arr1 [...]int{1, 2, 3}fmt.Println(len(arr1)) 数组长度不能扩展 var arr2 [...]int{0: 100, 5: 101}fmt.Println(len(arr2)) } 指定索引初始化 可以通过for和range遍历 值类型:基本数据类型和数组都是值类型,改变副本的值不会改变本身的值 切片为引用数…...
30天开发操作系统 第22天 -- 用C语言编写应用程序
前言 在昨天的最后我们成功干掉了crack2.hrb, 今天我们要尝试一下更厉害的攻击手段。 所以说, 从现在开始又要打开坏人模式了哟,嘿嘿嘿 虽然把操作系统的段地址存入DS这一招现在已经不能用了,不过我可不会善罢甘休的。我要想个更厉害的招数,…...
后端开发:开启技术世界的新大门
在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...
20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题
20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题 2025/2/20 19:14 缘起,使用荣品PRO-RK3566开发板配套的百度网盘中的SDK:Android13编译之后,查看RK3566的CPU占用率为400%。 开机就是400%,什么时候都是4…...
win32汇编环境,窗口程序中使用月历控件示例二
;运行效果 ;win32汇编环境,窗口程序中使用月历控件示例二 ;以下示例有2个操作,即将每周的开始日进行改变,将默认的周日开始改为周一开始,同时实现点击哪个日期,则设定为哪个日期 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>…...
java毕业设计之医院门诊挂号系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的医院门诊挂号系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 医院门诊挂号系统的主要使用者…...
今日行情明日机会——20250220
明日投资机会分析 根据提供的数据,市场热点集中在机器人、人工智能、军工、化工、AI医疗等板块,结合涨停梯队和资金动向,建议关注以下方向: 1. 机器人概念(20家涨停) 核心标的:七板龙头杭齿前…...
Linux 实操篇 组管理和权限管理、定时任务调度、Linux磁盘分区和挂载
一、组管理和权限管理 (1)Linux组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外 在linux中每个文件有所有者、所在组、其他组的概念 (2)文件/目录 所有者 一般为文件的创建者,谁创建了该…...
对CSS了解哪些?
CSS(Cascading Style Sheets,层叠样式表)是用来描述HTML文档外观和布局的语言。以下是对CSS的常见了解范围: 1. CSS 基础 选择器:如通用选择器 (*)、类型选择器、类选择器 (.class)、ID选择器 (#id)、后代选择器、伪类…...
虚拟机新建Ubuntu系统联网快速配置实现能正常ssh连接
1.写一个shell脚本 #!/bin/bash# 更新系统 sudo apt update -y# 安装openssh-server sudo apt install openssh-server -y# 启动SSH服务 sudo systemctl start ssh# 设置SSH服务开机自启 sudo systemctl enable ssh# 检查SSH服务状态 sudo systemctl status ssh# 允许SSH连接 …...
青少年编程都有哪些比赛可以参加
Python小学生可参加的赛事: 电子学会青少年编程考级、中国计算机学会编程能力等级认证、蓝桥杯、 信奥赛CSP-J/S初赛/NOIP(推荐C)、编程设计、信息素养、科技创新赛; 升学助力(科技特长生、大学)、企业、出国留学; python比赛&am…...
MySql中的事务、MySql事务详解、MySql隔离级别
文章目录 一、什么是事务?二、事务四大特性ACID 2.1、原子性(Atomicity)2.2、一致性(Consistency)2.3、隔离性(Isolation)2.4、持久性(Durability) 三、事务操作/事务的…...
10、k8s对外服务之ingress
service和ingress的作用 service的作用 NodePort:会在每个节点开放一个端口,端口号30000-32767。 也是只能用于内网访问,四层转发。实现负载均衡。不能基于域名进行访问。 clusterip:service的默认类型,只能在集群…...
【结束】JS如何不通过input的onInputFileChange使用本地mp4文件并播放,nextjs下放入public文件的视频用video标签无法打开
本地不用input标签获取video视频并播放 浏览器没有像JAVA这些语言之类的IO 代码: <div><video id"video_id" width"750" height"500" controls>Your browser does not support the video tag.</video> </div…...
【STM32】舵机SG90
1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…...
科普:“git“与“github“
Git与GitHub的关系可以理解为:Git是一种软件工具,而GitHub则是一个在线平台,它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说: 一、Git 定义:Git是一个开源的…...
个人简历html网页模板,科技感炫酷html简历模板
炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…...
蓝桥杯备赛 Day8 二分
二分 1.要点 选取左闭右闭,[left,right] (1)二分查找:有序数组,且无重复元素寻找目标值key int left0,rightn-1,res-1;//未找到返回-1 while(left<right){int midleft((right-left)>>1); //注意右边括号,号优先于>>if(a[mi…...
