今天,还是一个问题,在QQ群(300384358)里有小伙伴一直在问一个问题,如上图。一个按键控制电机的转动,按键按下后,电机转动,按键释放,电机停止,再加一个按键按下时长的检测,当按下超过5秒后,电机也得停止。也就说每次按下按键后电机转动的时间不得超过5秒,就算按键按下时时长超过5秒。

问题其实很简单,才开始的小伙伴就是没想法,其他小伙伴出谋划策后还是没解决问题,今天我们就来慢慢叨叨。

这个问题的难点一是在按键按下5秒的识别,小伙伴说了不要求精确的5秒,大概是5秒就可以了。难点二是按键释放的检测,好多小伙伴想不到办法,还是用检测按键按下的if语句,效果不佳,小代在这呢推荐大家用while循环的方式去实现,具体怎么实现呢?

往下看

直接上代码

按键识别还是采用大家最能接受的二次检测加延时的方式,便于好理解。小代说的while循环检测按键释放,其实 就是第23行,循环结束标志是按键的状态(0或1)再做“非”运算。解释一下,从上面我们的二次检测加延时的方式能看出,按键按下去后,状态值是0,那我们再做一个“非”运算后就变成了1,相反,按键没按下的时候,“非”运算后是0,当while语句的条件变为0了,自然循环就结束了,这里说的按键没按下,其实也可以说是按键从按下到释放的这个过程。我们来捋一捋这段代码的运行,首先到了while(!KEY){}这个循环,就说明按键已经按下了,此时有两种情况,一种是最简单的,按下时间没到5秒钟,那按键释放后直接停止电机转动就好,第二种情况是按键按下时长大于等于5秒钟,这时需要在按下时长到5秒的时候,关闭电机。上面我们分析过了,按键按下以后,while(!KEY){}循环继续执行,只要按键释放,自动跳出此循环,这样一来,我就只需要在这个while循环里去检测时间有没有到达5秒钟,时间精确度又不要求太高,那我们完全可以采用简单的记录次数来实现时间的计算,在以上代码中,我假设while循环2000次的时间是5秒钟,while循环一次,对计次变量加1,完了再去检测有没有大于等于2000了,当大于等于2000了,就说明按下时间大于等于5秒钟了,此时我们需要关闭电机。当出现第一种情况,就是按下时长小于5秒钟时间,这时直接退出while循环,在循环后面紧跟着关闭电机,再把按下计次变量清零,准备下一次的按键记录。这样一来就实现对时间的记录,分情况控制。分析问题时我们做了2种情况的分析,写代码时,其实我们只是对按键释放做了识别,又在按键释放之前,做了计次的处理。这样的按键释放检测方式可以用在其他的地方比如我们的按键调整时钟时间,计算器等等。这样的检测方式也是有弊端的,第一,我们在做按键释放时候,只做了按键的检测,如果有其他实时性要求高的代码段,需要放到这里的while循环中去,比如数码管显示的动态扫描。第二,循环计次的变量,这里我定义成了uint型,最大范围是65535,当记录次数大于这个值的时候,代码就有问题了,当我们长时间的按着按键不释放,比如按着1分钟。要解决这个问题,需要我们此时好一个最长按键时间,比如10秒,只要大于我们要求的时间就好,当到记录次数大于这个值后将不再加1运算。好了,今天的问题就叨叨到这里,希望我们都有所收获。

·END·

单片机技术宅

以最简单的方式服务初学者

微信号:单片机技术宅

