按键功能拓展--单击、双击、长按等

  • key.c
  • key.h

将无自锁功能的按键通过对其单击,双击,长按等状态,进行分配相应的功能,扩展按键功能,调用相关函数即可。

key.c

#include "firmware.h"
#include "key.h"u8 Key1_Lock_Flag = 0;
u16 Key1_Cnt = 0;//u8 0-255;u16 0-65535
u8 KeyNum = 0;
u8 Key_Short_Flag = 0;
u8 Key1_Cnt2 = 0;
u8 Key1_Times = 0;
u8 Key1_Cnt3 = 0;
u8 Key_Couple_Flag = 0;
u8 Key12_Lock_Flag = 0;
u16 Key12_Cnt = 0;
u8 Key2_Lock_Flag = 0;
u16 Key2_Cnt = 0;按键单击消抖void Key_Scan1(void)
{if(KEY1 == 1)//按键没有按下{Key1_Lock_Flag = 0;//清零自锁标志Key1_Cnt = 0;//清零计数标志}else if(Key1_Lock_Flag == 0){Key1_Cnt ++;//累计按键消抖延时次数if(Key1_Cnt > Key_Delay_Time){Key1_Cnt = 0;//清零计数变量Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 1;//赋键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}
}按键短按与长按void Key_Scan2(void)
{if(KEY1 == 1)//按键没有按下{Key1_Lock_Flag = 0;//清零自锁标志Key1_Cnt = 0;//清零计数标志if(Key_Short_Flag == 1){Key_Short_Flag = 0;KeyNum = 1;//赋短按键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}else if(Key1_Lock_Flag == 0){Key1_Cnt ++;//累计按键消抖延时次数if(Key1_Cnt > Key_Delay_Time){Key_Short_Flag = 1;//大于消抖时间,有可能是长按也有可能是短按}if(Key1_Cnt > Key_Long_Time){Key_Short_Flag = 0;//进入长按,取消短按标志位Key1_Cnt = 0;KeyNum = 2;//赋长按键值编码。Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发}}
}按键短按与连按void Key_Scan3(void)
{if(KEY1 == 1)//按键没有按下{Key1_Lock_Flag = 0;//清零自锁标志Key1_Cnt = 0;//清零计数标志}else if(Key1_Lock_Flag == 0){Key1_Cnt ++;//累计按键消抖延时次数if(Key1_Cnt > Key_Delay_Time){Key1_Cnt = 0;//清零计数变量Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 1;//赋键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}else if(Key1_Cnt < Key_Long_Time)//按键持续按下自锁标志为1,不可进入上述步骤{Key1_Cnt ++;//连按超过一定时限,进入连按}else{Key1_Cnt2 ++;//连击时间间隔计数if(Key1_Cnt2 > Key_Long_Time2)//每超过连击时间间隔{Key1_Cnt2 = 0;//连击时间间隔计数器清零KeyNum = 1;//与单击相同实现连续单击效果}}
}按键单击、双击与连击void Key_Scan4(void)
{if(KEY1 == 1)//按键没有按下{Key1_Lock_Flag = 0;//清零自锁标志Key1_Cnt = 0;//清零计数标志if(Key1_Times > 0){Key1_Cnt3 ++;//当前距离前一次按下间隔时间if(Key1_Cnt3 > Key_Double_Time)//超过双击有效间隔时间{Key1_Cnt3 = 0;Key1_Times = 0;}}}else if(Key1_Lock_Flag == 0){Key1_Cnt ++;//累计按键消抖延时次数if(Key1_Cnt > Key_Delay_Time){Key1_Cnt = 0;//清零计数变量Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发Key1_Times ++;//统计按键按下次数Key1_Cnt3 = 0;if(Key1_Times == 1){KeyNum = 1;//按键单击}else if(Key1_Times == 2){KeyNum = 2;//按键双击}else if(Key1_Times == 3){KeyNum = 3;//按键三击}}}else if(Key1_Cnt < Key_Long_Time)//按键持续按下自锁标志为1,不可进入上述步骤{Key1_Cnt ++;//连按超过一定时限,进入连按}else{Key1_Cnt2 ++;//连击时间间隔计数if(Key1_Cnt2 > Key_Long_Time2)//每超过连击时间间隔{Key1_Cnt2 = 0;//连击时间间隔计数器清零KeyNum = 1;//与单击相同实现连续单击效果}}
}组合按键(不区分先后顺序)void Key_Scan5(void)
{if((KEY1 || KEY2) == 1)//按键没有按下{Key_Couple_Flag = 0;Key12_Lock_Flag = 0;//清零自锁标志Key12_Cnt = 0;//清零计数标志}else if(Key12_Lock_Flag == 0){Key12_Cnt ++;//累计按键消抖延时次数Key_Couple_Flag = 1;//组合按键按下if(Key12_Cnt > Key_Delay_Time){Key12_Cnt = 0;//清零计数变量Key12_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 12;//赋键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}if(KEY1 == 1)//按键没有按下{Key1_Lock_Flag = 0;//清零自锁标志Key1_Cnt = 0;//清零计数标志}else if((Key1_Lock_Flag == 0) && (Key_Couple_Flag == 0)){Key1_Cnt ++;//累计按键消抖延时次数if(Key1_Cnt > Key_Delay_Time){Key1_Cnt = 0;//清零计数变量Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 1;//赋键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}if(KEY2 == 1)//按键没有按下{Key2_Lock_Flag = 0;//清零自锁标志Key2_Cnt = 0;//清零计数标志}else if((Key2_Lock_Flag == 0) && (Key_Couple_Flag == 0)){Key2_Cnt ++;//累计按键消抖延时次数if(Key2_Cnt > Key_Delay_Time){Key2_Cnt = 0;//清零计数变量Key2_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 2;//赋键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}
}组合按键(区分先后顺序)void Key_Scan6(void)
{   if(KEY1 == 1)//按键没有按下{Key1_Lock_Flag = 0;//清零自锁标志Key1_Cnt = 0;//清零计数标志}else if(Key1_Lock_Flag == 0){Key1_Cnt ++;//累计按键消抖延时次数if(Key1_Cnt > Key_Delay_Time){Key1_Cnt = 0;//清零计数变量if(KEY2 == 0){Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 3;//赋键值编码。}else{Key1_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 1;//赋键值编码。}}}if(KEY2 == 1)//按键没有按下{Key2_Lock_Flag = 0;//清零自锁标志Key2_Cnt = 0;//清零计数标志}else if(Key2_Lock_Flag == 0){Key2_Cnt ++;//累计按键消抖延时次数if(Key2_Cnt > Key_Delay_Time){Key2_Cnt = 0;//清零计数变量Key2_Lock_Flag = 1;//自锁标志,防止按键多次触发KeyNum = 2;//赋键值编码。外部函数调用结束需将此变量清零,否则一直认为按下}}
}

