STM32按键的短按/长按/双击

发布者:bullfish最新更新时间:2019-08-24 来源: eefocus关键字:STM32  按键  短按  长按  双击 手机看文章 扫描二维码
随时随地手机看文章

上一篇文章已经写好了定时器,并且实现了按键长按。


现在狭隘的用一下:


https://mp.weixin.qq.com/s?__biz=MzUyOTM0NDkyMA==&mid=2247484014&idx=1&sn=b07bde8a1d5b15467b2c80dfd7ae3547&chksm=fa633299cd14bb8f8e9334282059930bafabf44dfcf502b0a39b7f30326268f8574acc0b0ccf&mpshare=1&scene=23&srcid=0606fxjOEkyOf9zu21GHV78G#rd


//⑥外部中断 2 服务程序  按键效果!!!

void EXTI2_IRQHandler(void)

{

    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0) //按键 KEY2

    {

        key_fall_flag = 1;//生成按键按下标志

    }

    EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位

}

 

 

 

//中断效果

void TIM3_IRQHandler(void) //TIM3 中断

{

  static u16 keyupCnt = 0;//按键弹起后计数值

  static u16 key_holdon_ms = 0;//按下的时长

  u16 keyUpFlag = TRUE;//按键弹起标志

  if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查 TIM3 更新中断发生与否

    {

TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除 TIM3 更新中断标志

        if(key_fall_flag == 1) //发生按键按下事件(按键中断发生,在按键中断中设置为1)

        {

            if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0) //按键还是按下的

            {

                if(key_holdon_ms <= 2000)

                {

                    key_holdon_ms++;

                }

else if(key_holdon_ms > 2000) //按键按下到2000ms就判断长按时间成立,生成长按标志

                {

                    key_holdon_ms = 0; //清除时间单位

                    short_key_flag = 0; //清短按键标志

                    key_long_down = 1;  //长按键标志置位!!!OK

                    key_fall_flag = 0;  //清按键按下标志

keyUpFlag = FALSE;  //标记按下

keyupCnt = 0;

LED1 = ~LED1;

                }

//距离上次单击时间在100~500ms之间,则认为发生连击事件

if((keyupCnt > 300) && (keyupCnt < 500))

{

keyupCnt = 0;

doubleClick = 1; //标记发生了连击事件!!OK

BEEP = ~BEEP;

}

            }

            else //当时是按下去的,此时已经释放按键了

            {

keyupCnt = 0;

                if(key_holdon_ms > 50) //按下时间大于50ms,生成单击标志

                {

                    key_holdon_ms = 0;

                    short_key_flag = 1; //标记短按标志!!OK

                    key_long_down = 0; //清除长按标志

                    key_fall_flag = 0;

LED0 = ~LED0;

keyupCnt = 0;

                

//距离上次单击时间在100~500ms之间,则认为发生连击事件

if(keyupCnt>100 && keyupCnt<500)

doubleClick = TRUE;

short_key_flag=0;

keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志 

}

                else  //按键持续时间小于50ms,忽略

                {

                    key_holdon_ms = 0;//按键按下时间的位

                    short_key_flag = 0;//短按

                    key_long_down = 0;//长按标志

                    key_fall_flag = 0;//按键按下标志

keyupCnt = 0;

                }

            }

 

 

        }

 

 

        if(keyUpFlag)//单击抬起后,启动计数,计数到500ms

            keyupCnt++;

 

 

        if(keyupCnt > 500)

        {

            keyupCnt = 0;

            keyUpFlag = FALSE;//标记为弹起

        }

 

 

    }

}


结合第一个文章  看看按键的单 双 长 按的代码


https://pan.baidu.com/s/1gg-1zcC9gRY1CY67qOJpfQ

关键字:STM32  按键  短按  长按  双击 引用地址:STM32按键的短按/长按/双击

上一篇:STM32按键长短按:超强移植性,回调函数按键处理机制
下一篇:STM32端口配置

推荐阅读最新更新时间:2024-11-17 05:43

