此按键程序的实现的功能是单个独立按键的[单击],[长按],[双击],[三击]以及[多击]。本文分为三个部分,

  • 第一个部分是说[单击],[长按]的程序;
  • 第二部分是讲[双击];
  • 第三部分是讲[三击],[N击];

    一、 [单击]、[长按]程序

    1. 简单介绍本按键程序的单击和长按

    首先说一下单击,长按的响应情况,就是按多久算单击或者长按,按下按键马上返回有效键值,还是释放之后返回有效键值等等,下面说下它在什么情况下返回有效的【单击】和【长按】。

    首先看一张时序图:

  • 注:
    T1:是单击的按键消抖时长,这里预设的是30ms,也可以根据需求自行定义;
    T2:是单击时,按键释放的有效时间段,提前或者超过这个时间段释放的按键都再是单击了。提前释放则是无效键值,超过后释放则是长按。
    T3:是长按时长,按键超过此时长,则为长按。这里的预设值是3s,同样可根据需求自行更改。
    【单击】:按键按下超过消抖时长T1(30ms),并且在T2时间段内释放按键,按键一释放,马上返回有效按键值—【单击】。
    注意:单击是释放后,才返回有效按键值,不释放时,是无效按键值。

    【长按】:按键按下的时间超过预设的长按时长T3(3s) ,马上返回有效按键值—【长按】;
    注意:长按是只要按下的时间超过预设的长按时长,马上返回有效键值。但是,如果按键一直按着不释放,则只返回一次有效按键值,不重复返回,直到释放之后,才开始重新读取键值。
    2. 按键程序的架构

    按键程序可以分为四个部分,

    第一部分:判断有无按键按下;
        第二部分:按键是否有效(按键消抖);
        第三部分:确定有效按键的种类(单击还是长按);
        第四部分:等待按键释放。

    3. 按键程序的源代码以及注释
    以下是key.c 的源代码:

     1 //============================ key.c ===================
     2
     3 #define KEY_INPUT           P1.0    // 按键IO
     4
     5 #define KEY_STATE_0         0       // 按键状态
     6 #define KEY_STATE_1         1
     7 #define KEY_STATE_2         2
     8 #define KEY_STATE_3         3
     9
    10 #define LONG_KEY_TIME       300     // LONG_KEY_TIME*10MS = 3S
    11 #define SINGLE_KEY_TIME     3       // SINGLE_KEY_TIME*10MS = 30MS
    12
    13 #define N_KEY    0                  // no click
    14 #define S_KEY    1                  // single click
    15 #define L_KEY    10                 // long press
    16
    17 unsigned char key_driver(void)
    18 {
    19     static unsigned char key_state = 0;         // 按键状态变量
    20     static unsigned int key_time = 0;           // 按键计时变量
    21     unsigned char key_press, key_return;
    22
    23     key_return = N_KEY;                         // 清除 返回按键值
    24
    25     key_press = KEY_INPUT;                      // 读取当前键值
    26
    27     switch (key_state)
    28     {
    29         case KEY_STATE_0:                       // 按键状态0:判断有无按键按下
    30             if (!key_press)                     // 有按键按下
    31             {
    32                 key_time = 0;                   // 清零时间间隔计数
    33                 key_state = KEY_STATE_1;        // 然后进入 按键状态1
    34             }
    35             break;
    36
    37         case KEY_STATE_1:                       // 按键状态1:软件消抖(确定按键是否有效,而不是误触)。按键有效的定义:按键持续按下超过设定的消抖时间。
    38             if (!key_press)
    39             {
    40                 key_time++;                     // 一次10ms
    41                 if(key_time>=SINGLE_KEY_TIME)   // 消抖时间为:SINGLE_KEY_TIME*10ms = 30ms;
    42                 {
    43                     key_state = KEY_STATE_2;    // 如果按键时间超过 消抖时间,即判定为按下的按键有效。按键有效包括两种:单击或者长按,进入 按键状态2, 继续判定到底是那种有效按键
    44                 }
    45             }
    46             else key_state = KEY_STATE_0;       // 如果按键时间没有超过,判定为误触,按键无效,返回 按键状态0,继续等待按键
    47             break;
    48
    49         case KEY_STATE_2:                       // 按键状态2:判定按键有效的种类:是单击,还是长按
    50             if(key_press)                       // 如果按键在 设定的长按时间 内释放,则判定为单击
    51             {
    52                  key_return = S_KEY;            // 返回 有效按键值:单击
    53                  key_state = KEY_STATE_0;       // 返回 按键状态0,继续等待按键
    54             }
    55             else
    56             {
    57                 key_time++;
    58
    59                 if(key_time >= LONG_KEY_TIME)   // 如果按键时间超过 设定的长按时间(LONG_KEY_TIME*10ms=200*10ms=2000ms), 则判定为 长按
    60                 {
    61                     key_return = L_KEY;         // 返回 有效键值值:长按
    62                     key_state = KEY_STATE_3;    // 去状态3,等待按键释放
    63                 }
    64             }
    65             break;
    66
    67       case KEY_STATE_3:                         // 等待按键释放
    68           if (key_press)
    69           {
    70               key_state = KEY_STATE_0;          // 按键释放后,进入 按键状态0 ,进行下一次按键的判定
    71           }
    72           break;
    73
    74         default:                                // 特殊情况:key_state是其他值得情况,清零key_state。这种情况一般出现在 没有初始化key_state,第一次执行这个函数的时候
    75             key_state = KEY_STATE_0;
    76             break;
    77     }
    78
    79     return key_return;                          // 返回 按键值
    80 } 

  • 原文地址:https://blog.csdn.net/pillarpeng/article/details/50963127

