一.介绍

假如我们有30个按键,要实现识别所有按键的组合短按,组合长按,组合连续按,等等,按规则写出来非常麻烦,我们使用宏定义,整型变量按位检测就很方便。

二.按键基本功能

首先需要基本的按键事件输入。
然后通过对按下按键开始计时,后续按下重置计时。循环检测长按事件。
松开按键触发短按判断。
任意时刻松开触发按键后,后续按下会无效,直到所有按键松开。

三.上程序源码:

key.c:

#include "key.h"
void key_init(void){                                    //初始化按键GPIO_InitType GPIO_InitStructure;SysCtrl_PeripheralClockCmd(CLOCK_PERIPH_GPIO, ENABLE);GPIO_InitStructure.GPIO_Pin = KEY_IO_MASK;GPIO_InitStructure.GPIO_Mode = GPIO_Input;GPIO_InitStructure.GPIO_Pull = DISABLE;            GPIO_InitStructure.GPIO_HighPwr = DISABLE;GPIO_Init(&GPIO_InitStructure);
}
static void key_send(uint32_t key){uint8_t * p = (uint8_t *)&key;uint8_t temp[7] = {0};temp[0] = 0xAA;temp[1] = p[0];temp[2] = p[1];temp[3] = p[2];temp[4] = p[3];temp[5] = p[0]+p[1]+p[2]+p[3];temp[6] = 0xAA;ble_trans_data(7,temp); printf("  [key]:%d \r\n",key);
}
static uint32_t key_all = 0,key_now = 0,clean = 0,count = 0,long_cnt = 0;
static uint32_t key_Always = 0,Alcount = 0;
void key_process(void){static uint8_t key[5] = {0};key[0] = !GPIO_ReadBit(GPIO_Pin_8);                    //电源//key[1] = !GPIO_ReadBit(GPIO_Pin_0);                  //上key[1] = !GPIO_ReadBit(GPIO_Pin_6);                 //测试key[2] = !GPIO_ReadBit(GPIO_Pin_1);                    //下key[3] = !GPIO_ReadBit(GPIO_Pin_2);                 //左key[4] = !GPIO_ReadBit(GPIO_Pin_3);                 //右
//=====================================================================按键长短按   key_now = ((key[0]<<yr_key_power)|(key[1]<<yr_key_up)|(key[2]<<yr_key_down)|(key[3]<<yr_key_left)|(key[4]<<yr_key_right));if(key_now != key_all){   if(count++ > delay_t){                             //消抖count = 0;                                 //消抖if(((key_all&key_now)<key_all)&&clean == 0){//短按松开key_send(key_all);                       //短按发送clean = 1;                               //松开清除long_cnt = 0;    }key_all = key_now;                }           }else if(key_all > 0&&clean == 0){                 //长按计时if(long_cnt++ > delay_long){                 //长按触发key_send(key_all|(1<<yr_L));                //长按松开发送clean = 1;                                 //长按松开清除key_Always = key_all;                      //long_cnt = 0;}}if(key_now == key_all)  count = 0;                 //消抖if(key_all == 0)      clean = 0;
//===================================================================长按保持    if(key_Always == key_all&&key_Always > 0){if(Alcount++ > delay_long/10){Alcount = 0;key_send(key_all|(1<<yr_AL));}}else {Alcount = 0;key_Always = 0;}//printf("   [%d %d %d %d %d] [key_all %d,key_now %d,clean %d,long_cnt %d]\r\n   ",key[0],key[1],key[2],key[3],key[4],key_all,key_now,clean,long_cnt);
}

key.h:

#ifndef __KEY_H_
#define __KEY_H_
#include <stdio.h>
#include "SDK_EVAL_Led.h"
#define WEEKUP_SOURCE               (WAKEUP_IO13)
//#define KEY_IO_MASK               (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8)
#define KEY_IO_MASK                 (GPIO_Pin_6|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8) //ps3测试
#define delay_long                  (3*15*400)
#define delay_t                     (400)
/************************* KEY VALUE DEFINE *********************/
#define yr_L           (0)//长按
#define yr_AL          (16)//连续按
#define yr_key_power   (1)//电源
#define yr_key_up      (2)//上
#define yr_key_down    (3)//下
#define yr_key_left    (4)//左
#define yr_key_right   (5)//右void key_init(void);
void key_process(void);
#endif

