35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
江科大学长又发布了第二期的编写技巧!
大家可以看看:https://space.bilibili.com/383400717
最后面给了一个未完成的任务:
这里我已经把这个问题给解决了!
总代码放在资源里面,key.c放在文章最后面!同时感兴趣的同学可以看看我的Linux驱动讲解!
1、保存上一次的标志位:
2、清零目标标志位
计划在同一个按键事件后的标志位发生变化时,判断上一个标志位和目前标志位不一样时进行清理:
为了简单理解,我们就以同一个按键,两位2进制标志位来讲。
假设上一个的标志位是10;如果按照之前的代码,切换模式的时候,那目前标志位就是11,因为假设并没有进行检查操作就想清零。解决标志位积累的问题!
所以进行:
if(Last_Key_Flag[i]!=Key_Flag[i])
{Key_Flag[i]&=~Last_Key_Flag[i];
}
Last_Key_Flag[i]=Key_Flag[i];
3、同一个按键空闲的时候也清零标志位:
这样就行了!不过这里有一个问题,就是按键松开和按压时间交替太快了,程序会认为是清零标志位,而不是双击,太慢了,就会认为是单击。但是如果不这样设置,就会保留最后一次的标志位,目前我没有想到好的方法!就留给后来者了!
4、Key.c代码:
#include "stm32f10x.h" // Device header#include "Key.h"#define KEY_PRESSED 1
#define KEY_UNPRESSED 0#define KEY_TIME_DOUBLE 200
#define KEY_TIME_LONG 2000
#define KEY_TIME_REPEAT 100u8 Key_Flag[KEY_COUNT];void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //¶ÁÈ¡°´¼üGPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //¶ÁÈ¡°´¼üGPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}u8 Key_Getstate(u8 n)
{if(n==KEY_1){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){return KEY_PRESSED ;}}else if(n==KEY_2){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){return KEY_PRESSED ;}}else if(n==KEY_3){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1){return KEY_PRESSED ;}}else if(n==KEY_4){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1){return KEY_PRESSED ;}}return KEY_UNPRESSED;}u8 Key_Check(u8 n,u8 Flag)
{if(Key_Flag[n]&Flag){if(Flag!=KEY_HOLD){Key_Flag[n]&=~Flag;}return 1;}return 0;
}void Key_Tick(void)
{static u8 Count,i;static u8 CurrState[KEY_COUNT],PrevState[KEY_COUNT];static u8 S[KEY_COUNT];static u16 Time[KEY_COUNT];static u8 Last_Key_Flag[KEY_COUNT]; for(i=0;i<KEY_COUNT;i++){if(Time[i]>0){Time[i]--;}}Count++;if(Count>=20){Count=0;for(i=0;i<KEY_COUNT;i++){PrevState[i]=CurrState[i];CurrState[i]=Key_Getstate(i);if(CurrState[i]==KEY_PRESSED){//HOLD=1Key_Flag[i]|=KEY_HOLD;}else{//HOLD=0Key_Flag[i]&=~KEY_HOLD;}if(CurrState[i]==KEY_PRESSED&&PrevState[i]==KEY_UNPRESSED){//Down=1Key_Flag[i]|=KEY_DOWN;}if(CurrState[i]==KEY_UNPRESSED&&PrevState[i]==KEY_PRESSED){//UP=1Key_Flag[i]|=KEY_UP;}if(PrevState[i]==KEY_UNPRESSED&&CurrState[i]==KEY_UNPRESSED){Key_Flag[i]&=0x00;}if(S[i]==0){if(CurrState[i]==KEY_PRESSED){Time[i]=KEY_TIME_LONG;//2s³¤°´Ê±¼äãÐÖµS[i]=1;}}else if(S[i]==1){if(CurrState[i]==KEY_UNPRESSED){Time[i]=KEY_TIME_DOUBLE;S[i]=2;}else if(Time[i]==0){Time[i]=KEY_TIME_REPEAT;//LONG=1Key_Flag[i]|=KEY_LONG;S[i]=4;}}else if(S[i]==2){if(CurrState[i]==KEY_PRESSED){//DOUBLE=1Key_Flag[i]|=KEY_DOUBLE;S[i]=3;}else if(Time>0){//SINGLE=1Key_Flag[i]|=KEY_SINGLE;S[i]=0;}} else if(S[i]==3){if(CurrState[i]==KEY_UNPRESSED){S[i]=0;}} else if(S[i]==4){if(CurrState[i]==KEY_UNPRESSED){S[i]=0;}else if(Time[i]==0){Time[i]=KEY_TIME_REPEAT;//REPEAT=1Key_Flag[i]|=KEY_REPEAT;S[i]=4;}} if(Last_Key_Flag[i]!=Key_Flag[i]){Key_Flag[i]&=~Last_Key_Flag[i];}Last_Key_Flag[i]=Key_Flag[i];}}
}
``
相关文章:

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
江科大学长又发布了第二期的编写技巧! 大家可以看看:https://space.bilibili.com/383400717 最后面给了一个未完成的任务: 这里我已经把这个问题给解决了! 总代码放在资源里面,key.c放在文章最后面!同时感…...

Linux常用命令学习手册
Linux常用命令学习手册https://download.csdn.net/download/2401_87690752/90953550 《Linux常用命令学习手册》提供了一份实用的Linux操作指南,主要收录了系统管理和文件操作等基础命令。内容涵盖了目录切换、文件查看、权限设置等核心功能,适合Linux初…...

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解
在现代 Web 应用中,异步处理是实现流畅交互的核心技术。本文基于前几章实现的内容Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加-CSDN博客,深入解析 AI 对话框页面中异步逻辑的…...

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
文章目录 前言:准备工作UE4 vs UE5 性能对比引擎核心技术方案对比UE5 优化总结项目设置可伸缩性组设置VolumetricCloud最后前言: 最近在使用UE5制作VR项目 制作完后发现,我们的场景一直很卡顿,场景优化也做到了极致,但是帧率最高也才30+ 但是我们看到一个竞品,他的帧率竟…...

COMSOL与MATLAB联合仿真人工智能的电学层析成像系统
关键词:MATLAB,电学层析成像,人工智能,图像重建,深度学习 一、引言 基于人工智能的电学层析成像系统是一种创新的检测技术,结合了电学层析成像技术与人工智能算法的优势。电学层析成像技术,简…...

配置sudo免密却不生效的问题
如图,我配置了dhcp4这个账号sudo免密,但是执行sudo的时候还是要输密码。 查看dhcp的用户组,是配置了一个wheel组,而wheel组配置的是需要密码。 我们用dhcp4用户执行sudo -l 发下他匹配了两条命令策略,一个是免密一个…...

大模型赋能:金融智能革命中的特征工程新纪元
一、AI进化论:从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面:银行风控模型像老式收音机,需要人工反复调试参数才能捕捉风险信号;而大模型则是智能调音台,能自动“听…...
Significant Location Change
一、Significant Location Change是什么 “Significant Location Change(重大位置变化)” 是苹果 iOS 系统中一项用于在应用未主动运行时,监测设备位置显著变化的功能。它主要通过基站、Wi-Fi 网络等信号来判断设备是否发生了有意义的位置移…...
springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
我们在java项目开发中,如何设置服务器最大负载,过了服务器承受范围之后,提示用户稍后重试,避免 服务器无法提供正常服务 如何设置服务器负载比如:最大线程数,等待数量等,请看:springtomcat 用户…...

LHA9924芯片可代替AD7190,CS5530
LHA9924是一款高性能、单芯片模数转换器(ADC)。该器件包括一个低噪声可编程增益放大器(PGA)、Δ-Σ调制器和数字滤波器。该ADC支持两种运行模式,可在功耗与分辨率之间实现最佳平衡。双通道多路复用器可以选择外部信号测量和内部ADC测试信号。具有使输入电路短路来测…...

短视频矩阵系统技术saas源头6年开发构架
在短视频内容爆发式增长的今天,短视频矩阵系统SAAS技术成为企业快速搭建视频平台的关键解决方案。本文将系统解析从技术源头到服务落地的全流程开发路径。 一、系统定义与技术基础 短视频矩阵系统是集视频上传、智能编辑、多端分享、高清播放于一体的综合性平台。其…...
枫之谷Artale端午节大当机----后端技术的巨大风险
枫之谷Artale在端午节活动造成大量玩家上线塞爆,进不去,甚至在最后时段大当机,造成数万玩家怒火。 这体现了后端技术的影响,它不像是前端技术只对少数人造成影响,只要一出事,就是大批的玩家一起面对崩溃的伺…...

前端删除评论操作(局部更新数组)
评论的删除是局部删除,把所点击的评论id号传递给后端,通知后端在数据库中删除数据,并且返回数据,但是在前端并不直接接收返回的数据,而是触发回调事件,在前端上进行删除评论,首先通过pId观察他…...
数学复习笔记 28
前言 刷数学题非常爽啊。让我感觉自己能考一百四,一百五这种错觉。我和一个朋友说,我肯定能考一百四以上,他说他觉得我最多考一百二,笑死,我是这么菜的么。下面是线代第六章的例题的一些理解。我现在觉得考研数学不需…...
Delphi 实现远程连接 Access 数据库的指南
方法一:通过局域网共享 Access 文件(简单但有限) 步骤 1:共享 Access 数据库 将 .mdb 或 .accdb 文件放在局域网内某台电脑的共享文件夹中。 右键文件夹 → 属性 → 共享 → 启用共享并设置权限(需允许网络用户读写&a…...

在线OJ项目测试
一.项目简介 1.1项目背景 历史起源:最早的OJ系统(如UVa、POJ)是为国际大学生程序设计竞赛(ICPC)等赛事开发的,用于自动评判参赛者的代码正确性和效率。 需求场景:竞赛需要公平、高效的评分系统…...

C++ --- vector
C --- vector的使用 前言1、构造函数1.1默认构造1.2n个val值构造1.3迭代器区间构造1.4拷贝构造1.4初始化列表构造 2、遍历方式2.1[ ] 下标2.2迭代器2.3范围for 3、常用方法或重载(1)增push_back()insert()assign() (2)删erase()c…...
【python基础知识】变量名和方法名的单下划线(_)和双下划线(__)总结
文章目录 1. 单下划线前缀(_variable 或 _method())2. 双下划线前缀(__variable 或 __method())3. 前后双下划线(__variable__ 或 __method__)4. 单下划线(_)单独使用总结 在 Python…...

FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ FART 脱壳 fartthread 方法在 app 启动的时候(ActivityThread)开启 fart 线程,休眠 60 秒,等待 app 启动完成后…...
✅ 常用 Java HTTP 客户端汇总及使用示例
在 Java 开发中,HTTP 客户端是与服务端交互的关键组件。随着技术发展,出现了多种 HTTP 客户端库,本文汇总了常用的 Java HTTP 客户端,介绍其特点、适用场景,并附上简单使用示例,方便开发者快速选择和上手。…...

快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
目录 1. uv 介绍2. uv 安装(Windows版)3. 快速模拟一个要发布到TestPyPI上的依赖包,scoful-test-lib3.1 初始化 uv init3.2 进入scoful-test-lib3.3 修改pyproject.toml3.4 使用命令 uv sync3.5. 使用命令 uv lock3.6 使用命令 uv build3.7 获…...
Keil调试模式下,排查程序崩溃简述
在Keil调试模式下,若程序崩溃,可以通过以下步骤来定位崩溃的位置: 一、查看调用栈(Call Stack) 打开调用栈窗口: 在Keil的调试模式下,点击菜单栏的“View” -> “Call Stack Window”&…...

Python读取PDF:文本、图片与文档属性
在日常的数据采集、文档归档与信息挖掘过程中,PDF格式因其版式固定、内容稳定而被广泛使用。Python 开发者若希望实现 PDF 内容的自动化提取,选择一个易用且功能完善的库至关重要。本文将介绍如何用Python实现 PDF文本读取、图片提取 以及 文档属性读取 …...

基于SpringBoot+Vue2的租房售房二手房小程序
角色: 管理员、房东、租客/买家 技术: springbootvue2mysqlmybatispagehelper 核心功能: 租房售房小程序是一个专注于房屋租赁和销售的综合性平台,基于SpringBootVue2MySQLMyBatisPageHelper技术栈开发,为用户提供…...
数学:学好数学需要对数系进行系统的对比和分析
数系范围:自然数通常是从 0 或 1 开始,用于计数的数,然后整数包括正负和零,有理数是分数,实数包括无理数,复数引入虚数单位。 运算性质:比如是否满足加法、乘法的封闭性,是否有逆元,是否有序,完备性等。 结构对比:比如代数结构,比如自然数是半群,整数是环,有理…...

基于本地LLM与MCP架构构建AI智能体全指南
一、AI智能体开发的新范式 随着人工智能技术的快速演进,AI智能体(AI Agents)正成为连接技术创新与实际应用的核心载体。从智能家居的温控系统到复杂的金融风控决策,AI智能体通过感知环境并执行目标导向的行为,正在重塑…...

AT2659_GNSS低噪声放大器芯片
AT2659 射频放大器在SiGe工艺平台上实现23dB增益与0.71dB噪声系数的优异组合,专为BDS/GPS/GLONASS/GALILEO多模导航系统优化设计。其宽电压适应能力(1.4-3.6V)与低至4.4mA的功耗特性,配合1.5mm1mm0.55mm的6脚DFN封装(R…...
跨平台游戏引擎 Axmol-2.6.1 发布
Axmol 2.6.1 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 🙏感谢所有贡献者及财务赞助者:scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 错误修复 修复Android armv7架构崩溃问题&…...

MADlib —— 基于 SQL 的数据挖掘解决方案(4)—— 数据类型之矩阵
目录 一、矩阵定义 二、MADlib 中的矩阵表示 1. 稠密 2. 稀疏 三、MADlib 中的矩阵运算函数 1. 矩阵操作函数分类 (1)表示函数 (2)计算函数 (3)提取函数 (4)归约函数&…...

ServBay 1.13.0 更新,新增第三方反向代理/内网穿透
ServBay 作为一款简化本地开发环境搭建与管理的强大工具,致力于打造一个开箱即用、稳定可靠的本地开发平台,让用户专注于代码编写,提升开发效率。 ServBay 1.13.0 正式发布!本次更新聚焦于提升本地开发项目的外部可访问性、增强国…...