目录

前言

一、按键功能定义

二、使用步骤

1.按键初始化

2.按键扫描函数(重点)

总结


前言

在使用STM32或其他单片机开发项目时,经常需要用到独立按键进行控制。

通常一个独立按键需要使用一个IO口,如果项目需要按键实现多个功能,往往需要使用到多个按键,需要使用到多个IO口。在IO口资源紧张或不希望使用太多按键时。可以使用以下方法实现一个按键单击,双击,长按返回不同键值的功能,从而减少独立按键的使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、按键功能定义

这里我将按键按住3秒视为长按操作,两次按下间隔0.5s视为双击,否则为单击

二、使用步骤

1.按键初始化

初始化部分和正常的独立按键使用一样,可以参考正点原子的代码

代码如下(示例):

这里使用的是上拉模式

//按键初始化
void CtrlKey_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能时钟GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;//KEY0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO口}

2.按键扫描函数(重点)

在key.h中对键值进行宏定义

代码如下(示例):

#define KEY0  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)//读取按键#define KEY0_PRES    1   //单击
#define LONG_PRES   2   //长按
#define DOUBLE_PRES 3   //双击

在key.c中编写扫描函数,进行按键扫描并返回相应键值

代码如下(示例):

//为了代码不那么乱,这里我定义了一个结构体,不想使用结构体的可以直接定义全局变量
typedef struct {u32 u32time1;            //第一次按下后开始计时,主要用于判断长按,放在定时器中自加u32 u32time2;            //第一次松手后开始计时,用于判断双击或单击,放在定时器中自加u8 u8key_flag;           //第一次按下标志u8 u8key_double_flag;    //第二次标志
}Key_Tag;Key_Tag skey;u8 KEY_Scan()
{static u8 press = 0;if(KEY0==0)//按键按下{delay_ms(10);//消抖if(KEY0==0){ if(skey.u8key_flag==0){skey.u8key_flag=1;        //第一次按下,标志位置1。同时计数值归零skey.u32time1=0;}else if(skey.u8key_flag==1){if(!press && skey.u32time1 > 3000)//如果第一次按下且时间超过3S,视为长按{press = 1;return LONG_PRES;//返回长按键值}}}}else if(KEY0==1)//按键松开{if(skey.u8key_flag==1)    //第一次按键松开{skey.u8key_flag=0;if(skey.u32time1>3000)//按下后超过3秒才松开,已经返回了键值,松手后把标志位都归零{press = 0;skey.u32time1 = 0;skey.u32time2 = 0;skey.u8key_flag=0;skey.u8key_double_flag=0;}else if(skey.u8key_double_flag==0){skey.u8key_double_flag=1;    //第一次松开之后标志位置1开始等待第二次按键松开skey.u32time2=0;            }else if(skey.u8key_double_flag==1){if(skey.u32time2<500)            //如果第二次松开时间间隔小于0.5S,视为双击{skey.u8key_double_flag=0;return DOUBLE_PRES;}}}else if(skey.u8key_double_flag==1){if(skey.u32time2>=500)            {skey.u8key_double_flag=0;return KEY0_PRES;//如果第一次松开之后0.5s没有第二次按键操作,视为短按}}}return 0;//没有按键按下返回0
}

3.注意事项

time1和time2两个计时变量要放在定时器中自加,这里就不放出详细代码了。

在main函数中轮询调用按键扫描函数,获得键值之后再根据键值执行相应操作。和平时的按键扫描函数一样用法


总结

这个实现按键单击双击长按的方法比较简单,主要是在按键按下之后记录第一次按下持续时间,若达到我们要的长按标准则视为长按,建议长按时间不小于1秒。第一次按键松手之后记录第二个时间,若在规定间隔时间内有第二次按下并松手则视为双击,若达到规定时间还没第二次按下并松手,则为单击。

小白入行没多久,第一次写博客,可能写得很一般,希望各位大神勿喷。如果有什么错误欢迎指正。

