1. 程式人生 > >無延時去抖按鍵實現方法(不耗CPU)

無延時去抖按鍵實現方法(不耗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 : 
[email protected]
* 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); }

轉載宣告:http://blog.csdn.net/ieczw/article/details/22926523

相關推薦

按鍵實現方法CPU

這一靈感來源於定時器計數的方法,最後可以實現的效果跟咱們電腦鍵盤按鍵的效果一樣!我先來介紹下基本原理吧! 採用定時器中斷的方法,比如定時器終端我們設定為5ms,我們需要按鍵按下超過40ms時才算有按鍵按下,如果按鍵超過500ms時,我們就確定按鍵是連續按下的! 那麼我就需要

初夏小談:斐波那契三種實現方法C語言版第三種相信你沒見過

斐波那契數列(Fibonaccisequnce),又稱黃金分割數列。研究斐波那契數列有相當重要的價值,例在現代物理、準晶體結構、化學等領域都有直接的應用。因此研究斐波那契數列也是很有必要的。 今天初夏將為大家帶來計算斐波那契數列第n位的三種方法 第一種利用遞迴的方法計算,程式碼相當簡單,但其

PCB 板邊倒圓角的實現方法基本演算法一

當PCB外形是直角時,通常工程製作外形(鑼帶)時,會將直角或尖角的地方倒成圓角,主要是為了防止板邊容易劃傷板且容易扎傷人 所以當客戶沒有特殊要求時,PCB外形是直角一般會預設倒角0.5mm圓角(如下圖所示)  一.PCB板邊倒圓角點分析    原PCB外形  

SQL Server2014安裝完整的解決方法唯一吧

sta style str ron center 刪除 安裝 p s tro 問題: 由於之前安裝過SQL Server2005,之後卸掉了。應該是卸載不幹凈導致SQL Server2014安裝失敗 解決方案: 在控制面板中,把SQL Server相關程序都卸載了,如果卸載

Android通過Chrome Inspect調試WebView的H5 App出現空白頁面的解決方法需要FQ

為什麽 5.1 什麽 方法 下載 進行 htm ron 2.0 調試基於WebView的Hybrid App最舒服的工具當然是Chrome自帶的開發者工具,其中有我們熟悉的Dom樹調試,JS調試,Network監視等等功能。 Google提供的調試Android上WebV

window + office 啟用方法提供下載

下載KMSTools工具,裡面集成了許多啟用方法。 WINDOWS KMS啟用方式 比較簡單,隨便點一個KMSTools帶有KMS字樣的工具就可以了,但是KMS啟用方式有效期為180天,到期需要繼續啟用。 數字永久啟用 開啟KMSTools中的PIDKey Lite工具,這個工具是用來方便整理Lic

使用JQ、BootStrap,踩過的坑定期更新

(此文用於記錄程式設計過程過程中,遇到的那些令人頭皮發麻的坑,以及它們的解決方法) 一、使用bootstrap-select、JQ   日前,要做一個需求,有一個輸入框,可以multiple輸入,輸入的東西還要到資料庫判斷,其是否存在?後臺還要根據這些資訊一條一條查詢別的表資料,我想這個邏輯

記錄使用Vue相關API開發專案遇到的問題難點整理定時更新

本文為整理記錄本人從17年初開始上手使用Vue以後,針對專案中業務需求所遇到到的各種問題及難點的解決方法整理?。 1、keep-alive元件快取: <!--這裡是需要快取的--> <keep-alive> <router-v

把數字倒序的幾種方法定時更新c++

方法一:(最初級) 【問題描述】 把一個固定的5位數倒序。 【輸入形式】 從鍵盤輸入一個5位數。 【輸出形式】 倒序後的5位數。 【樣例輸入】 12345 【樣例輸出】 54321 解題思路: 題目已經說明是固定的5位數了,就把每位分解輸出就可以。 解題程式碼:

PHP常用方法定時更新

1、解決跨域問題 header('Access-Control-Allow-Origin:*');    //跨域 2、函式 array_column()的使用 $array = [ ['id'=>'99', 'name'=>'九十九']

proxy 在centos7上的使用方法 定期更新

yum:編輯/etc/yum.conf追加proxy=socks5://127.0.0.1:1080或者proxy=http://127.0.0.1:8118p.s. 當proxy為http型別時候,yum下載repo檔案時候dns解析預設走代理(即resolv.conf檔案

基於PCDN技術的直播方案

算法摘要: 2018亞太CDN峰會在北京隆重召開,在4月12日上午的運營商論壇中,阿裏雲邊緣計算團隊高級技術專家張士波進行了《基於PCDN技術的無延時直播方案》的主題演講。本文為演講內容。當大家談到直播,一般很驚訝於直播近幾年來發展的規模,尤其是2016到2017年直播用戶增長速度達到了22.6%,用戶的總體

重新命名程式日誌--批處理啟動的幾個方法

@echo off taskkill /f /im "3CSyslog.EXE" choice /t 1 /d y /n >nul cd E:\PIX_LOG del syslog.log333 choice /t 1 /d y /n >nul ren syslog.log222

重命名程序日誌--批處理啟動的幾個方法

判斷 echo 排列 sta 提示信息 文件中 創建 rec 警告 @echo off taskkill /f /im "3CSyslog.EXE" choice /t 1 /d y /n >nul cd E:\PIX_LOG del syslo

Java 常見的幾種方法

1、 用Thread就不會iu無法終止 new Thread(new Runnable() { public void run() { while (true) { test(

Android執行的四種方法

一、開啟新執行緒 new Thread(new Runnable(){          publicvoid run(){              Thread.sleep(XXXX);              handler.sendMessage(); 

Android常用操作的兩種方法

今天專案中增加一個延遲2S操作的功能,所以想起了曾經用過的兩種方法--簡單的定時器 第一種,用Timer TimerTask task = new TimerTask() { @Override public void run() { // 你要做的操

C++ 程式處理的幾種方法

(—)使用_sleep()函式  例如:_sleep(200);//延時200毫秒 (二)使用delay(int time)函式 (需要自己實現,編譯器裡面沒有) /// @brief 程式延時

IOS開發之執行的幾種方法

1.最直接的方法performSelector:withObject:afterDelay: 這種方法的缺點:每次要為延時寫一個方法 2.使用類別,用BOLCK執行 [程式碼]c#/cpp/oc程式碼: 01 @implementation NSObje

筆記118--Android執行的四種方法

轉自:http://jingyan.baidu.com/article/636f38bb091ebbd6b8461029.html 一、開啟新執行緒 new Thread(new Runnable(){ public void run(){