四.如何使用

使用时自定义出需要的按键名称,然后通过按位组合,解析出来。

#define yr_L            (0)//长按
#define yr_AL          (16)//连续按
#define yr_key_1       (1)//电源
#define yr_key_2       (2)//上
#define yr_key_3       (3)//下
#define yr_key_4       (4)//左
#define yr_key_5       (5)//右
uint8_t key_get_Value(u_int32_t param){switch(param){case (1<<yr_key_1):                              printf("KEY_MENU_S\n");                           return KEY_MENU_S;case (1<<yr_key_2):                             printf("KEY_POWER_S\n");                      return KEY_POWER_S;case (1<<yr_key_3):                                printf("KEY_CAMERA_S\n");                     return KEY_CAMERA_S;case (1<<yr_key_4):                               printf("KEY_OBSERVATION_S\n");                    return KEY_OBSERVATION_S;case (1<<yr_key_5):                              printf("KEY_RANGING_S\n");                        return KEY_RANGING_S;case ((1<<yr_key_1)|(1<<yr_L)):                printf("KEY_MENU_L\n");                           return KEY_MENU_L;case ((1<<yr_key_2)|(1<<yr_L)):               printf("KEY_POWER_L\n");                      return KEY_POWER_L;case ((1<<yr_key_3)|(1<<yr_L)):              printf("KEY_CAMERA_L\n");                     return KEY_CAMERA_L;case ((1<<yr_key_4)|(1<<yr_L)):                 printf("KEY_OBSERVATION_L\n");                    return KEY_OBSERVATION_L;case ((1<<yr_key_5)|(1<<yr_L)):                printf("KEY_RANGING_L\n");                        return KEY_RANGING_L;case ((1<<yr_key_1)|(1<<yr_key_4)|(1<<yr_L)):    printf("KEY_MENU_L_AND_KEY_OBSERVATION_L\n"); return KEY_MENU_L_AND_KEY_OBSERVATION_L;case ((1<<yr_key_3)|(1<<yr_key_4)|(1<<yr_L)):     printf("KEY_CAMERA_L_AND_KEY_OBSERVATION_L\n");   return KEY_CAMERA_L_AND_KEY_OBSERVATION_L;case ((1<<yr_key_1)|(1<<yr_key_5)|(1<<yr_L)):   printf("KEY_MENU_L_AND_KEY_RANGING_L\n");     return KEY_MENU_L_AND_KEY_RANGING_L;case ((1<<yr_key_2)|(1<<yr_AL)):                printf("KEY_POWER_ALWAYS_L\n");                       return KEY_POWER_ALWAYS_L;case ((1<<yr_key_4)|(1<<yr_AL)):              printf("KEY_OBSERVATION_ALWAYS_L\n");         return KEY_OBSERVATION_ALWAYS_L;case ((1<<yr_key_3)|(1<<yr_AL)):                printf("KEY_CAMERA_ALWAYS_L\n");              return KEY_CAMERA_ALWAYS_L;case ((1<<yr_key_5)|(1<<yr_AL)):                 printf("KEY_RANGING_ALWAYS_L\n");             return KEY_RANGING_ALWAYS_L;}return 0;
}

