(79)【按键】[独立按键] - 1: 单击,双击,三击以及N击
此按键程序的实现的功能是单个独立按键的[单击],[长按],[双击],[三击]以及[多击]。本文分为三个部分,
- 第一个部分是说[单击],[长按]的程序;
- 第二部分是讲[双击];
- 第三部分是讲[三击],[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击相关推荐
- AD按键-矩阵按键-独立按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- 蓝桥杯单片机学习4——独立按键矩阵按键
上期学习了数码管的静态显示,这次我们来学习独立按键&矩阵按键 独立按键 原理很简单,当作为独立按键使用时,跳线帽的23接在一起,此时按键如果按下,则按键连接的IO口电平会被拉低,通过捕获IO的 ...
- 单片机:独立按键的应用实验
一. 实验目的: (一) 熟悉单片机 I/O 口的输入控制: (二) 熟悉开发板上单片机 I/O 口与数码管. 独立按键的电路连接: (三) 掌握 keil C 软件的使用: (四) 掌握独立按键的应 ...
- 51单片机之按键(独立按键矩阵按键)
难的东西学不会是因为简单的知识没学好 基础不牢,地动山摇 按键 1.1基础温习 (1)按键的物理结构 (2)单片机引脚有两种状态(I/O)输入[读]或者输出[写] (3)上拉电阻的作用.通过这个电阻把 ...
- 【按键】[独立按键] - 1: 单击,双击,三击以及N击
此按键程序的实现的功能是单个独立按键的[单击],[长按],[双击],[三击]以及[多击].本文分为三个部分, 第一个部分是说[单击],[长按]的程序: 第二部分是讲[双击]: 第三部分是讲[三击],[ ...
- STM32独立按键实现单击双击长按功能
目录 前言 一.按键功能定义 二.使用步骤 1.按键初始化 2.按键扫描函数(重点) 总结 前言 在使用STM32或其他单片机开发项目时,经常需要用到独立按键进行控制. 通常一个独立按键需要使用一个I ...
- 【独立按键鼠标式的单击与双击】
(1)按键与蜂鸣器的非阻塞驱动 消抖的两种境界:第一种判断两次电平状态,中间加入"固定延时时间",不足之处是"固定时间"靠经验值,软件抗干扰能力也弱了很多,&q ...
- 独立按键之长按、短按、单击、双击
目录 一.长按与短按 二.单击与双击 一.长按与短按 在按键按下的时候,即key_down下降沿开始计时.给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿,即按键松开,则为短按.如果 ...
- 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击
九层妖塔 起于垒土 直接跳转到三行代码 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击 一.基本理论 0.按键的常见名词: ①按键抖动 ②按键稳定闭合时间 1.按键的扫描: 2.按键的消抖 ...
- 【按键】[独立按键] - 3:三击 以及 N击
三. [三击]程序 1.三击介绍 三击判定:在完成第一次[单击]之后,在一定的时间间隔内(本程序使用的是300ms),接着完成第二次[单击],时间间隔重新计时,然后又在这个时间间隔内,完成第三次[单击 ...
最新文章
- 磁珠,电感,零欧电阻之间的区别
- 菜刀php木马_php网站安全防止各类一句话木马的攻击
- ajax alert表单,jQuery AJAX Post alert()不被调用
- 关于把字符串整数转换成整数的程序
- 2019年信息安全工程师备考经验
- Linux中用户的简介与管理
- Java锁的种类以及辨析
- Java笔记之对象代理实例
- 拓端tecdat|R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列
- 关于“无法从传输连接中读取数据: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误的解决方法之一
- MagicDraw-包图
- VS2003添加.BMP资源
- 工具 - 屏幕录像专家7.5注册机
- 【python】 实现排列组合公式
- 【LinuxOS】Ubuntu学习感悟
- 06-13最新Xcode7 beta版迅雷离线下载
- [译] Kotlin Flow 官方 Guide 指南(2021-06-13)翻译
- 用户名片 3:页面实现
- windows驱动快速入门
- 阿里云服务器发送邮件(一)