历史上的今天
今天是:2025年06月21日(星期六)
2019年06月21日 | stm32检测按键单击,双击,长按
2019-06-21 来源:eefocus
硬件连接:
按键上拉
外设配置:
外部配置为下降沿中断,定时器中断时间为5ms。定时器中断抢占优先级必须高于外部中断
检测方法:
定义一个时间,在该时间段里检测到一个下降沿,认为是单击;低电平持续时间超过该时间,认为是长按;检测到两个下降沿认为是双击。
代码
#define KEY_PRESS_TIME 800 //检测时间段
uint16_t key_time_cnt = KEY_PRESS_TIME + 5;
bool key_pressed = false; //单击标志
bool key_long_pressed = true; //长按标志
void EXTI0_IRQHandler(void)
{
if(RESET != EXTI_GetITStatus(KEY_EXTI_Line))
{
EXTI_ClearITPendingBit(KEY_EXTI_Line);
if (!key_pressed) //第一次按下按键
{
key_time_cnt = 0;
key_pressed = true;
key_long_pressed = true;
while (!GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN));
//延时函数至关重要,再单击和双击时,在定时器中断里将key_long_pressed置为false
//延时时间不能小于定时器中断时间
delay_ms(5);
if (key_long_pressed && key_pressed)
{
//松手执行长按动作
key_pressed = false;
}
}
else //第二次按下
{
key_pressed = false;
key_long_pressed = true;
key_time_cnt = KEY_PRESS_TIME + 5;
//按下时执行双击动作
while (!GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN));
//松手执行双击动作
}
}
}
void TIM2_IRQHandler(void)
{
if(RESET != TIM_GetITStatus(TIM2, TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (KEY_PRESS_TIME >= key_time_cnt)
{
key_time_cnt += 5;
}
if (key_time_cnt < KEY_PRESS_TIME)
{
//在设置的时间段里检测到松手,表示一定不是长按
if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) && key_pressed)
{
key_long_pressed = false;
}
}
//设置的时间到
else if (KEY_PRESS_TIME == key_time_cnt)
{
if (!key_long_pressed && key_pressed)
{
//执行单击动作
key_pressed = false;
}
if (key_long_pressed && key_pressed)
{
//不等松手,执行长按动作
}
}
}
}
上一篇:stm32之按键实验
下一篇:STM32学习笔记——按键输入
史海拾趣
|
监控系统在各领域中的应用越来越多,在不同环境、不同安装条件和不同施工人员下,由于线路、电气环境的不同,或是在施工中疏忽,容易引发各种不同的干扰。这些干扰就会通过传输线缆进入闭路电视监控系统,造成视频图像质量下降、系统控制失灵、运行 ...… 查看全部问答> |
|
请问LinuxLink是什么东西?是不是包括专门为IXP425定制的linux kernel?就象REDHAT是专门为X86定制的linux kernel一样… 查看全部问答> |
|
$(\'swf_fCr\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://www.tudou.com/v/LvxONqdJFXA/&rpid=93619453&res ...… 查看全部问答> |
|
各位大大您们好: 小弟我的LaunchPad(MSP-EXP430G2)突然不能烧录了,前一分钟正常,在没有更改USB链接、电路、电源、等等的情况下,只改了一些程式,就突然显示一下信息: 【MSP430: Error initializing emulator: Could not find MSP-FET430UIF ...… 查看全部问答> |
|
打算做一个无线温度标签,功能比较简单,FRID+测温即可。FRID打算选择无线射频卡芯片,暂时找了一个国产的,QR2213。MCU当然首先咱们的金刚狼,温度采集现在有两种想法,一个是选测温芯片,另外一个就是用单片机内部的温度传感器,精度在1°左右就 ...… 查看全部问答> |