转载于:https://www.cnblogs.com/wycBlog/p/10265380.html

(79)【按键】[独立按键] - 1: 单击,双击,三击以及N击相关推荐

  1. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  2. 蓝桥杯单片机学习4——独立按键矩阵按键

    上期学习了数码管的静态显示,这次我们来学习独立按键&矩阵按键 独立按键 原理很简单,当作为独立按键使用时,跳线帽的23接在一起,此时按键如果按下,则按键连接的IO口电平会被拉低,通过捕获IO的 ...

  3. 单片机:独立按键的应用实验

    一. 实验目的: (一) 熟悉单片机 I/O 口的输入控制: (二) 熟悉开发板上单片机 I/O 口与数码管. 独立按键的电路连接: (三) 掌握 keil C 软件的使用: (四) 掌握独立按键的应 ...

  4. 51单片机之按键(独立按键矩阵按键)

    难的东西学不会是因为简单的知识没学好 基础不牢,地动山摇 按键 1.1基础温习 (1)按键的物理结构 (2)单片机引脚有两种状态(I/O)输入[读]或者输出[写] (3)上拉电阻的作用.通过这个电阻把 ...

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

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

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

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

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

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

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

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

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

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

  10. 【按键】[独立按键] - 3:三击 以及 N击

    三. [三击]程序 1.三击介绍 三击判定:在完成第一次[单击]之后,在一定的时间间隔内(本程序使用的是300ms),接着完成第二次[单击],时间间隔重新计时,然后又在这个时间间隔内,完成第三次[单击 ...

最新文章

  1. 磁珠,电感,零欧电阻之间的区别
  2. 菜刀php木马_php网站安全防止各类一句话木马的攻击
  3. ajax alert表单,jQuery AJAX Post alert()不被调用
  4. 关于把字符串整数转换成整数的程序
  5. 2019年信息安全工程师备考经验
  6. Linux中用户的简介与管理
  7. Java锁的种类以及辨析
  8. Java笔记之对象代理实例
  9. 拓端tecdat|R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列
  10. 关于“无法从传输连接中读取数据: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误的解决方法之一
  11. MagicDraw-包图
  12. VS2003添加.BMP资源
  13. 工具 - 屏幕录像专家7.5注册机
  14. 【python】 实现排列组合公式
  15. 【LinuxOS】Ubuntu学习感悟
  16. 06-13最新Xcode7 beta版迅雷离线下载
  17. [译] Kotlin Flow 官方 Guide 指南(2021-06-13)翻译
  18. 用户名片 3:页面实现
  19. windows驱动快速入门
  20. 阿里云服务器发送邮件(一)

热门文章

  1. tomcat到底是干什么用的?白话理解
  2. 基于FPGA的两种SDI视频方案(GTX+外接芯片)
  3. Arcgis专题制图流程
  4. 如何快速实现高并发短文检索
  5. python求最大值函数_python实战: 获取最大值函数
  6. element中table表格和已选数据联动
  7. 俄文输入法_如何在手机上添加俄语输入法
  8. Java | 如何优化垃圾回收机制?
  9. C++定义一个描述员工(Employee)基本情况的类
  10. 吴伯凡-认知方法论-你心之外无世界