STM32G431——按键的三行代码(长按、短按、单击、双击)

news/2024/12/2 17:14:11/

按键的三行代码(长按、短按、单击、双击)

  • 按键的三行代码
  • 按键的长按、短按
  • 按键的单击、双击

按键的三行代码

key_value = KEY_Scan(); //读取按键的键值
key_up = ~key_value & (key_old ^ key_value);	//按键的上升沿检测 只在按键抬起的瞬间有效 其他时刻都为零无效
key_down = key_value & (key_old ^ key_value);	//按键的下降沿检测 只在按键按下的瞬间有效 其他时刻都为零无效
key_old = key_value;	//记录上一次按键按下后的键值

按键的长按、短按

  • 实现按键的长按、短按思路很简单,在第一次按键按下的key_down下降沿开始计时,给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿(代表按键松开),则为短按。如果在这个定时时间内没有检测到key_up上升沿,则为长按。
//***按键处理子函数相关变量定义
uint8_t KEY_Time_Count;
uint8_t key_value,key_up,key_down;
static uint8_t key_old;void KEY_Proc(void)
{if(uwTick - uwTick_KEY_Set_Point<50) return;	//减速函数uwTick_KEY_Set_Point=uwTick;	//每50ms执行一次key_value = KEY_Scan();key_up = ~key_value & (key_old ^ key_value);key_down = key_value & (key_old ^ key_value);key_old = key_value;if(key_down)	//当有按键按下时{KEY_Time_Count = 0; 将计时器清零 从零开始计时 此处使用了基础定时器用于计时}if(KEY_Time_Count < 10) //如果计时时间小于1s 短按{switch(key_up) //判断按键是否抬起 选择键值执行短按的相应程序{case 1:ucLed = 0xFF;break;case 2://添加按键功能break;case 3://添加按键功能break;case 4://添加按键功能break;}}else //长按 计时时间超过1s{switch(key_value) //判断按键是否按下 选择按键的键值执行相应功能{case 1:ucLed = 0x00;break;case 2://添加按键功能break;	case 3://添加按键功能break;		case 4://添加按键功能break;	}}//***基础定时器6的更新回调函数配置为100ms更新一次
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){KEY_Time_Count++;	//每100ms计数值加1HAL_TIM_Base_Start_IT(&htim6);}
}

按键的单击、双击

  • 实现按键的单击、双击的思路与长按、短按的区分相似。在第一次按键按下后的上升沿(key_up)开始计时,到第二次按键按下的下降沿(key_down)这段时间,如果这段时间超过了设定的规定的时间则为单击。如果在设定的规定的时间内检测到了下降沿(key_down)则为双击。
//***按键处理子函数相关变量定义
uint8_t key_value,key_up,key_down;
static uint8_t key_old;
uint8_t key_down_num;
__IO uint32_t uwTick_KEY_Pressed_Time_Count;void KEY_Proc(void)
{if(uwTick - uwTick_KEY_Set_Point<50) return;	//减速函数uwTick_KEY_Set_Point=uwTick;	//每50ms扫描一次key_value = KEY_Scan();key_up = ~key_value & (key_old ^ key_value);key_down = key_value & (key_old ^ key_value);key_old = key_value;if(key_up) //当第一次按键按下抬起时 {key_temp = key_up;	//记录按键按下抬起后的键值if(key_down_num == 0){key_down_num = 1; //记录第一次按键已经按下uwTick_KEY_Pressed_Time_Count= uwTick; //开始计时}else	//如果检测到双击后的第二次上升沿 将按键按下次数清理 以便于判断下一次按键的单击-双击key_down_num = 0;}if(key_down_num == 1) //当第一次按键按下并抬起时{if((uwTick - uwTick_KEY_Pressed_Time_Count) >= 300) //当按键按下300ms时间后没有检测到第二次按键按下-单击{switch(key_temp)	//选择是哪一个按键按下 执行程序{case 2:ucLed = 0x80;break;case 1://添加按键功能break;case 3://添加按键功能break;case 4://添加按键功能break;}key_down_num = 0;	//清零 以便于判断下一次按键的单击-双击}else	//按键在300ms内检测到按键按下-双击{switch(key_down) //选择是哪一个按键按下 执行程序{case 2:ucLed = 0x01;break;case 1://添加按键功能break;case 3://添加按键功能break;case 4://添加按键功能break;}}}}

http://www.ppmy.cn/news/307045.html

相关文章

分析STM32G0 SPI外设不能触发RXNE接收标志的原因

今天准备移植STM32F030R8T6的程序到STM32G030C8T6上&#xff0c;程序中用到了硬件SPI外设&#xff0c;因为STM32G0用的HALLL库而不是不是标准库&#xff0c;所以我用STM32Cube MX生成了SPI的LL库代码&#xff0c;但是使能SPI后发现硬件怎么都不能触发RXNE接收标志&#xff0c;生…

为什么JVM不建议超过32G内存

在学习ES发现JVM内存不要超过32G的建议&#xff0c;故查找了一下原因。 java -Xmx32766m -Xms32766m -XX:PrintFlagsFinal 2> /dev/null | grep UseCompressedOops bool UseCompressedOops : true {lp64_product}查…

<STC32G12K128入门第五节>Time定时器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、timer是什么?二、相关寄存器1.2. THx & TLx3.案例总结前言 今天无聊的搞了一下stc32G12k128的timer定时器 一、timer是什么? 这里就是我们使用的开发板上面的timer资源 二、相关寄…

32g服务器做成虚拟,服务器32g内存 tomcat设置多大

服务器32g内存 tomcat设置多大 内容精选 换一换 目的调整系统配置选项,充分发挥系统硬件性能。调整系统配置选项,充分发挥系统硬件性能。方法具体优化项详见表1。OS配置参数参数名称参数含义优化建议配置方法vm.swappinessswap为系统虚拟内存,使用虚拟内存会导致性能下降,应…

STC32G 单片机EEPROM 操作实例

一 STC32G 单片机EEPROM简介 STC32G系列单片机内部集成了大量的EEPROM&#xff0c;特别是STC32G12K128集成多达128K EEPROM。 STC32G内部EEPROM可擦写10万次&#xff0c;分若干扇区&#xff0c;每个扇区512字节。EEPROM的写操作只能将1写为0。要将0写为1&#xff0c;必须擦除…

[STM32爬坑]STM32G431ADC工作不正常:

近期收到了一块STM32G4系列的开发板&#xff0c;作为试用开发板&#xff0c;尝试使用G4做电源类项目&#xff0c;在使用G4系列开发板的时候&#xff0c;碰到了ADC工作不正常的情况&#xff0c;具体情况如下所示&#xff1a; 由于项目需要&#xff0c;主频限定在20Mhz&#xff0…

STM32G0开发笔记-Platformio+libopencm3-按键和外部中断

【原文】https://makerinchina.cn/article_12434df0dc1e.html title: STM32G0开发笔记-Platformiolibopencm3-按键和外部中断 tags: STM32MCUSTM32G070libopencm3MonkeyPiexti categories: STM32 date: 2022-9-8 09:33:05 使用Platformio平台的libopencm3开发框架来开发STM32…

STM32G4系列MCU学习笔记:按键模块

第一次以写博客的方式记录自己在嵌入式学习过程中的学习经历和踩的那些坑~ Day1 那么开始叭&#xff01; STM32G4系列MCU学习笔记&#xff1a;按键模块 前言一、硬件操作1. 原理图2. 硬件分析3. 初始化代码 二、按键模块的驱动层实现1. 硬件框图2. 按键驱动层代码实现3. 计时操…