无延时去斗按键实现方法(不好CPU)
这一灵感来源于定时器计数的方法,最后可以实现的效果跟咱们电脑键盘按键的效果一样!我先来介绍下基本原理吧!
采用定时器中断的方法,比如定时器终端我们设置为5ms,我们需要按键按下超过40ms时才算有按键按下,如果按键超过500ms时,我们就确定按键是连续按下的!
那么我就需要一个变量来计数!每次定时器中断时,我们就需要检测下,某个按键是否按下,如果按下,那么我们就把他对应的计数变量加1,如果这个变量等于8(8 = 40ms/5ms)时,我们就给按键的标志位置为1,如果没有按键检测到那个按键没有按下,那么我们就把他对应的按键标志位清零,且他对应的计数变量清零。下面是他的流程图!
下面具体看程序,程序里面有说的很详细,只是我的英语不是怎么样,可能写的不是很通顺,但是我确定,程序肯定是写的令大家满意的!希望大家多多指点!
- /*
- * @for Key Board
- * Usage : First of All ,You Must Add Your Code to Scan Your Board Keys
- * : in Function of "unsigned char GetKeyValue(void)";
- * : Add function "void CheckKey(void)" into your Timer Interrupter Function;
- * : Meanwhile , your should Can modify "TYPECOUNT" to change Count Range;
- * : "KEYNUMBER" is a number of key;
- * : "LIMITCOUNT_VALUE" is to confirm weather there is key click;
- * : "MAXCOUNT_VALUE" is stand for a starting signal to repeat count;
- * Author : Chen Zhenwei
- * E-mail : ieczw@qq.com
- * Date : 2014-04-03
- * PS : My English is Poor,So There Must Be a Great Deal of Fault;
- */
- /*
- * @Get Key Value
- * Depend on Your Board,You Must Edit By yourself;
- * Return Key Value
- * 0 : No Valid Key Value
- * >0 : Valid Key Value
- */
- unsigned char GetKeyValue(void)
- {
- unsigned char KeyValue = 0;
- // To Add your Code to Get KeyValue
- return KeyValue;
- }
- /*
- * Define for Variable Type
- * You can Set The Type of Variable According to Your Requirement;
- */
- #define TYPECOUNT unsigned char // 0 ~ 255
- /*
- * Number of Key's Value
- */
- #define KEYNUMBER 16
- /*
- * Limit Value of Count
- * _ ____ ____________________ __ _
- * ___| |_| |__| |__| |_| |______
- * | | | | | | | | | | | | |
- * 1 2 3 4 5 6 7 8 9 10 11 12 13
- * You Can Set KEYNUMBER 6 ~ 9
- */
- #define LIMITCOUNT_VALUE 20
- /*
- * Model of Keeping Down
- * _ ____ ________________________________________________
- * ___| |_| |__| ....
- * | | | | | | | | | | | | | | | | ....
- * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- */
- #define MAXCOUNT_VALUE 50
- /*
- * Declare a Global Variable for Key Count
- */
- TYPECOUNT KeyCount[KEYNUMBER];
- /*
- * Usage :
- * Get Value : (KeyFilg & (1<<n))
- * 1 : on click
- * 0 : no
- */
- unsigned long KeyFlag;
- typedef void (*FUNC)(void * arg);
- FUNC KeyFunction[KEYNUMBER]={
- // Register for Key Function
- // Key0
- // Key1
- // Add your Key Function
- };
- #define NULL 0x0000
- /*
- * To Check the Key Board
- */
- void CheckKey(void)
- {
- unsigned char ret;
- unsigned char i = 0;
- ret = GetKeyValue();
- for(i=0; i<KEYNUMBER; i++){
- if(i+1 == ret){
- // Count for Key Which is on Clicking
- KeyCount[i] ++;
- }
- else{
- // Clear Key Flag And Count
- KeyCount[i] = 0;
- KeyFlag &= ~(1<<i);
- }
- if(KeyCount[i] == LIMITCOUNT_VALUE){
- // Set Key Flag '1'
- KeyFlag |= (1<<i);
- // Do Your Given Key Function
- KeyFunction[i](NULL);
- }
- if(KeyCount[i] > MAXCOUNT_VALUE){
- KeyCount[i] = 0;
- KeyFlag &= ~(1<<i);
- }
- }
- }
- /*
- * Key Status
- */
- #define KEYDOWN 1L
- #define KEYUP 0L
- /*
- * You Can Use GetKeyStatus(i) to Get The Key Status;
- * And In Here , You Don't Need to Care About to Clear the Key Flag,
- * Because It Will Be Auto to Clear the Key Flag.
- */
- unsigned char GetKeyStatus(unsigned char KeyNumber)
- {
- unsigned long Status;
- // Get Status of KeyNumber
- Status = KeyFlag&(1<<KeyNumber);
- // Clear Key Flag
- KeyFlag &= ~(1<<KeyNumber);
- return (Status ? KEYDOWN : KEYUP);
- }
无延时去斗按键实现方法(不好CPU)的更多相关文章
- 【CC2530强化实训02】普通延时函数实现按键的长按与短按
[CC2530强化实训02]普通延时函数实现按键的长按与短按 [题目要求] 用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来计算按键按下的时间是通用的做法 ...
- 【CC2530强化实训01】普通延时函数实现按键的长按与短按
[CC2530强化实训01]普通延时函数实现按键的长按与短按 [题目要求] 用一个按键实现长按与短按的功能已经是很多嵌入式产品的常用手法.使用定时器的间隔定时来进行按键按下的时间是通用的做法, ...
- ChemDraw Pro绘制无环链结构的两种方法
ChemDraw Pro 14是一款专门针对化学图形绘制而开发制作的编辑软件,是目前工科类常用的绘制化学结构工具,用于快速绘制常用的环结构组成.以下教程讲解ChemDraw Pro绘制无环链结构的两种 ...
- Android适配底部虚拟按键的方法
---恢复内容开始--- 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示 ...
- CMD批处理延时启动的几个方法
批处理延时启动的几个方法 方法一:ping 缺点:时间精度为1秒,不够精确 @echo off @ping 127.0.0.1 -n 6 >nul start gdh.txt 方法二:vbs s ...
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
[源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...
- Repeater为空时显示“暂无数据”,很方便实用方法
Repeater为空时显示“暂无数据”,很方便实用方法 <FooterTemplate> <asp:Label ID="lblEmptyZP" Text=&q ...
- win7下安装Ubuntu后进不去win7的解决方法
win7下安装Ubuntu后进不去win7的解决方法 刚刚给同学在win7下安装了Ubuntu16.04,结果在安装完后竟然无法在电脑重启后,找到win7的进入选项. 在网上找了找,都不行!就差点重装 ...
- js数组和字符串去重复几种方法
js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...
随机推荐
- Python中format_map与format字符串格式化的区别
在Python3中使用format和format_map方法都可以进行字符串格式化,但format是一种所有情况都能使用的格式化方法,format_map仅使用于字符串格式中可变数据参数来源于字典等映 ...
- 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义
一. 引言 在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法.这是因为在Py ...
- 第11.10节 Python正则表达式的非贪婪模式的重复匹配:'*?', '+?',和 '??'
在<第11.9节 Pytho正则表达式的贪婪模式和非贪婪模式>老猿简单介绍了贪婪模式和非贪婪模式,并说明'', '+',和 '?' 修饰符都是 贪婪的:它们在字符串进行尽可能多的匹配.有时 ...
- PyQt学习随笔:Model和View之间的数据互动过程
在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...
- DBeaver连接MySQ报错
遇错情况:第一次使用DBaver连接MySQL遇到以下问题: 报错信息:Public Key Retrieval is not allowed 截图如下: 解决方案步骤: 一.已有连接的情况:F4或者 ...
- C++ 虚函数表与多态 —— 虚函数表的内存布局
C++面试经常会被问的问题就是多态原理.如果对C++面向对象本质理解不是特别好,问到这里就会崩. 下面从基本到原理,详细说说多态的实现:虚函数 & 虚函数表. 1. 多态的本质: 形 ...
- C++异常之七 标准库里的异常类
标准库里的异常类 C++标准提供了一组标准异常类,这些类以基类 Exception 开始,标准程序库抛出的所有异常,都派生于该基类,这些类构成如图所示的异常类的派生继承关系,该基类提供一个成员函数 w ...
- CIBN手机电视8.3.2永久VIP
一款互联网电视的手机客户端.可以观看最新的电影和电视剧,还会为你推荐人气热门电影,让你不会错过每一部精彩的大片,以去除app内的所有可见广告,解锁VIP特权,无需登录直接使用! 下载地址:https: ...
- easyui form提交时验证必填,打开时不显示必填提示
给textbox添加required:true属性后,打开页面时整个表单都是红的,需要将其设置为提交时再验证. 解决方法:通过textbox的novalidate属性来控制是否开启验证 <inp ...
- 「 洛谷 」P4539 [SCOI2006]zh_tree
小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...