1. 程式人生 > >一個通用的、靈活的、可配置的、可移植的按鍵事件處理的實現

一個通用的、靈活的、可配置的、可移植的按鍵事件處理的實現

MCUKeys

1 簡介

MCUKeys是一個簡潔小巧可配置的、靈活的、通用的的按鍵檢測程式,截至到目前為止它可以檢測如下輸入事件:

  1. 按鍵按下
  2. 按鍵擡起
  3. 長按(時間可配置)
  4. 連擊(時間可配置)
  5. 雙擊
  6. 組合按鍵(可以實現以上五種狀態)

同時,所有的事件都支援註冊回撥函式,在事件發生時執行。如果當前系統希望只檢測按鍵按下事件,則可以遮蔽其他所有事件,對於其他按鍵事件亦然。

2 使用方法

  1. 先定義一個變數用於獲取按鍵狀態
e_keys_status key_value = KEY_NONE;
  1. 初始化按鍵,包括硬體IO配置和軟體變數初始化兩部分
keys_init();                 //初始化按鍵
  1. 如果有需要回調函式,則註冊,不需要可跳過,預設不支援回撥函式
    keys[KEY1_ID].short_key_down = led2_on;   //註冊回撥函式
    keys[KEY1_ID].short_key_up = led2_off;
    keys[KEY1_ID].long_key_down = led3_on;
...
  1. 設定一個週期性可呼叫的函式來呼叫按鍵掃描函式
//定時器3中斷服務函式 KEY_TICKS週期中斷一次
void TIM3_IRQHandler(void)
{

    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢位中斷
    {
        key_scan();  //按鍵掃描函式
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中斷標誌位
}
  1. 在主迴圈中可以取出按鍵事件並處理
	//main
    while(1)
    {
        key_value = key_out_fifo();
        if(key_value != KEY_NONE)
        {
            switch(key_value)
            {
            case KEY_1_DOWN:
            {
                //doing something
            }
            break;
            case KEY_1_UP:
            {
                //doing something
            }
            break;
            case KEY_1_LONG:
            {
                //doing something
            }
            break;
            case KEY_1_DOUBLE:
            {
                 //doing something
            }
            default:
            {

            } break;
            }
        }
    }

3 按鍵事件說明

事件 說明
KEY_DOWN 按鍵按下,每次按下都觸發,可選是否上報
KEY_UP 按鍵彈起,每次鬆開都觸發,可選是否上報
KEY_LONG 長按觸發,key.h中的KEY_LONG_TIME配置長按時間,同時每個按鍵可單獨配置長按時間
KEY_REPEAT 按下連發,key.h中的KEY_REPEAT_TIME配置連發時間,同時每個按鍵可單獨配置連發時間
KEY_DOUBLE 雙擊按鍵事件,key.h中的KEY_DOUBLE_MIN/MAX調整雙擊靈敏度

4 快速上手

MCUKeys提供完整的中文註釋。同時,提供如下的例程供大家參考。相信很容易上手。

  1. Lesson1_輪詢實現按鍵檢測
  2. Lesson2_中斷實現按鍵檢測
  3. Lesson3_輪詢Fifo實現按鍵檢測
  4. Lesson4_基於FreeRTOS的按鍵檢測

GitHub原始碼獲取清點這裡,希望給博主star以資鼓勵。