STM32内置参照电压的使用
每个STM32芯片都有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到ADC1的通道17。 根据数据手册中的数据,这个参照电压的典型值是1.20V,最小值是1.16V,最大值是1.24V。这个电压基本不随外部供电电压的变化而变化。 不少人把这个参照电压与ADC的参考电压混淆。ADC的参考电压都是通过Vref+提供的。100脚以上的型号,Vref+引到了片外,引脚名称为Vref+;64脚和小于64脚的型号,Vref+在芯片内部与VCC信号线相连,没有引到片外,这样AD的参考电压就是VCC上的电压。 在ADC的外部参考电压波动,或因为Vref+在芯片内部与VCC相连而VCC变化的情况下,如果对于ADC测量的准确性要求
[单片机]
mpu6050 +STM32 休眠唤醒问题+低功耗
这几天在调STM32+MPU6050实现 低功耗唤醒功 功能描述: 1. 平时没有数据的时候,mcu处于 stop模式下, 2. 利用RTC实现定时唤醒, 3.以上功能中已经实现 mcu低功耗唤醒 及RTC定时唤醒。 下一步要尝试 mpu6050 有数据时唤醒单片机,平时单片机处于低功耗状态 如果有朋友也在做 mpu6050低功耗唤醒单片机的功能希望能够一起交流。 这里附上qq :1812669090 如果 要低功耗 和定时唤醒的代码欢迎和我联系 首先说一下STM32低功耗模式 这张表意思看一下就行,我这里用的是停止模式,理由很简单,任一中断都能唤醒,只不过唤醒后的配置相对待机模式要麻烦一点。
[单片机]
mpu6050 +<font color='red'>STM32</font> 休眠唤醒问题+低功耗
STM32引脚模式GPIOMode_TypeDef
① 浮空输入_IN_FLOATING //串口输入 ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP //置位 ⑦ 复用功能的推挽输出_AF_PP //串口输出 ⑧ 复用功能的开漏输出_AF_OD 推挽输出与开漏输出的区别 推挽输出:可以输出高,低电平,连接数字器件; 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个
[单片机]
回炉重造STM32 CUBEMX之串口通讯问题四
串口通讯+PWM波:STM32F103C8T6通过USART1输入相应的指令控制的TIM3四个通道生成四个占空比不同的频率为50HzPWM波来控制云台。 之前用FT232直连单片机,一切正常返回的指令无乱码正常。 接上数传图传出现问题: 1、连续给出高电平时间持续1.5ms的指令,电机本该静止却会往一个方向慢慢漂移。怀疑每次在发出指令单片机相应指令的过程中会导致PWM波占空比变化。 2、接上数传后返回的指令中含有很多乱码。设备有时会莫名重启或者关闭。怀疑是发送的指令出现了偏差触发了开关机的指令。 3、设备返回的图像黑屏 解决方法: 1、对于重复发出的指令,设置相应的重复处理程序。若指令相同或者相同指令持续3次则跳
[单片机]
解决OpenOCD烧录STM32失败, 无法通过SWD连接的问题
OpenOCD烧录STM32失败的问题 Linux下使用 OpenOCD 烧录 STM32, 出现了 Error: init mode failed (unable to connect to the target) 错误. 如果在代码中, 不小心将 PA13,PA14 的 SWD 功能关闭, 例如使用了下面的代码 rcc_periph_clock_enable(RCC_GPIOA); // Need GPIOA clock gpio_primary_remap( AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF, // Optional AFIO_MAPR_TIM2_REMAP_NO
[单片机]
基于STM32手势控制显示系统的设计
1、项目名称 基于STM32手势控制显示系统的设计; 2、系统框架 本系统以STM32为核心处理器,主要负责实现点阵显示屏的刷新功能,芯片自带的RTC时钟功能,温度的计算与显示功能,红外光电开关的检测功能,与ESP8266物联网WiFi模组和STC8下位机的串口通信功能等。以STC8单片机作为从机系统,主要负责与手势识别模块的串口通信功能,OLED显示功能以及与主机STM32之间的数据传输功能等。 3、功能简介 确保整个系统接线无误后,上电,然后需要手动遮挡红外光电开关超过3秒,实现系统开机;然后进入开机动画,会有一个加载界面,接着会有一条横线从上往下扫屏,然后切换到主界面的显示。主界面显示有时间,日期,温度,天气,整个过
[单片机]
基于<font color='red'>STM32</font>手势控制显示系统的设计
STM32 在16位数据宽度下的地址问题
在项目中,原来使用的是八根数据线,读取数据没有问题,在后来改用十六根地址线并把数据宽度改为十六位之后读出来的数据就很奇怪了,经过仔细分析师由于STM32的内外地址映射造成的,具体参照STM32技术参考手册中文翻译第十版的327页,根据我的理解叙述如下: 块1存储区被划分为4个NOR/PSRAM区,这四个区在内部地址上是连续排列的。但是实际上每个区共用的是同一组地址线与数据线,因此需要有内外的一个地址映射,因此在STM32中实际上有两个地址,一个是在内部访问的地址,另外一个是实际地址线输出的地址。 HADDR 对应的是需要转换到外部存储器的内部AHB地址线,其中HADDR 位用于选择四个存储块之一。 HADDR 包含外部存储器地址。
[单片机]
STM32 芯片架构
把STM32 想像类比成一台电脑。 CPU 通过 总线(Bus) 控制各类外设。 各部分功能如下: CPU:包含运算器,控制器及若干寄存器,是单片机的控制和指挥中心。 ROM (STM32中称为FLASH):用于存放程序和数据,为只读储存器。更改(擦除)和写入程序都较为麻烦, 需要遵守FLASH相关的协议。可以认为是计算机的硬盘。 RAM(STM32中称为SRAM):用于存放运算的中间结果、数据暂存及数据缓冲等。可以随机读入或读出,读写速度快,读写方便;但是断电或复位会丢失数据。可以认为是计算机的内存。 总线矩阵:总线矩阵用于主控总线之间的访问仲裁管理,提高了各部件交流的效率。 寄存器:虽然图里面没有寄存器,但
[单片机]
<font color='red'>STM32</font> 芯片架构
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved