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

蓝桥杯嵌入式按键长按双击

直接上代码这个代码里面我们简单实现了如果按键按下时间超过0.8秒K1的值增加,短按只增加一次,按键2长按K2值增加,按键3双击K1的值减1,按键4双击K2的值减1

#include "fun.h"
#define long_press_time 800//定义长按时间
#define double_click_time 1000//定义双击时间
u32 pre,cpature_value;
u32 pre1;
u8 lcd_buff[30];
u8 k1=0;
u8 k2=0;
u32 k1_press__start_tick=0;//按键按下开始计时
u32 k2_press__start_tick=0;
u32 k3_press__last_tick=0;
u32 k4_press__last_tick=0;
u8 key_long_flag=0;//长按标志位
u8 key_value=0;
u32 key_tick=0;
u8 key_down,key_up,key_old=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM17)
	{
		cpature_value=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
		TIM17->CNT=0;
		pre=80000000/(80*cpature_value);
	}
	if(htim->Instance==TIM16)
	{
		cpature_value=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
		TIM16->CNT=0;
		pre1=80000000/(80*cpature_value);
	}
}
void LCD_proc(void)
{
	sprintf((char *)lcd_buff,"    fre:%d     ",pre);
	LCD_DisplayStringLine(Line1,lcd_buff);
	sprintf((char *)lcd_buff,"    fre:%d     ",pre1);
	LCD_DisplayStringLine(Line2,lcd_buff);
	sprintf((char *)lcd_buff,"    K1:%d     ",k1);
	LCD_DisplayStringLine(Line3,lcd_buff);
	sprintf((char *)lcd_buff,"    K2:%d     ",k2);
	LCD_DisplayStringLine(Line4,lcd_buff);
}
void key_read(void)
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
		key_value=1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)
	key_value=2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)
	key_value=3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
	key_value=4;
	else
		key_value=0;
	key_down=key_value&(key_value^key_old);
	key_up=~key_value&(key_value^key_old);
	key_old=key_value;
}
void KEY_proc(void)
{
	if(uwTick-key_tick<50)
		return ;
	key_tick=uwTick;
	key_read();
	if(key_down==1)//按键按下
	{
		k1_press__start_tick=uwTick;//开始计时
		key_long_flag=0;//刚开始未达到时间要求
	}
	else if(key_value==1)//按键1按下
	{
		if(uwTick-k1_press__start_tick>=long_press_time)//超过时间判定为长按
		{
			key_long_flag=1;//长按标志位置1
			k1++;
		}
	}
	else if(key_up==1)//按键短按
	{
		k1+=1;
//		if(key_long_flag)
//		{
//			
//			
//		}
//		else 
//		{
//			k1+=1;
//			
//		}
		
	}
	if(key_down==2)
	{
		k2_press__start_tick=uwTick;
		key_long_flag=0;
	}
	else if(key_value==2)
	{
		if(uwTick-k2_press__start_tick>=long_press_time)
		{
			key_long_flag=1;
			k2++;
		}
	}
	if(key_down==3)//按键3按下
	{
		if(uwTick-k3_press__last_tick<=double_click_time)//小于设置时间内如果再次检测到按键按下判定为双击按键
		{
			if(k1>0)
				k1--;
			
		}
		k3_press__last_tick=uwTick;//更新时间为了下一次按键双击判断
		
	}
	if(key_down==4)
	{
		if(uwTick-k4_press__last_tick<=double_click_time)
		{
			if(k2>0)
				k2--;
			
		}
		k4_press__last_tick=uwTick;
		
	}
}

http://www.dtcms.com/a/120798.html

相关文章:

  • 408 计算机网络 知识点记忆(5)
  • Go 微服务框架 | 中间件
  • C++17模板编程与if constexpr深度解析
  • LLM实现模型并行训练:deepspeed 是什么; transformers` 怎么实现模型并行训练吗?
  • 嵌入式Linux驱动——3 总线设备驱动模型
  • C++23新特性详解:迈向更现代化的C++
  • 微服务之间调用外键“翻译”的方法概述
  • 47常用控件_QWidget的toolTip属性
  • 使用Conda创建环境存在问题
  • 力扣448.找到数组中所有消失的元素
  • 从繁琐到高效,2025年AI PPT工具选秒出PPT
  • Java性能调优2025:从JVM到Kubernetes的全链路优化策略
  • SpringWebFlux WebClient:非阻塞HTTP请求客户端
  • 1.认识C语言
  • Helm核心概念与常见操作介绍
  • 设计模式 --- 原型模式
  • 跨省发布抖音作品,IP属地会随之变化吗?
  • C++day9
  • 电阻的额定功率与额定电压详解
  • 【什么是动态链接?这里的动态是什么意思?链接了什么?】
  • 【人工智能】如何通过精准提示工程实现完美的珠宝首饰展示
  • 企业使用Excel开展数据分析限制和建议完整版
  • 基于大模型的非阵发性室性心动过速风险预测与诊疗方案研究报告
  • Android中Jetpack设计理念、核心组件 和 实际价值
  • PGA 简介
  • 单元测试原则之——不要过度模拟
  • 刮板机断链保护装置的运行机制
  • JavaScript高阶函数的定义
  • VFlash 工具使用教程
  • 基于视觉语言模型的机器人实时探索系统!ClipRover:移动机器人零样本视觉语言探索和目标发现