textview 结束后释放_等待按键释放,你的代码如何写?相关推荐

  1. java 线程释放_如何手动释放一个java线程占用的资源

    我做一个聊天软件我双击一个好友头像时执行一个线程弹出一个窗口线程里run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用我找到了地方是上一个窗口弹... 我做一个聊天软件 ...

  2. qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...

    关注"职场沉浮宝典",每天get一个职场小技巧 面试结束后,在等待最终结果的过程中,我们常常会惴惴不安,喜欢在脑海里回放全部面试细节,多角度去判断自己通过面试的可能性.毕竟,面试就 ...

  3. c++多线程结束后需要释放_缓刑结束后是否需要继续坐牢?

    刑事案件的刑罚结果分为两种:主刑.附加刑:而主刑的种类包括死刑.徒刑.管制刑.附加刑种类包括罚金.没收财产.剥夺政治权力.那么什么情况下可以判处缓刑呢? 从刑种上,只有主刑中的徒刑可以判处缓刑,而徒刑 ...

  4. linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?

    当一个进程退出后,不管是正常退出或者是异常退出,操作系统都会释放这个进程的资源.包括这个进程分配的内存,打开的文件等等. 内存泄露的前提是进程一直在运行:进程一旦退出,所占的整个虚拟内存都被销毁,所有 ...

  5. 窗口结束后资源释放不掉问题解决办法

    .net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应该退出了整个应用程序. 但事实上有时候并不是这样的,关闭窗口,只是停止了当前窗口的消息循环. 系统主窗口,实质上是Ma ...

  6. 错误调试:Ubuntu-Tensorflow ,程序手动结束后,GPU的显存没有被释放

    如题:Ubuntu-Tensorflow ,程序被手动强行结束后(win+c),程序所占用的GPU的显存没有被释放掉,影响下次运行,会出现以下错误: failed to allocate 4.75G ...

  7. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  8. string 释放_由String,String Builder,String Buffer 引起的面试惨案

    前言 String,StringBuilder,StringBuffer的区别是啥?这个面试题估计每个JAVA都应该碰到过吧.依稀记得第一次面试的时候,面试官问我这个问题时,心想着能有啥区别不都是拼接 ...

  9. 【按键】短按,长按,按键释放,三种模式的按键扫描程序(软件消抖动)

    先来说一下这三种模式的意思: 1. 短按模式:单击按键时,返回一次有效按键值:长按时也只返回一次有效按键值.这样可以有效地排除因不小心长按带来的返回多次有效按键,进而执行多次按键处理程序. 2. 长按 ...

最新文章

  1. CVS 快速入门指南
  2. 设计模式之_Strategy_06
  3. 从0到1搞一波dubbo
  4. 图片数字型的九九乘法表
  5. html批量导入excel表格,html 导入excel表格数据格式-如何将网页中的表格快速复制到EXCEL中...
  6. 017-Centos7.6+CDH 6.2 安装和使用
  7. java如何阻塞父窗体,java图形设计,窗口阻塞的问题。
  8. 记录一下ListItem类的常用的方法
  9. opencv中图像伪彩色处理(C++ / Python)
  10. 在线正则表达式大全测试
  11. pythonrsv分割_JavaScript是如何工作: 深入探索 websocket 和HTTP/2与SSE +如何选择正确的路径!...
  12. 拆掉思维里的墙:亲身经历后才能明白?
  13. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
  14. ArcGis将2000国家大地坐标系转WGS84
  15. cesium实现运动模型的相机上帝视角跟随
  16. word使用:默认粘贴方式的更改
  17. golang实现稀疏数组(Sparse array)
  18. Android客户端——寒假实习面经-实习初体验
  19. 三人表决器逻辑表达式与非_前端进阶必须知道的正则表达式知识
  20. 对话销售易史彦泽:SCRM要颠覆传统CRM?

热门文章

  1. web desktop在线演示
  2. C#表格文字多收缩样式
  3. 将单词的首字母改为大写
  4. div下图片自适应解决方法
  5. 【Q】【poj 1144】【poj 1523】
  6. ubuntu镜像源列表
  7. 关于GPS 车辆定位导航中的投影变换
  8. vue-day03-vue组件化开发
  9. 【计算机网络复习 物理层】2.1.2 数据通信基础知识
  10. 金叉成功率_一个非常强烈的买卖信号:三金叉见顶,三死叉见底,短短10字,但是成功率却远超“金叉买,死叉卖”...