STM32独立按键实现单击双击长按功能相关推荐

  1. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按

    看了一个晚上,结合了马潮老师的书,才搞懂这个程序,确实经典!原文: 题目:多功能按键设计.利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按. (amobbs.com 阿莫电子论坛 ...

  2. Unity触摸屏幕 拖拽物体 旋转物体 放大缩小物体 单击 双击 长按

    Unity触摸屏幕 拖拽物体 旋转物体 放大缩小物体 单击 双击 长按 拖拽物体 using System.Collections; using System.Collections.Generic; ...

  3. 单个按键,实现单击+双击+长按

    按键函数:实现单击.双击.长按 按键按下时长超过1.5S,认为是长按事件. 连续两次按下时间间隔不超过350ms,认为是双击事件. 除以上两条,按键按键都属于单击事件. 废话不多说,直接上代码.如有问 ...

  4. 【51定时器】独立按键-短按与长按

    之前的代码用Delay(xms)延时,是阻塞性延时,程序会卡住20ms,还有while写检测按键松手一般会卡个500ms,这样程序会慢很多. 用定时器写按键就不会出现上面的问题 //定时器0初始化模板 ...

  5. 单片机基础:详解独立按键实现单击、双击、长按

    文章目录 前言 一.明确需求 二.需求的实现过程,采用分层思想去实现(分层思想可参考网上资料去了解) 1.低层按键(I/0)扫描函数,即低层按键设备驱动,只返回无键.短按和长按.具体双击不在此处判断. ...

  6. 【按键】[独立按键] - 1: 单击,双击,三击以及N击

    此按键程序的实现的功能是单个独立按键的[单击],[长按],[双击],[三击]以及[多击].本文分为三个部分, 第一个部分是说[单击],[长按]的程序: 第二部分是讲[双击]: 第三部分是讲[三击],[ ...

  7. 独立按键之长按、短按、单击、双击

    目录 一.长按与短按 二.单击与双击 一.长按与短按 在按键按下的时候,即key_down下降沿开始计时.给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿,即按键松开,则为短按.如果 ...

  8. 【独立按键鼠标式的单击与双击】

    (1)按键与蜂鸣器的非阻塞驱动 消抖的两种境界:第一种判断两次电平状态,中间加入"固定延时时间",不足之处是"固定时间"靠经验值,软件抗干扰能力也弱了很多,&q ...

  9. 独立按键检测短按、长按,松手后响应操作

    背景 有项目使用独立按键检测,短按.长按.根据使用效果,发现松手后,也就是按键弹起后响应操作比较好操作. 记得之前,博主写过一篇关于按键的检测的文章,但是过于复杂了.可能很难懂,这里就简单一点,只处理 ...

最新文章

  1. 美团今年应届生年薪 35w+?为什么互联网大厂校招的薪资一年比一年高?
  2. vue使用webpack创建项目的命令
  3. 7、计算机图形学——图形管线渲染与纹理映射
  4. 利用JavaScript中的原型给对像添加方法
  5. boost::hana::take_front用法的测试程序
  6. linux fastQC 操作命令,linux-ubuntu下fastQC的安裝及使用
  7. Linux下部署MyEclipse开发环境
  8. 将HTML格式的String转化为HTMLElement
  9. nssl1157-简单数学题【约数,换元法】
  10. 倒叙输出 php,php foreach正序倒序输出示例代码
  11. mysql savepoint语法_SAVEPOINT语法错误一例
  12. Multipath多路径冗余全解
  13. (45)Verilog HDL 秒灯电路设计
  14. 互联网架构设计漫谈 (1)-概述
  15. Linux内核深入理解系统调用(1):初始化-入口-处理-退出
  16. 代码有多干净和直观?
  17. 关于简历和面试【整理自知乎】
  18. TimeSeriesChart按月进行统计时坐标对不齐的问题
  19. html如何消除空格字符串,jquery如何去除字符串的空格
  20. Java画十字_用Java绘制对角线

热门文章

  1. 学计算机Java和c语言哪个出路比较好
  2. 传奇客户端文件介绍注解教程,GM必备知识
  3. 论文笔记-对话系统综述
  4. 五险一金,终于懂了!
  5. keepalived实现mycat高可用问题排查;道路坎坷,布满荆棘,定让你大吃一惊!
  6. DDL语言(数据定义语言)
  7. WIN8 与WIN7的64位及32位 分别对Legacy BIOS+MBR和UEFI+GPT两种启动方式和分区架构下的安装可行性分析
  8. python导库快捷指令、快速导库、dlib库
  9. 叽歪网创始人李卓桓:叽歪的微信息模式
  10. 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 5