單按鍵長短按狀態機

1 短按以鬆手作爲觸發條件
2 長按以2秒鐘未鬆手作爲觸發條件
3 按鍵按下爲0  鬆開爲1  
4 key_return 0 未按下      1 短按     2 長按

僞代碼如下:
enum key_state
{
      S0=1, S1, S2, S3
};

char key_scan()
{
    static char key_state = 0, key_time = 0;
    static char key_press = 0, key_return = 0;
   
    key_press = readKEY();
    switch(key_state)
    {
    case S0://無按鍵按下
        if(!key_press) 
			key_state	= S1;
        break;
	case S1: //有按鍵按下
		if(!key_press)
		{
			key_state	= S2;
			key_time	= 0;
		}
		else
		{
			key_state	= S0;//消抖
			key_return	= 0;
		}
		break;
	case S2://計時1
		if(key_press)//按鍵鬆開
		{
			key_state	= S0;//短按已鬆開,返回初始狀態
			key_return	= 1;
		}
		else if(++key_time >= 2000)
		{
			key_state	= S3;//計時滿2秒,表示是長按
			key_time	= 0;
			key_return	= 2;
		}
		break;
	case S3://計時2
		if(key_press) //按鍵鬆開
			key_state	= S0;//此時按鍵已經持續了2秒了 等待按鍵鬆開返回初始狀態
		break;
    }

    return key_return;
}

還未測試

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