这一灵感来源于定时器计数的方法,最后可以实现的效果跟咱们电脑键盘按键的效果一样!我先来介绍下基本原理吧!

采用定时器中断的方法,比如定时器终端我们设置为5ms,我们需要按键按下超过40ms时才算有按键按下,如果按键超过500ms时,我们就确定按键是连续按下的!

那么我就需要一个变量来计数!每次定时器中断时,我们就需要检测下,某个按键是否按下,如果按下,那么我们就把他对应的计数变量加1,如果这个变量等于8(8 = 40ms/5ms)时,我们就给按键的标志位置为1,如果没有按键检测到那个按键没有按下,那么我们就把他对应的按键标志位清零,且他对应的计数变量清零。下面是他的流程图!

下面具体看程序,程序里面有说的很详细,只是我的英语不是怎么样,可能写的不是很通顺,但是我确定,程序肯定是写的令大家满意的!希望大家多多指点!

  1. /*
  2. * @for Key Board
  3. * Usage : First of All ,You Must Add Your Code to Scan Your Board Keys
  4. *       : in Function of "unsigned char GetKeyValue(void)";
  5. *       : Add function "void CheckKey(void)" into your Timer Interrupter Function;
  6. *       : Meanwhile , your should Can modify "TYPECOUNT" to change Count Range;
  7. *       : "KEYNUMBER" is a number of key;
  8. *       : "LIMITCOUNT_VALUE" is to confirm weather there is key click;
  9. *       : "MAXCOUNT_VALUE" is stand for a starting signal to repeat count;
  10. * Author : Chen Zhenwei
  11. * E-mail : ieczw@qq.com
  12. * Date : 2014-04-03
  13. * PS : My English is Poor,So There Must Be a Great Deal of Fault;
  14. */
  15. /*
  16. * @Get Key Value
  17. * Depend on Your Board,You Must Edit By yourself;
  18. * Return Key Value
  19. * 0 : No Valid Key Value
  20. * >0 : Valid Key Value
  21. */
  22. unsigned char GetKeyValue(void)
  23. {
  24. unsigned char KeyValue = 0;
  25. // To Add your Code to Get KeyValue
  26. return KeyValue;
  27. }
  28. /*
  29. * Define for Variable Type
  30. * You can Set The Type of Variable According to Your Requirement;
  31. */
  32. #define TYPECOUNT   unsigned char         // 0 ~ 255
  33. /*
  34. * Number of Key's Value
  35. */
  36. #define KEYNUMBER   16
  37. /*
  38. * Limit Value of Count
  39. *     _   ____    ____________________    __   _
  40. * ___| |_|    |__|                    |__|  |_| |______
  41. *  |   |   |   |   |   |   |   |   |   |   |   |   |
  42. *  1   2   3   4   5   6   7   8   9   10  11  12  13
  43. * You Can Set KEYNUMBER 6 ~ 9
  44. */
  45. #define LIMITCOUNT_VALUE    20
  46. /*
  47. * Model of Keeping Down
  48. *     _   ____    ________________________________________________
  49. * ___| |_|    |__|                                                     ....
  50. *  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   ....
  51. *  1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16
  52. */
  53. #define MAXCOUNT_VALUE      50
  54. /*
  55. * Declare a Global Variable for Key Count
  56. */
  57. TYPECOUNT     KeyCount[KEYNUMBER];
  58. /*
  59. * Usage :
  60. * Get Value : (KeyFilg & (1<<n))
  61. *              1 : on click
  62. *              0 : no
  63. */
  64. unsigned long KeyFlag;
  65. typedef void (*FUNC)(void * arg);
  66. FUNC KeyFunction[KEYNUMBER]={
  67. // Register for Key Function
  68. // Key0
  69. // Key1
  70. // Add your Key Function
  71. };
  72. #define NULL    0x0000
  73. /*
  74. * To Check the Key Board
  75. */
  76. void CheckKey(void)
  77. {
  78. unsigned char ret;
  79. unsigned char i = 0;
  80. ret = GetKeyValue();
  81. for(i=0; i<KEYNUMBER; i++){
  82. if(i+1 == ret){
  83. // Count for Key Which is on Clicking
  84. KeyCount[i] ++;
  85. }
  86. else{
  87. // Clear Key Flag And Count
  88. KeyCount[i] = 0;
  89. KeyFlag &= ~(1<<i);
  90. }
  91. if(KeyCount[i] == LIMITCOUNT_VALUE){
  92. // Set Key Flag '1'
  93. KeyFlag |= (1<<i);
  94. // Do Your Given Key Function
  95. KeyFunction[i](NULL);
  96. }
  97. if(KeyCount[i] > MAXCOUNT_VALUE){
  98. KeyCount[i] = 0;
  99. KeyFlag &= ~(1<<i);
  100. }
  101. }
  102. }
  103. /*
  104. * Key Status
  105. */
  106. #define KEYDOWN     1L
  107. #define KEYUP       0L
  108. /*
  109. * You Can Use GetKeyStatus(i) to Get The Key Status;
  110. * And In Here , You Don't Need to Care About to Clear the Key Flag,
  111. * Because It Will Be Auto to Clear the Key Flag.
  112. */
  113. unsigned char GetKeyStatus(unsigned char KeyNumber)
  114. {
  115. unsigned long Status;
  116. // Get Status of KeyNumber
  117. Status = KeyFlag&(1<<KeyNumber);
  118. // Clear Key Flag
  119. KeyFlag &= ~(1<<KeyNumber);
  120. return (Status ? KEYDOWN : KEYUP);
  121. }