key组合按键,长短按键,连续按键 识别方案相关推荐

  1. Matlab:连续按键、移动鼠标、鼠标点击、鼠标连点、输入字符,10行代码即可。

    Matlab也可以实现按键J灵的一些基本功能,比如:连续按键.移动鼠标.鼠标点击.鼠标连点和输入字符!其中, "连续按键":指间隔一定的时间(如:0.1s)按一下某个按键(如:键盘 ...

  2. python tkinter、PySide2乱炖,自动连续按键程序,不止自动保存

    (源码在结尾 背景: 许多人在编辑一些文件的时候都没有按下保存的习惯,这就导致了许多"事故"的发生,使呕心沥血的成果付之东流,在我身边也发生了许多这样的事情,令我痛心疾首,而我本人 ...

  3. STM32 自动识别单击和连续按键

    程序设计500ms一下为单击按键 500ms以上为连续按键 实验开发板为正点原子mini板,设计思想是,当按键按下是启动定时器计数,抬起按键定时器停止计数,如果在设定的500ms以内提起按键则视为单击 ...

  4. TIM定时器控制按键(按键长短按)

    最近在做的公司给我练手的小项目,是在MCU上做一个管理系统,其中需要用按键的长短按来控制开关机.最初第一个方案是使用延时,可是很快就发现弊端,这样的长按时间很不稳定,经常出差错,所以很快就被我否定了, ...

  5. 乐鑫esp8266学习rtos3.0笔记第9篇:整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  6. STC51单片机38——按键控制舵机连续运动,稳定不抖动

    初次按键控制舵机连续运动,舵机可能会抖动,这十有八九是程序时序有些问题. 仿真: //开发板按钮K3和K4,舵机信号线P27 //程序为12m晶振,开发板为11.0592M #include" ...

  7. 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击

    九层妖塔 起于垒土 直接跳转到三行代码 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击 一.基本理论 0.按键的常见名词:  ①按键抖动  ②按键稳定闭合时间 1.按键的扫描: 2.按键的消抖 ...

  8. 28335学习笔记4——F28335之3*3按键控制(包含按键消抖和按键检测方法介绍)

    1.按键消抖 通常的按键所用开关为机械弹性开关,当机械触点断开. 闭合时, 电压信号如下图所示 由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开.在闭合和断开的瞬间均 ...

  9. FPGA实现按键消抖及短时间按键和长时间按键不同动作

    module key_test2(clk, //时钟信号:50Mhzrst, //按键复位key, //用户按键led //LED0~LED2);//端口定义input clk;input rst;i ...

最新文章

  1. 非著名架构师告诉你,代码该如何写,才能自己写的容易别人看的也不痛苦
  2. IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用
  3. Android ---- Context
  4. 矩阵运算——平移,旋转,缩放
  5. redis笔记_源码_简单动态字符串SDS
  6. 原生态mysql_mysql基础原生sql教程
  7. Mac上显示出.m2文件夹并将IDEA中的Maven修改为阿里云镜像
  8. useradd和adduser的区别
  9. 什么是java cdm_Java-ORM数据库框架CDM介绍
  10. au计算机内录音乐,win10 audition怎么内录_win10 audition如何录制声音
  11. ios textView输入框光标问题
  12. 【数据分析实战】杭州2019年链家在售房源数据分析
  13. php mysql admin_mysql+phpAdmin
  14. Mac电脑使用:Mac电脑如何用自带的Safari浏览器,一键翻译英文网页为中文网页
  15. MySql求第二高薪水
  16. Linux-linux系统函数
  17. 一图理解geos的九交矩阵模型——面面关系
  18. Blinder: Partition-Oblivious Hierarchical Scheduling论文笔记
  19. 双十一最完整记录!阿里、京东全部都有
  20. 【视觉基础篇】12 # 如何使用滤镜函数实现美颜效果?

热门文章

  1. 苹果弃用 3D Touch!
  2. cesium 粒子特效
  3. 交大博士学长:研究生计算机专业的方向选择!
  4. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程
  5. xiuno论坛开发模式怎么调整
  6. 做事的常识 书籍梗概 小仓广
  7. RK61键盘配置方法
  8. 中望3D 2020 图层管理器(图层的设置+移动图层+复制图层)
  9. OpenGL配置glut64位和glut32位,英伟达 安全 下载地址 免费
  10. JS 将手机号中间四位变为****号的四种方式