【按鍵你不知道的那些事】簡單幾句話實現按鍵按下下、長按、擡起、單擊、雙擊動作

  閒來沒事整理一下文檔。這一篇我們來講一講按鍵的各種觸發事件。
  下面我給大家簡單介紹一下有哪些按鍵檢測的方式。

方式1 阻塞式檢測按鍵

void  KeyScan(void)
{
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13) == 0)
	{
		HAL_Delay(20);
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13) == 0)
		{
			//按鍵按下執行按鍵按下操作
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13) == 0);//鎖死按鍵
		}
	}
}

這裏我們使用阻塞式按鍵檢測,他大大的佔用了系統的資源,使用了死等延時浪費系統的時間資源。並且在while循環中,如果按鍵按下那麼沒法執行其他的操作,這是最簡單的按鍵檢測,對我們操作實際項目不適用。

方式2 外部中斷方式檢測按鍵

這裏方式二就是採用外部中斷的方式來檢測判斷按鍵按下。相比較方式1,中斷的方式檢測按鍵不佔用的系統時間資源,比第一種方法要好,缺點是要使用系統的外部中斷。萬一硬件的配置IO口緊缺,無法使用外部中斷就不能執行該操作了。

方式3 使用定時器掃描加按鍵方式操作檢測按鍵

話不多說我們先來一段代碼

#define  LONGKEEP_TICK   200 //這裏是長按時間設置根據你的定時器來說如果放在1ms定時器這裏設置時間是 5*200  = 1000ms
uint16_t  Count;
uint16_t  TempKeyData,KeyData ;
uint16_t  KeyReadData ,;
uint16_t  Trg , Release ,Cont ,LongPress_flag ;
uint32_t  KeyHoldTime = 0;
unsigned char xSYS_KeyScan(void)
{
	if(Count++ < 4)//五次進來一次
	{
		return 0;
	}
	Count = 0;
	TempKeyData = 0;
	
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13)== 0)	//按下
	{
		TempKeyData = 0x01;
	}
	
	if(TempKeyData != KeyData)
	{
		KeyData = TempKeyData;
	}
	else
	{
		KeyReadData =TempKeyData;
	}
	
	Trg = KeyReadData & (KeyReadData ^ Cont);
	Release = KeyReadData ^ Trg ^ Cont;
	Cont = KeyReadData;
	KeyHoldTime++;
	
	if(KeyHoldTime >= 0xffff)KeyHoldTime = 0xffff;
	
	
	//掃描處理
	if(Trg & 0x01)//短踩處理
	{

		KeyHoldTime = 0;
		//執行按下操作
	}
	
	if(Cont & 0x01)//長踩處理
	{
		if(KeyHoldTime >= LONGKEEP_TICK  && LongPress_flag == 0)//長按
		{		
			LongPress_flag = 1;
			//執行長按操作
		}

	}
	
	if(Release & 0x01)//擡起處理
	{
		key->LongPress_flag = 0;
		//執行擡起操作
	}
	
	return 0;	
}

上面的代碼給大家講述了按鍵的按下、長按、擡起的過程。而且每個動作在按下過程中只能單獨執行一次,這個函數只需要放到定時器裏面去掃描,不需要外部中斷,不需要延時。不佔系統資源,能夠輕鬆的實現檢測按鍵按下、長按、擡起、單擊、雙擊操作,很實用推薦給大家!
希望大家多多關注我!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章