逻辑是通过定时器溢出周期进行判断按下次数

比如设置定时器溢出周期为500MS,每次溢出都会判断按键按下次数,如果下个周期前没有触发按下,则结束键值判断.并确定触发键值.清空按下次数标志.测试比一个定时器周期按下按键次数判断写法要稳定...

记录STM32实现多功能按键_stm32一个按键实现多种功能-CSDN博客

直接上代码,这里使用的是M4内核芯片,如果需要使用M3则修改初始化代码

按键外部中断代码

#include "exti.h"
#include "key.h"
#include "systick.h"
#include "TIM6.h"#include "io_bit.h"    //位带操作 正点原子的是SYS.H
#define KEY1 PAin(0)    extern u8 multi_flag; //外部声明//PA0---KEY1
void Exti_Init(void)//函数定义
{EXTI_InitTypeDef EXTI_KEY_Init={0};NVIC_InitTypeDef NVIC_KEY_Init={0};//1.配置SYSCFG系统配置寄存器时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//2.打开GPIOABC外设时钟使能 RCC->AHB1ENRRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//KEY1GPIO_InitTypeDef GPIO_KEY_Init={0};GPIO_KEY_Init.GPIO_Mode=GPIO_Mode_IN;GPIO_KEY_Init.GPIO_Pin=GPIO_Pin_0;GPIO_KEY_Init.GPIO_PuPd=GPIO_PuPd_DOWN;GPIO_Init(GPIOA, &GPIO_KEY_Init);//3.映射对应的中断线到IO上SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);//4.配置EXTI中断初始化EXTI_KEY_Init.EXTI_Line=EXTI_Line0;//中断线EXTI_KEY_Init.EXTI_LineCmd=ENABLE;EXTI_KEY_Init.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式EXTI_KEY_Init.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发EXTI_Init(&EXTI_KEY_Init);//5.配置NVIC中断控制器初始化NVIC_KEY_Init.NVIC_IRQChannel=EXTI0_IRQn;NVIC_KEY_Init.NVIC_IRQChannelCmd=ENABLE;NVIC_KEY_Init.NVIC_IRQChannelPreemptionPriority=2;NVIC_KEY_Init.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_KEY_Init);
}
//6.配置中断服务函数
u8 multi_flag;//记录按下的次数   需要外部声明
void EXTI0_IRQHandler(void)
{int i=20;delay(1500);if(EXTI_GetITStatus(EXTI_Line0)){ TIM_Cmd(TIM6, ENABLE);printf("KEY1外部中断触发,打开定时器\r\n");multi_flag++;//记录按下次数TIM_SetCounter(TIM6,0);//更新计数}//7.清除中断标志 EXTI_ClearITPendingBit(EXTI_Line0);
}

定时器配置:

#include "TIM6.h"
#include "exti.h"void Tim6_Init(uint32_t prc,uint32_t arr)
{//定义结构体变量TIM_TimeBaseInitTypeDef TIM_Time6_Init={};NVIC_InitTypeDef NVIC_Time6_Init={};//对定时器TIM6时钟使能 RCC_APB1ENRRCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM6,ENABLE);//给成员赋值TIM_Time6_Init.TIM_ClockDivision=TIM_CKD_DIV1;//不分频TIM_Time6_Init.TIM_CounterMode=TIM_CounterMode_Up;//TIM6只有向上计数TIM_Time6_Init.TIM_Period=arr;//重装载TIM_Time6_Init.TIM_Prescaler=prc-1;//xxx+1  预分频//定时器TIM_Init()初始化函数调用TIM_TimeBaseInit(TIM6, &TIM_Time6_Init);//使能定时器TIM_Cmd(TIM6, DISABLE);//打开定时器中断TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//清除定时器中断标志位TIM_ClearITPendingBit( TIM6,TIM_IT_Update);//NVIC优先级配置    NVIC_Time6_Init.NVIC_IRQChannel=TIM6_DAC_IRQn;//中断源NVIC_Time6_Init.NVIC_IRQChannelCmd=ENABLE;//使能中断NVIC_Time6_Init.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级NVIC_Time6_Init.NVIC_IRQChannelSubPriority=2;//响应优先级    NVIC_Init(&NVIC_Time6_Init);
}
//编写中断服务函数(1s时间进一次中断)
void TIM6_DAC_IRQHandler(void)
{if(TIM_GetITStatus(TIM6,TIM_IT_Update)){TIM_Cmd(TIM6, DISABLE);printf("TIM6定时时间到!\r\n");if(KEY1==0&&multi_flag==1)//松手并且标志位为1---单击   KEY1 位带操作{printf("触发单击!\r\n");}else if(KEY1==0&&multi_flag==2)// KEY1 位带操作{printf("触发双击!\r\n");}else if(KEY1==0&&multi_flag==3){printf("触发三击!\r\n");}else if(KEY1==0&&multi_flag>3){printf("此功能不存在\r\n");}else if(KEY1==1&&multi_flag==1){printf("长按\r\n");}multi_flag=0;//清空标志}//清除中断标志位TIM_ClearITPendingBit( TIM6,TIM_IT_Update);
}

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

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

相关文章

【安卓Sensor框架-1】SensorService 的启动流程

内核启动后,首个用户空间进程init(pid1)解析init.rc配置文件,启动关键服务(如Zygote和ServiceManager)。 Zygote服务配置为/system/bin/app_process --zygote --start-system-server,后续用于孵…

centos网卡绑定参考

同事整理分享: 1. 加载 Bonding 模块 modprobe bonding 获取网卡名称 ip a 找到接了网线的网卡名称,记下。 3. 配置物理网卡 创建并编辑 /etc/sysconfig/network-scripts/ifcfg-ens36(ifcfg-后面的内容根据上面找到的具体网卡名称决定&#…

mbedtls ssl handshake error,res:-0x2700

用LinkSDK.c连接第三方云平台出现现象 解决方案: 在_tls_network_establish函数中加入 mbedtls_ssl_conf_authmode(&adapter_handle->mbedtls.ssl_config, MBEDTLS_SSL_VERIFY_NONE);原因解释:用连接方式是不用证书认证/跳过服务端认证。

Spring Security 的方法级权限控制是如何利用 AOP 的?

Spring Security 的方法级权限控制是 AOP 技术在实际应用中一个极其强大的应用典范。它允许我们以声明式的方式保护业务方法,将安全规则与业务逻辑彻底解耦。 核心思想:权限检查的“门卫” 你可以把 AOP 在方法级安全中的作用想象成一个尽职尽责的“门…

一键内网穿透,无需域名和服务器,自动https访问

cloudflare能将内网web转为外网可访问的地址。(这和apiSQL有点类似,apiSQ可以将内网数据库轻松转换为外网的API,并且还支持代理内网已有API,增强安全增加API Key,以https访问等等) 但Cloudfalre tunnel这个…

Sentinel(二):Sentinel流量控制

一、Sentinel 流控规则基本介绍 1、Snetinel 流控规则配置方式 Sentinel 支持可视化的流控规则配置,使用非常简单;可以在监控服务下的“簇点链路” 或 “流控规则” 中 给指定的请求资源配置流控规则;一般推荐在 “簇点链路” 中配置流控规则…

支持PY普冉系列单片机调试工具PY32linK仿真器

PY32 Link是专为 ‌PY32系列ARM-Cortex内核单片机‌(如PY32F002A/030/071/040/403等)设计的仿真器,支持全系列芯片的‌调试和仿真‌功能。‌开发环境兼容性‌支持主流IDE:‌Keil MDK‌ 和 ‌IAR Embedded Workbench‌,…

深入解析Python多服务器监控告警系统:从原理到生产部署

深入解析Python多服务器监控告警系统:从原理到生产部署 整体架构图 核心设计思想 无代理监控:通过SSH直接获取数据,无需在目标服务器安装代理故障隔离:单台服务器故障不影响整体监控多级检测:网络层→资源层→服务层层…

JUC:10.线程、monitor管程、锁对象之间在synchronized加锁的流程(未完)

一、monitor管程工作原理: 首先,synchronized是一个对象锁,当线程运行到某个临界区,这个临界区使用synchronized对对象obj进行了上锁,此时底层发生了什么? 1.当synchronized对obj上锁后,synch…

Elasticsearch(ES)分页

Elasticsearch(简称 ES)本身不适合传统意义上的“深分页”,但提供了多种分页方式,每种适用不同场景。我们来详细讲解: 一、基本分页(from size) 最常用的分页方式,类似 SQL 的 LIM…

原生微信小程序:用 `setData` 正确修改数组中的对象项状态(附实战技巧)

📌 背景介绍 在微信小程序开发中,我们经常需要修改数组中某个对象的某个字段,比如: 列表中的某一项展开/收起多选状态切换数据列表中的临时标记等 一个常见的场景是: lists: [{ show: true }, { show: true }, { s…

Oracle 临时表空间相关操作

一、临时表空间概述 临时表空间(Temporary Tablespace)是Oracle数据库中用于存储临时数据的特殊存储区域,其数据在会话结束或事务提交后自动清除,重启数据库后彻底消失。主要用途包括: 存储排序操作(如OR…

从静态到动态:Web渲染模式的演进和突破

渲染模式有好多种,了解下web的各种渲染模式,对技术选型有很大的参考作用。 一、静态HTML时代 早期(1990 - 1995年)网页开发完全依赖手工编写HTML(HyperText Markup Language)和CSS(层叠样式表…

Flask(六) 数据库操作SQLAlchemy

文章目录 一、准备工作二、最小化可运行示例✅ 补充延迟绑定方式(推荐方式) 三、数据库基本操作(增删改查)1. 插入数据(增)2. 查询数据(查)3. 更新数据(改)4.…

PYTHON从入门到实践7-获取用户输入与while循环

# 【1】获取用户输入 # 【2】python数据类型的转换 input_res input("请输入一个数字\n") if int(input_res) % 10 0:print("你输入的数是10的倍数") else:print("你输入的数不是10的倍数") # 【3】while循环,适合不知道循环多少次…

学习笔记(C++篇)—— Day 8

1.STL简介 STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2.STL的六大组件 先这样,下一部分是string的内容,内容比较多&a…

ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?

B站讲的最好的自动化测试教程,工具框架附项目实战一套速通,零基础完全轻松掌握!自动化测试课程、web/app/接口 实现AntJMeterJenkins接口自动化失败接口邮件通知方案 要实现只发送执行失败的接口信息邮件通知,可以通过以下步骤实…

恶意Python包“psslib“实施拼写错误攻击,可强制关闭Windows系统

Socket威胁研究团队发现一个名为psslib的恶意Python包,该软件包伪装成提供密码安全功能,实则会突然关闭Windows系统。这个由化名umaraq的威胁行为者开发的软件包,是对知名密码哈希工具库passlib的拼写错误仿冒(typosquatting&…

云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )

服务网格灰度与 Kubernetes Ingress 灰度是云原生环境下两种主流的灰度发布方案,它们在架构定位、实现方式和适用场景上存在显著差异。以下从多个维度对比分析,并给出选型建议: 一、核心区别对比 维度服务网格灰度(以 Istio 为例…

科技如何影响我们的生活?

科技已成为我们生活中不可或缺的一部分,彻底改变了我们工作、沟通和生活的方式。从智能手机到智能家居,科技已渗透到我们生活的每个角落。无论是用手机闹钟开启新的一天,通过 Alexa 开关灯光,还是打开 Uber 或 Lyft 打车上班&…