key.h

#ifndef __KEY_H
#define __KEY_H#include "firmware.h"  //IO define
#define Key_Delay_Time  100 //按实际调整
#define Key_Long_Time   500 //长按持续时间
#define Key_Long_Time2  500 //长按每次变化间隔时间
#define Key_Double_Time 200 //双击有效间隔时间void Key_Scan1(void)
void Key_Scan2(void)
void Key_Scan3(void)
void Key_Scan4(void);
void Key_Scan5(void);
void Key_Scan6(void);#define KEY1 IN1 //单片机IO
#define KEY2 IN2 //单片机IO
#endif

按键功能拓展--单击、双击、长按、组合按等相关推荐

  1. STM32独立按键实现单击双击长按功能

    目录 前言 一.按键功能定义 二.使用步骤 1.按键初始化 2.按键扫描函数(重点) 总结 前言 在使用STM32或其他单片机开发项目时,经常需要用到独立按键进行控制. 通常一个独立按键需要使用一个I ...

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

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

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

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

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

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

  5. Android 单击+双击+短按+长按 逻辑

    ACTION_DOWN事件 ->mPrivateHandler.sendEmptyMessageDelayed(SWITCH_TO_SHORTPRESS, TAP_TIMEOUT) 发延迟处理的 ...

  6. 【Flutter】Flutter 手势交互 ( 点击事件处理 | 点击 onTap | 双击 | 长按 onLongPress | 点击取消 | 按下 onTapDown | 抬起 onTapUp )

    文章目录 一.Flutter 点击事件处理 二.GestureDetector 常用事件说明 三.完整代码示例 四.相关资源 一.Flutter 点击事件处理 Flutter 点击事件处理的组件是 G ...

  7. Android SubsamplingScaleImageView(subsampling-scale-image-view)单双击长按事件【系列2】

    Android SubsamplingScaleImageView(subsampling-scale-image-view)单双击长按事件[系列2] 附录参考文章1介绍了Android Subsam ...

  8. cocos2d-x 旅程開始--(实现单击与长按)

    小菜鸟一枚,学习cocos2d-x已经有一段时间了,感觉进度非常慢那,CSDN也再次拾了起来.近期自己还在学习做小游戏,跟着前辈做了<忍者打怪物>的小游戏,又学习了瓦片游戏<吃西瓜& ...

  9. (单击)双击直接修改内容的代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

最新文章

  1. 子程序与中断程序的异同_【干货】plc怎样理解中断功能,其作用是什么?
  2. 修改大表字段属性报主键冲突
  3. 中国大学MOOC 计算机组成原理第1章测试
  4. 解决jupyter notebook的kernel error内核启动失败问题
  5. iOS--数据存储NSUserDefaults
  6. js中同名的函数的调用情况
  7. Python3——简单的TCP实例
  8. 记录下Lambda常用的表现形式
  9. Hadoop (HDFS)分布式文件系统基本操作
  10. linux 如何开启shell,linux下开启Shell命令
  11. vim忽略大写和小写查找配置
  12. 在计算机应用中计算机辅助教育的英文,在计算机应用中,“计算机辅助教育”的英文缩写为()...
  13. FireFox下竟然对HTML注释与IE下有不同的解析
  14. 使用IDEA连接linux服务器
  15. vue+bootstrap项目
  16. c++ multiple definition of 问题解决方法
  17. 软件测试周刊(第54期):管他乐观还是悲观,都滚蛋,干就完了。
  18. Linux核心命令汇总(思维导图+实例讲解)
  19. java实现文字转语音功能(仅Windows)
  20. python文件可以执行的环境有哪些呢

热门文章

  1. 关于 TNS-04404 TNS-04414 TNS-04610 的解决办法
  2. RoboGUIDE v2.3.1-ISO 1CD(自控软件,一款使用虚拟机器人控制技术的机器人模拟软件)
  3. win10下虚拟机安装XP系统 后无网卡的解决
  4. 这届云栖大会很摇滚很美“乐队的夏天”也来了科技背后有程序员的吐槽 、产品经理的笑和泪
  5. TKO 1-2基本快速幂的基本操作(熟背)
  6. ALPHA_101因子(01_25)
  7. IIS 超简单部署免费https Let's Encrypt
  8. 网站用色设计:色彩基本知识
  9. Web前端之网页导航----搜导航狐邮箱(float)
  10. [PMP(1)]软件项目管理概述