新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機檢測按鍵短擊,連擊c程序

        單片機檢測按鍵短擊,連擊c程序

        作者: 時間:2012-08-25 來源:網絡 收藏
        /****************************************///文 件 名:key.c//功    能:短擊//調用方法:unsigned char keyValue = ReadKey();//說    明:該程序不適用于陣列鍵盤.//        該程序不需要使用定時器.// 調用處要加入switch語句來判斷相應按鍵按下并執行相應動作.// 如需要在按鍵松開后執行動作,則調用函數需要定義一個bit標志位,
        在default語句里判斷標志位狀態.// KEY_WOBBLE_TIME 指程序程序執行次數.實際應用中要根據程序的長短來調整成合適的數值.//                   //備注:程序思路是當按鍵被按下時開始計算程序的執行次數,如小于KEY_WOBBLE_TIME,
        則認為按鍵沒有被按下.// 引用自http://www.rupeng.com/forum/thread-12239-1-1.html,略做更改. // KEIL編譯時會提示WARNING C291: not every exit path returns a value.
        不影響使用.// 如有朋友發現問題所在請聯系我.                  /*********************************************************/#include reg52.h>#define KEY_IO P1             //按鍵所連的IO口#define NO_KEY_VALUE 0xf      //當按鍵沒有被按下時IO口的值#define KEY_WOBBLE_TIME 150   //去抖動時間(待定)#define KEY_OVER_TIME 500     //等待進入時間(待定),該常數要比正常 //按鍵時間要長,防止非目的性進入模式#define KEY_QUICK_TIME 200   //等待按鍵抬起的連擊時間(待定)typedef unsigned char uchar;typedef unsigned int uint;uchar  ReadKey(){                            //判斷哪個鍵被按下static uchar lastKey = NO_KEY_VALUE ;static uint  keyCount = 0;static uint  keyOverTime = KEY_OVER_TIME;uchar  keyTemp = NO_KEY_VALUE ;keyTemp = KEY_IO  NO_KEY_VALUE ;        //讀取鍵值if(keyTemp == NO_KEY_VALUE ){           //無按鍵按下時keyCount = 0;keyOverTime = KEY_OVER_TIME;return NO_KEY_VALUE ;}else{                                 //有按鍵按下時if(keyTemp==lastKey){if(++keyCount == KEY_WOBBLE_TIME){ //不是第1次按下判斷抖動是否結束return keyTemp;               //去抖結束,返回鍵值}else{if(keyCount>keyOverTime){keyCount = 0;keyOverTime = KEY_QUICK_TIME;}return NO_KEY_VALUE ;}}else{         //是第1次按下則保存鍵值,下次執行此函數時與讀到的鍵值作比較lastKey = keyTemp ;    //保存第1次讀到的鍵值keyCount = 0;          //延時計數器清零keyOverTime = KEY_OVER_TIME ;return NO_KEY_VALUE ;}}}/////////////////////////////////////////////////////////以上程序例子我用三個按鍵連在P1^0,P1^1,P1^2,使用中根據實際需要更改KEY_IO P1 , NO_KEY_VALUE ,KEY_WOBBLE_TIME , KEY_OVER_TIME 500,#define KEY_QUICK_TIME 200 .如只需要判斷單擊,把判斷連擊的代碼刪除即可.拋磚引玉^^


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 庆城县| 苍山县| 洞头县| 阿鲁科尔沁旗| 松溪县| 灵武市| 抚州市| 南充市| 呈贡县| 西乡县| 桑日县| 花垣县| 临沧市| 定西市| 肥乡县| 澎湖县| 双流县| 旌德县| 迁安市| 色达县| 额尔古纳市| 秀山| 保山市| 桦川县| 蒙自县| 阜平县| 黄冈市| 洛隆县| 海宁市| 普宁市| 景泰县| 辽阳市| 璧山县| 凭祥市| 琼海市| 八宿县| 思茅市| 巨野县| 长寿区| 嘉荫县| 商都县|