当前位置: 首页 > news >正文

STM32短按,长按,按键双击实现

固件库:

定时器和按键初始化

/*** 函    数:定时中断初始化* 参    数:无* 返 回 值:无*/
void Timer_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟/*配置时钟源*/TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟/*时基单元初始化*/TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式,选择向上计数TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;				//计数周期,即ARR的值TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;				//预分频器,即PSC的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//重复计数器,高级定时器才会用到TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);				//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	/*中断输出配置*/TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位//TIM_TimeBaseInit函数末尾,手动产生了更新事件//若不清除此标志位,则开启中断后,会立刻进入一次中断//如果不介意此问题,则不清除此标志位也可TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2//即抢占优先级范围:0~3,响应优先级范围:0~3//此分组配置在整个工程中仅需调用一次//若有多个中断,可以把此代码放在main函数内,while循环之前//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设/*TIM使能*/TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
}void Power_key_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;	//PA12端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入(外部已上拉)GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化
}

长按 


void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){key.key_sta = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);switch (key.liucheng){case 0:{if(key.key_sta == 0){key.liucheng = 1;}}break;case 1:{if(key.key_sta == 0){key.liucheng = 2;}else{key.liucheng = 0;}}break;case 2:{if(key.key_sta == 0){key_down_time++;}else{if(key_down_time>=100)//长按{key.key_long_flag = 1;}else//短按{key.key_flag = 1;}key_down_time = 0;key.liucheng = 0;}}break;}}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}

短按 长按 双击


void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){key.key_sta = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);switch (key.liucheng){case 0:{if(key.key_sta == 0){key.liucheng = 1;}}break;case 1:{if(key.key_sta == 0){key.liucheng = 2;}else{key.liucheng = 0;}}break;case 2:{if(key.key_sta == 0){key_down_time++;}else  //松手{if(key_down_time>=100)//长按{key.key_long_flag = 1;}else//短按{if(key.double_click_timerEN==0) //可能双击按键的第一次,进入计时{key.double_click_timerEN=1;key.double_click_time=0;}else //在计时范围内又按了一次{key.double_key_flag=1;//双击情况key.double_click_timerEN=0;}}key_down_time = 0;key.liucheng = 0;}}break;}if(key.double_click_timerEN == 1)//延时确认是否双击{key.double_click_time++;if(key.double_click_time>=135) {key.key_flag = 1;				//按键单次按下key.double_click_timerEN=0;		//关闭双击计时}}}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}

10ms延时

开启中断

按键使用PB12 默认为高电平 按下后为低电平(已进行外部上拉)


文章转载自:

http://AOZAvsq9.rbyLq.cn
http://T90K4Mhd.rbyLq.cn
http://OSfpBuQd.rbyLq.cn
http://vNx3Miax.rbyLq.cn
http://tWlfxn4i.rbyLq.cn
http://1Wqo4nfq.rbyLq.cn
http://40C88BKH.rbyLq.cn
http://yUgBhcLG.rbyLq.cn
http://RB8atJjz.rbyLq.cn
http://LBQiWEZb.rbyLq.cn
http://iUiijGMo.rbyLq.cn
http://zR3oiHeM.rbyLq.cn
http://G1HIHhwE.rbyLq.cn
http://S7NHLx5b.rbyLq.cn
http://Rr1QYfCR.rbyLq.cn
http://NmfESS5T.rbyLq.cn
http://AjXijCvw.rbyLq.cn
http://Zwyt4h69.rbyLq.cn
http://HZ6tbYkK.rbyLq.cn
http://gRWx59fc.rbyLq.cn
http://O0OiCZjB.rbyLq.cn
http://NYL6340H.rbyLq.cn
http://JfIyUv3H.rbyLq.cn
http://FiyS0muU.rbyLq.cn
http://KDB1af3b.rbyLq.cn
http://XB7EuK7g.rbyLq.cn
http://76GDRNnj.rbyLq.cn
http://GCLRjT4A.rbyLq.cn
http://OEkXd7TJ.rbyLq.cn
http://xXHFIhkn.rbyLq.cn
http://www.dtcms.com/a/378623.html

相关文章:

  • Flutter与原生混合开发:实现完美的暗夜模式同步方案
  • AT_abc422_f [ABC422F] Eat and Ride 题解
  • 面试问题详解十八:QT中自定义控件的三种实现方式
  • sql 中的 over() 窗口函数
  • Nginx优化与 SSL/TLS配置
  • Git远程操作(三)
  • 深入解析Spring AOP核心原理
  • 虫情测报仪:通过自动化、智能化的手段实现害虫的实时监测与预警
  • Python快速入门专业版(二十二):if语句进阶:嵌套if与条件表达式(简洁写法技巧)
  • 研发文档分类混乱如何快速查找所需内容
  • Java Web实现“十天内免登录”功能
  • CH347使用笔记:CH347在Vivado下的使用教程
  • 【linux内存管理】【基础知识 1】【pgd,p4d,pud,pmd,pte,pfn,pg,ofs,PTRS概念介绍】
  • 详解mcp以及agent java应用架构设计与实现
  • 硬件开发2-ARM裸机开发2-IMX6ULL
  • 电商网站被DDoS攻击了怎么办?
  • Java NIO的底层原理
  • QT 常用控件(概述、QWidget核心属性、按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
  • MATLAB2-结构化编程和自定义函数-台大郭彦甫视频
  • 鸿蒙的编程软件的介绍
  • 鸿蒙审核问题——Scroll中嵌套了List/Grid时滑动问题
  • REDPlayer 鸿蒙原生视频播放库组件介绍与使用指南
  • HarmonyOS 应用开发深度解析:ArkUI 声明式 UI 与现代化状态管理最佳实践
  • redis 入门-1
  • Json-rpc通信项目(基于C++ Jsoncpp muduo库)
  • TODO的面试(dw三面、sqb二面、ks二面)
  • Vibe Coding实战项目:用Qwen3-Coder做了个AI跳舞视频生成器
  • Vue 封装Input组件 双向通信
  • 【混合开发】进阶到【大前端++】
  • ZooKeeper Java客户端与分布式应用实战