蓝桥杯备战——2.矩阵键盘
1.分析原理图

 由上图可以看到若J5跳线帽接地,就S4~S7就可以当做四路独立按键,若接到P44,则就是4*4的矩阵键盘。
2.独立按键处理
相对传统的按键延时消抖方案,这里我采用更高效,更经典,更偏向产品级应用的状态机方案:
u8 Trg=0,Cont=0;
//独立按键
void Key_Scan()
{//状态机u8 ReadData = P3^0XFF;Trg = ReadData&(ReadData^Cont);	//记录短按键值Cont = ReadData;	//记录长按键值Key_Read();	//判断哪个按键按下
}
void Key_Read()
{if(Trg == 0x08){ //S4短按//按键任务区Set_Leds(1,1);//打开LED1}else if(Trg == 0x04){ //S5短按Set_Leds(2,1);	//打开LED2}else if(Trg == 0x02){	//S6短按Set_Leds(3,1);}else if(Trg == 0x01){ //S7短按Set_Leds(4,1);}else;
}
在应用的时候我们只需要知道三个状态对应的按键情况就行:
 1.按键未按下或者松手时:Trg=0,Cont=0
 2.按键刚按下,且Key_Scan只运行一遍时:Trg=键值,Cont=键值
 3.按键持续按下状态时:Trg=0,Cont=键值
 然后我们就能根据这三个状态来判断长按,短按,未按下,以及后续扩展双击等功能
扩展长按功能:由于按键持续按下状态Cont=键值,且Trg=0;因此我们可以在此条件基础上增加一个计时变量,当变量大于一定值则判定为长按。
u8 Trg=0,Cont=0,Num=0;
bit LONG_CLICKED=0;
//独立按键
void Key_Scan()	//20ms扫描一次
{//状态机u8 ReadData = P3^0XFF;Trg = ReadData&(ReadData^Cont);	//记录短按键值Cont = ReadData;	//记录长按键值if((Trg==0)&&(Cont!=0))	//记录按下时长{if(++Num==100) //满足长按2S{LONG_CLICKED=1;Num++;}}if((Trg==0)&&(Cont==0)) //松手或者未按下{//此处可扩展双击Num=0;}Key_Read();	//判断哪个按键按下
}void Key_Read()
{if(Trg == 0x08){ //S4短按//按键任务区Set_Leds(1,1);}else if(Trg == 0x04){ //S5短按Set_Leds(2,1);}else if(Trg == 0x02){	//S6短按Set_Leds(3,1);}else if(Trg == 0x01){ //S7短按Set_Leds(4,1);}else;if(!LONG_CLICKED) return;if(Cont==0x08){ //S4长按Set_Leds(1,0);}else if(Cont==0x04){ //S5长按Set_Leds(2,0);}else if(Cont==0x02){	//S6长按Set_Leds(3,0);}else if(Cont==0x01){ //S7长按Set_Leds(4,0);}else;LONG_CLICKED=0;
}
扩展双击功能:双击功能则是在松手状态下去判断长按功能的计时变量,小于一定值则可认为按键短按一次,此时再创建一个计时变量,当此计时变量大于一定值而小于一定值时按键再次按下则可判定为双击。好像往年都未曾考查过此功能,所以我就不写了,有兴趣的同学可以试试。
3.矩阵键盘
矩阵键盘的处理方案同独立按键,我就不细讲了,理解记忆即可
u8 Trg=0,Cont=0,Num=0;
bit LONG_CLICKED=0;
//矩阵键盘
void Keys_Scan()
{//状态机u8 ReadData,ColumnData;P3 = 0XF0;  //行低列高P42 = 1;P44 = 1;P36 = P42;	//IO映射,便于数据操作P37 = P44;ColumnData = P3; //暂存列数据P3 = 0X0F;	//行高列低P42 = 0;P44 = 0;ReadData=(P3 | ColumnData)^0XFF;Trg = ReadData&(ReadData^Cont);	//记录短按键值Cont = ReadData;	//记录长按键值if((Trg==0)&&(Cont!=0))	//记录按下时长{if(++Num==100) //满足长按2S{LONG_CLICKED=1;Num++;}}if((Trg==0)&&(Cont==0)) //松手或者未按下{//此处可扩展双击Num=0;}Keys_Read();	//判断哪个按键按下
}/****************矩阵键码表******************
S7-0X81  	S11-0X41 	S15-0X21 	S19-0X11   
S6-0X82		S10-0X42 	S14-0X22 	S18-0X12
S5-0X84		S9-0X44 	S13-0X24 	S17-0X14
S4-0X88		S8-0X48 	S12-0X28 	S16-0X18 
*******************************************/
void Keys_Read()
{	//用到再加,一一列举程序运行慢if(Trg == 0x81){ //S7按下Set_Leds(1,1);}else if(Trg == 0x48){	//S8按下Set_Leds(2,1);}else;if(!LONG_CLICKED) return;if(Cont == 0x81){ //S7长按Set_Leds(1,0);}else if(Cont == 0X48){ //S8按下Set_Leds(2,0);}else;LONG_CLICKED=0;
}
4.使用示例
#include "main.h"void System_Init(void);void Delay20ms()		//@12.000MHz
{unsigned char data i, j;i = 234;j = 115;do{while (--j);} while (--i);
}void main()
{System_Init();while(1){Delay20ms();//Key_Scan();Keys_Scan();}
}void System_Init()//系统上电初始化
{//先锁存蜂鸣器,继电器所在573输出低电平,防止上电乱叫P25=1;P26=0;P27=1; //74HC138-->Y5=0,else=1-->Y5C=1,else=0P0=0X00;	//ULN2003输入经过非门送入达林顿管,低电平有效P25=0;P26=0;P27=0;//锁存数据//关闭所有LED灯P25=0;P26=0;P27=1; //74HC138-->Y4=0,else=1-->Y4C=1,else=0P0=0XFF;P25=0;P26=0;P27=0;//锁存数据}
如果有用到长按功能,20ms运行一次最好是通过定时器去扫描实现,后续笔记中我会提供示例。
相关文章:
 
蓝桥杯备战——2.矩阵键盘
1.分析原理图 由上图可以看到若J5跳线帽接地,就S4~S7就可以当做四路独立按键,若接到P44,则就是4*4的矩阵键盘。 2.独立按键处理 相对传统的按键延时消抖方案,这里我采用更高效,更经典,更偏向产品级应用的…...
 
Docker部署思维导图工具SimpleMindMap并实现公网远程访问
文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性,包含插件化架构、多种结构类型&…...
 
机器学习实验2——线性回归求解加州房价问题
文章目录 🧡🧡实验内容🧡🧡🧡🧡数据预处理🧡🧡代码缺失值处理特征探索相关性分析文本数据标签编码数值型数据标准化划分数据集 🧡🧡线性回归🧡&am…...
 
宝塔+nextcloud+docker+Onlyoffice 全开启https
折腾了我三天的经验分享 1.宝塔创建网站 nextcloud版本为28.0.1 php8.2 ,导入nextcloud绑定域名对应的证书 ,不用创建mysql 因为nextcloud 要求是mariadb:10.7 宝塔里没有,就用docker安装一个 端口设置为3307 将数据库文件映射出来/ww…...
呼吸机电机控制主控MCU方案
呼吸机是一种能代替、控制或改变人的正常生理呼吸,增加肺通气量,改善呼吸功能,减轻呼吸功消耗,节约心脏储备能力的装置。呼吸机连接一条管子到患者的嘴或鼻子,氧气量可以通过监视器加以控制。 基于灵动微控制器的呼吸…...
 
gitlab备份-迁移-升级方案9.2.7升级到15版本最佳实践
背景 了解官方提供的版本的升级方案 - GitLab 8: 8.11.Z 8.12.0 8.17.7 - GitLab 9: 9.0.13 9.5.10 9.2.7 - GitLab 10: 10.0.7 10.8.7 - GitLab 11: 11.0.6 11.11.8 - GitLab 12: 12.0.12 12.1.17 12.10.14 - GitLab 13: 13.0.14 13.1.11 13.8.8 13.12.15 - G…...
redis面试题合集-基础
前言 又来到每日的复习时刻,昨天我们学习了mysql相关基础知识,还有分布式数据库介绍(后续总结时再持续更新)。今日继续学习缓存杀器:redis redis基础面试题合集 什么是Redis? Redis是一个开源的、内存中…...
(Unity)C# 中的字符串格式化
前言 在软件开发中,理解和掌握字符串的格式化及调试技巧对于编写高效和可维护的代码至关重要。 字符串插值 ($ 符号) 在 C# 中,字符串插值是通过在字符串前加 $ 符号来实现的。这允许我们将变量、表达式或函数调用直接嵌入到字符串中。 string name &qu…...
 
【项目日记(五)】第二层: 中心缓存的具体实现(上)
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:项目日记-高并发内存池⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你做项目 🔝🔝 开发环境: Visual Studio 2022 项目日…...
 
使用PSIM软件生成DSP28335流水灯程序
最近在学习DSP28335芯片,然后在使用PSIM仿真软件时发现这个仿真软件也支持28335芯片,于是就想学习下如何在PSIM软件中使用DSP28335芯片。在PSIM自带的官方示例中有使用DSP28335芯片的相关例子。 工程下载链接 https://download.csdn.net/download/qq_20…...
 
【iOS ARKit】人脸检测追踪基础
在计算机人工智能(Artificial Inteligence,AI)物体检测识别领域,最先研究的是人脸检测识别,目前技术发展最成熟的也是人脸检测识别。人脸检测识别已经广泛应用于安防、机场、车站、闸机、人流控制、安全支付等众多社会领域&#x…...
 
ES的一些名称和概念总结
概念 先看看ElasticSearch的整体架构: 一个 ES Index 在集群模式下,有多个 Node (节点)组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard (分片), P1 P2 是主分片, R1 R2…...
 
Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析
2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。 在新增员工的时候,上传员工的图像,而之所以需要上传员工的图像&…...
 
【GitHub项目推荐--不错的 Go 学习项目】【转载】
开源实时性能分析平台 Pyroscope 是基于 Go 的开源实时性能分析平台,在源码中添加几行代码 pyroscope 就能帮你找出源代码中的性能问题和瓶颈、CPU 利用率过高的原因,调用树展示帮助你理解程序,支持 Go、Python、Ruby 语言。 Pyroscope 可以…...
 
【Git】windows系统安装git教程和配置
一、何为Git Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 二、git安装包 有2种版本,Git for Windows Setup和Git for Windows Portable(便携版)两个版本都可以。 三、Git for Windows Por…...
 
办公技巧:PPT制作技巧分享,值得收藏
目录 1、黑屏/白屏你用过么 2、图形组合替代动画刷 3、等距分布图形元素 4、快速统一字体 5、文本框也是可以改的 6、批量修改形状 7、搞定“怎么也选不中” 8、妙用CtrlD 9、图片阵列怎么做 10、临时放大某一区域 11、Word快速导入PPT 12、炫酷小人怎么做的&#…...
 
Google Chrome RCE漏洞 CVE-2020-6507 和 CVE-2024-0517 流程分析
本文深入研究了两个在 Google Chrome 的 V8 JavaScript 引擎中发现的漏洞,分别是 CVE-2020-6507 和 CVE-2024-0517。这两个漏洞都涉及 V8 引擎的堆损坏问题,允许远程代码执行。通过EXP HTML部分的内存操作、垃圾回收等流程方式实施利用攻击。 CVE-2020-…...
 
前端怎么监听手机键盘是否弹起
摘要: 开发移动端中,经常会遇到一些交互需要通过判断手机键盘是否被唤起来做的,说到判断手机键盘弹起和收起,应该都知道,安卓和ios判断手机键盘是否弹起的写法是有所不同的,下面讨论总结一下两端的区别以及…...
 
本地生活服务平台加盟前景与市场分析
随着短视频市场的的不断发展,人们的生活方式也在发生着巨大的变化。在这个数字化的时代,越来越多的创业者开始注重本地生活服务,这也为创业者提供了一个绝佳的商机。加盟本地生活服务平台,既可以抓住这波风口,又可以满…...
 
蓝桥杯备战——7.DS18B20温度传感器
1.分析原理图 通过上图我们可以看到DS18B20通过单总线接到了单片机的P14上。 2.查阅DS18B20使用手册 比赛的时候是会提供DS18B20单总线通讯协议的代码,但是没有提供读取温度数据的代码,所以还是需要我们去查看手册,我只把重要部分截下来了 …...
 
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
 
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
 
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
 
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
 
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