无延时去斗按键实现方法(不好CPU)的更多相关文章

  1. 【CC2530强化实训02】普通延时函数实现按键的长按与短按

    [CC2530强化实训02]普通延时函数实现按键的长按与短按 [题目要求]      用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来计算按键按下的时间是通用的做法 ...

  2. 【CC2530强化实训01】普通延时函数实现按键的长按与短按

    [CC2530强化实训01]普通延时函数实现按键的长按与短按 [题目要求]     用一个按键实现长按与短按的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来进行按键按下的时间是通用的做法, ...

  3. ChemDraw Pro绘制无环链结构的两种方法

    ChemDraw Pro 14是一款专门针对化学图形绘制而开发制作的编辑软件,是目前工科类常用的绘制化学结构工具,用于快速绘制常用的环结构组成.以下教程讲解ChemDraw Pro绘制无环链结构的两种 ...

  4. Android适配底部虚拟按键的方法

    ---恢复内容开始--- 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示 ...

  5. CMD批处理延时启动的几个方法

    批处理延时启动的几个方法 方法一:ping 缺点:时间精度为1秒,不够精确 @echo off @ping 127.0.0.1 -n 6 >nul start gdh.txt 方法二:vbs s ...

  6. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  7. Repeater为空时显示“暂无数据”,很方便实用方法

    Repeater为空时显示“暂无数据”,很方便实用方法 <FooterTemplate>   <asp:Label ID="lblEmptyZP" Text=&q ...

  8. win7下安装Ubuntu后进不去win7的解决方法

    win7下安装Ubuntu后进不去win7的解决方法 刚刚给同学在win7下安装了Ubuntu16.04,结果在安装完后竟然无法在电脑重启后,找到win7的进入选项. 在网上找了找,都不行!就差点重装 ...

  9. js数组和字符串去重复几种方法

    js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...

随机推荐

  1. 第15.42节、PyQt输入部件:QFontComboBox、QLineEdit、QTextEdit、QPlainText功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 输入部件量比较多,且功能很丰富,但除了用于编写编辑器.浏览器 ...

  2. 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍

    在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...

  3. PyQt(Python+Qt)学习随笔:QListView的selectionRectVisible属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListView的selectionRectVisible属性用于控制视图中的选择矩形框是否可见, ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中Action的信号

    Action与菜单和工具栏挂接后,只是实现了相关的关联关系,但并不能执行响应操作,真正的响应操作是通过Action的信号与对应槽函数连接实现的. Action提供了4种信号: changed()信号: ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的orientation属性

    在Designer的spacers部件中有2个部件,分别是Horizontal Spacer和Vertical Spacer,这两个部件都有orientation属性,表示Spacer部件的方向. 如 ...

  6. Linux(宝塔)部署.Net Core完整记录

    前言 最近在V站上看到一个外卖推广的小程序,意思大概是类似淘宝联盟那种,别人走自己的链接后,自己可以抽取大概4%-6%的提成.觉得还蛮有意思的,一开始开源的是静态页面写死的,所以我这边用.Net Co ...

  7. 对象存储COS全球加速助力企业出海

    近年来,中国互联网行业迅猛发展,国内庞大的市场孕育出了许多现象级的产品,也锤炼出了非常成熟的产业链.与此同时,很多海外市场还处于萌芽期,存在着巨大的流量红利,越来越多的互联网企业开始加速"出 ...

  8. 单次期望 O(1) 的RMQ

    膜万弘,太强了!!! 刚刚变态的zjjws想要将一个需要 \(RMQ\) 问题的时间和空间都卡成 \(O(n)\) ,就在可怜的蒟蒻 Point_King 一筹莫展之时万弘他出现了,给予了本蒟蒻光明和 ...

  9. 【题解】「CF1373B」01 Game

    这题好水,就是简单的模拟+字符串. \(\sf Translation\) 给定一个 \(01\) 串,如果 \(0\) 出现的次数和 \(1\) 出现的次数的最小值是奇数,输出 DA ,否则输出 N ...

  10. 笔记-[ZJOI2007]仓库建设

    笔记-[ZJOI2007]仓库建设 [ZJOI2007]仓库建设 \(f_i\) 到第 \(i\) 个工厂并且建设了仓库. \[\begin{split} f_i=&\min\{f_j+\su ...