国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

按鍵狀態(tài)機(實現(xiàn)單擊,長按,雙擊)的模塊分享

這篇具有很好參考價值的文章主要介紹了按鍵狀態(tài)機(實現(xiàn)單擊,長按,雙擊)的模塊分享。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、相關(guān)說明

二、分析

三、模塊代碼

三、代碼講解

四、作者的話


一、相關(guān)說明

??????? 1.需要的資源:一個定時器,一個按鍵。

??????? 2.相關(guān)設(shè)置:利用定時器計時中斷,10ms進行一次按鍵掃描。

??????? 3.使用說明:定時器中斷的優(yōu)先級要設(shè)置高一點,相關(guān)的宏定義可以自行定義。

??????? 4.實現(xiàn)功能:區(qū)分單個按鍵的單擊,雙擊,長按。

??????? 5.規(guī)定:雙擊:2次按下的間隔不超過200ms屬于雙擊。

????????????????????? 單擊:第一次按下持續(xù)時間小于1s屬于單擊。

????????????????????? 長按:第一次按下持續(xù)時間不小于1s屬于長按。

??????? (時間長短可自己調(diào)整)

??????? 6.目標(biāo):幫助理解按鍵的狀態(tài)機。

二、分析

??????? 1.時間線分析和狀態(tài)概覽

按鍵雙擊程序,一些簡單的模塊分享,stm32,51單片機,單片機

??????? 2.狀態(tài)分析和編程思路

按鍵雙擊程序,一些簡單的模塊分享,stm32,51單片機,單片機

???????? 說明:一般按鍵有兩種狀態(tài),按下和彈起,這里將按鍵按下的狀態(tài)拆分為兩種狀態(tài),以長按1s的標(biāo)志觸發(fā)為斷點,拆分為按鍵按下到標(biāo)志觸發(fā)狀態(tài)和標(biāo)志觸發(fā)到按鍵彈起的狀態(tài)。而對于單擊和雙擊可直接理解為按下狀態(tài),只是形式上作了拆分。而且按下抖動的狀態(tài)實際編程中沒有編寫,有興趣的小伙伴可以嘗試添加。

那為什么要拆分按鍵按下的狀態(tài)?
定時器會10ms進行實時檢測。
長按標(biāo)志到時會實時清零,如果不拆分狀態(tài)只能等待按鍵彈起進入1狀態(tài),但此時長按標(biāo)志已被清零,系統(tǒng)錯亂,誤判為單擊。
要想長按標(biāo)志不被清零,就不能在按下狀態(tài)動態(tài)清零,所以只能設(shè)計為松手反饋。
而拆分狀態(tài)后可將1s前要做的事和1s后要做的事拆分開,1s到時即可實時反饋。

三、模塊代碼

1.相關(guān)宏

    #define KEY GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)
   
    #define KEY_Up  1         //按鍵彈起
    #define KEY_DownShake  2  //按下抖動
    #define KEY_Down  3       //按鍵按下
    #define KEY_wait  4       //等待狀態(tài)
     
    #define SHORT_KEY 1       //短按反饋
    #define LONG_KEY 2        //長按反饋
    #define DOUBLE_CLICK 3    //雙擊反饋
    
    #define FALSE 0
    #define TRUE 1  

2.函數(shù)主體

/**
  * @brief  KEY_Scan();// 按鍵檢測
  * @note   按鍵檢測,返回單擊,雙擊,長按
  * @param  無
  * @retval 無
  * @author 常州工學(xué)院電子協(xié)會22級團體
	PS:key_return屬于外部全局變量,用于接受反饋信息
  */	
void KEY_Scan(void)
{
	//反饋系統(tǒng)
	static uint8_t  Click_Buf = FALSE;  //第一次彈起標(biāo)志,用與區(qū)分雙擊的第一次按下和第二次按下
	static uint8_t  KEY_flag= FALSE;//標(biāo)志觸發(fā)判斷標(biāo)志位,用于在反饋結(jié)束后統(tǒng)一清零
  	static uint8_t  Click   = FALSE;//單擊判斷標(biāo)志位
	static uint8_t  Long_Press = FALSE; //長按判斷標(biāo)志位
  	static uint8_t  Double_Click  = FALSE;//雙擊判斷標(biāo)志位
	
	//計時系統(tǒng)
	//定時器10ms進入一次函數(shù)
    static uint8_t  Long_Cnt = 100;//長按計時時長1s
    static uint8_t  Twice_Cnt = 20;//雙擊間隔計時時長200ms
	Long_Cnt--;
    Twice_Cnt--;
	
	//狀態(tài)系統(tǒng)
    switch(key_state)
    {
        /*狀態(tài)1:空閑狀態(tài)(單擊)和按鍵彈起后(雙擊)*/
        case KEY_Up:
        {
    	  if(KEY == 0)
		  {
			key_state = KEY_Down;//切換到狀態(tài)3
			Long_Cnt = 100;//長按計時開始
		  }
          else
          {
            //判斷是否為按鍵彈起狀態(tài)
            if(Click_Buf == TRUE)
            {
			  //彈起時間超過200ms,雙擊判定時間失效,且一定不為長按,直接判斷為單擊
              if(Twice_Cnt<=0)
              {
				KEY_flag = TRUE;
                Click = TRUE;
              }
            }
          }
        break;
    }
    
//    /*狀態(tài)2:按下抖動(過渡狀態(tài))*/
//    case KEY_DownShake:
//    {
//      if(KEY == 0)
//        key_state = KEY_Down;//確認(rèn)按下,切換到狀態(tài)3
//      break;
//    } 
    
    /*狀態(tài)3:按鍵按下到長按標(biāo)志觸發(fā)狀態(tài)*/
    case KEY_Down:
    {
      if(KEY == 1)
      {
        key_state = KEY_Up;//切換到狀態(tài)4
        //不是長按操作,則判斷是不是雙擊操作
        if(Long_Press == FALSE)
        {
          //雙擊檢測
          //前面已經(jīng)單擊一次,這次就判斷為雙擊操作
          if(Click_Buf == TRUE)
          {
			KEY_flag = TRUE;
		    Double_Click  = TRUE;
          }
          else
          {
            //這是單擊或雙擊的第一次點擊,標(biāo)志位置1
            Click_Buf = TRUE;
            //雙擊計時器開始計時
			Twice_Cnt = 20;
          } 
        }
      }
      else
      {
        //長按檢測(一直在按下,第一次彈起不會觸發(fā))
        if(Long_Press == FALSE&&Click_Buf == FALSE)
        {
		  //1s時間到就判斷為長按
          if(Long_Cnt<=0)
          {
			key_state = KEY_wait;//切換到狀態(tài)4
			KEY_flag = TRUE;
            Long_Press = TRUE;
          }
        }
      }  
      break;  
    }
    
    /*狀態(tài)4:標(biāo)志觸發(fā)到等待按鍵彈起狀態(tài)*/
    case KEY_wait:
    {
      if(KEY == 1)
        key_state = KEY_Up;//完成一次按鍵動作,切換到狀態(tài)1
      break;
    }
		
    default:
      key_state = KEY_Up;//默認(rèn)情況都切換到狀態(tài)1
      break;
  }
    //標(biāo)志觸發(fā),反饋結(jié)果
    //PS:key_return屬于外部全局變量,用于接受反饋信息
    if(KEY_flag == TRUE)
	{
		//單擊動作
		if(Click == TRUE)
		    key_return = SHORT_KEY;
		//長按動作
		else if(Long_Press == TRUE)
			key_return = LONG_KEY;
		//雙擊動作
		else if(Double_Click == TRUE)
			key_return = DOUBLE_CLICK;
        //按鍵狀態(tài)位清零,為下一次按下準(zhǔn)備
        KEY_flag= FALSE;
        Click_Buf = FALSE;
        Click = FALSE;
        Long_Press = FALSE;
        Double_Click  = FALSE;
    }
}

三、代碼講解

為了使代碼更加清晰,可讀性更強,我將按鍵狀態(tài)機的代碼做了分區(qū),分成了三個系統(tǒng),分別是反饋系統(tǒng),計時系統(tǒng),狀態(tài)系統(tǒng)。

理解要點:梳理好狀態(tài)之間的切換關(guān)系,特別關(guān)注按鍵按下和彈起在狀態(tài)機中是怎么檢測的。

難點:1.Click_Buf的實際意義不是按鍵按下的標(biāo)志,是按鍵彈起的標(biāo)志。

?????????? 2.要區(qū)分狀態(tài)和動作,按下既可以是狀態(tài)也可以是動作,空閑是一種狀態(tài),彈起是一種動作。

在理解代碼的時候可以把單擊,雙擊,長按的路線走幾遍,有助于理解。

四、作者的話

我們團隊在學(xué)習(xí)狀態(tài)機很痛苦,因為比較抽象難以理解,所以我們將學(xué)習(xí)經(jīng)驗分享,希望能對剛學(xué)習(xí)這方面內(nèi)容的人有所幫助。

本人自學(xué)小白,如果有紕漏和錯誤,希望大佬們多多指教,歡迎大家一起交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-721949.html

到了這里,關(guān)于按鍵狀態(tài)機(實現(xiàn)單擊,長按,雙擊)的模塊分享的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Unity知識點詳解】Button點擊事件拓展,單擊、雙擊、長按實現(xiàn)

    Button拓展 ????????今天來聊一下關(guān)于Button的事件拓展,這里只是拿Button來舉例,Unity中其他的UI組件如Toggle、Slider等都也適用。 ? ? ? ? 我們知道在Button中我們可以通過onClick的方式來添加點擊事件,但在游戲開發(fā)過程中我們往往對Button有著更多的功能需求,比如說雙擊、

    2024年04月10日
    瀏覽(90)
  • Unity 單擊、雙擊、長按事件處理

    想要一個工具,能夠同時集成單擊、雙擊、長按的功能 通過IPointerDownHandler, IPointerUpHandler, IPointerClickHandler這三個接口就可以監(jiān)聽點擊狀態(tài),然后再通過不同的點擊狀態(tài)來處理相應(yīng)的事件 由于可能同時存在多個事件,實際開發(fā)過程中會出現(xiàn)多余事件通知,如下: 同時擁有單擊

    2024年02月11日
    瀏覽(94)
  • 用STM32單擊按鍵實現(xiàn)LED閃爍和雙擊按鍵實現(xiàn)LED呼吸燈效果

    在嵌入式系統(tǒng)中,按鍵和LED是最常見的外設(shè)之一。本文將介紹如何使用STM32微控制器實現(xiàn)按鍵的單擊和雙擊檢測,并通過控制LED的閃爍和呼吸燈效果來呈現(xiàn)按鍵的觸發(fā)效果。 第一部分:硬件準(zhǔn)備 準(zhǔn)備一塊STM32開發(fā)板,如STM32F103C8T6。 連接一個按鍵到開發(fā)板上的GPIO引腳,并通過

    2024年02月05日
    瀏覽(33)
  • 【23物聯(lián)網(wǎng)國賽樣題第二套】單片機,CC2530單片機呼吸燈與按鍵控制--單擊雙擊長按、呼吸燈與亮度維持,物聯(lián)網(wǎng)競賽今年歷年國賽樣題真題代碼

    【23物聯(lián)網(wǎng)國賽樣題第二套】單片機,CC2530單片機呼吸燈與按鍵控制--單擊雙擊長按、呼吸燈與亮度維持,物聯(lián)網(wǎng)競賽今年歷年國賽樣題真題代碼

    ZigBee節(jié)點盒通電或重置,節(jié)點盒的LED1、LED2燈都不亮。 長按SW1鍵不松開,LED1燈亮,LED2燈熄滅。 松開SW1鍵,LED1、LED2亮燈都常亮。 雙擊SW1可以控制LED1燈實現(xiàn)呼吸燈效果,LED2燈保持熄滅狀態(tài)。 再次雙擊SW1可以控制LED1維持當(dāng)前亮度不再發(fā)生變化,LED2繼續(xù)保持熄滅狀態(tài)。 將編寫

    2024年02月08日
    瀏覽(62)
  • Unity3D實現(xiàn)UI的單擊、雙擊、拖動狀態(tài)判斷

    Unity3D實現(xiàn)UI的單擊、雙擊、拖動狀態(tài)判斷

    這篇文章就來實現(xiàn)UI的單擊、雙擊、按壓、拖動的不同狀態(tài)判斷。不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。 示例、 判斷單擊和雙擊,主要是判斷點擊的次數(shù)。 UI的點擊事件,需要繼承UI的點擊事件接口,重寫點擊事件即可。 UI點擊事件接口: 3-1-1 所引用的命名空

    2024年01月20日
    瀏覽(95)
  • 「Python|Selenium|場景案例」如何模擬鼠標(biāo)單擊、雙擊、右擊、長按和拖拽等操作?

    「Python|Selenium|場景案例」如何模擬鼠標(biāo)單擊、雙擊、右擊、長按和拖拽等操作?

    本文主要介紹如何在使用selenium進行自動化測試的時候模擬各種鼠標(biāo)操作。 在進行自動化測試的時候,我們可能會需要需要進行鼠標(biāo)操作的場景,比如: 測試右擊,查看是否網(wǎng)頁是否屏蔽了右鍵菜單 面對滑塊式登錄驗證方式,模擬拖拽 模擬前進或后退等鼠標(biāo)擴展操作 ……

    2023年04月08日
    瀏覽(31)
  • 【虛擬仿真】Unity3D中實現(xiàn)UI的單擊、雙擊、按壓、拖動的不同狀態(tài)判斷

    推薦閱讀 CSDN主頁 GitHub開源地址 Unity3D插件分享 簡書地址 我的個人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。 之前寫了一篇在Unity中鼠標(biāo)的單擊、雙擊、拖動的文章:

    2024年02月06日
    瀏覽(25)
  • 微信小程序長按與單擊事件觸發(fā)

    方式一 wxml 片段 js 片段 解析 tap 觸摸事件采用 catch 阻止事件冒泡 1.5.0之后支持 longpress 事件,手指觸摸后,超過350ms再離開,如果指定了事件回調(diào)函數(shù)并觸發(fā)了這個事件,tap事件將不被觸發(fā) 方式二(不推薦) longtap 事件,但在觸發(fā)時會同時觸發(fā)單擊事件,需配合 touchstart 和

    2024年02月12日
    瀏覽(21)
  • 小程序更多的手勢事件(左右滑動、放大縮小、雙擊、長按)

    小程序更多的手勢事件(左右滑動、放大縮小、雙擊、長按)

    微信小程序提供的原生事件有:觸摸開始(bindtouchstart)、移動觸摸點(bindtouchmove)、觸摸結(jié)束(bindtouchend)以及長按事件(bindlongtap)和單擊事件(bindtap)。通過以上原生事件可設(shè)計制作衍生出更多的手勢事件; 文章記錄小程序中組件 “左右滑動、放大縮小、雙擊” 事件

    2024年02月09日
    瀏覽(18)
  • 【FPGA零基礎(chǔ)學(xué)習(xí)之旅#10】按鍵消抖模塊設(shè)計與驗證(一段式狀態(tài)機實現(xiàn))

    【FPGA零基礎(chǔ)學(xué)習(xí)之旅#10】按鍵消抖模塊設(shè)計與驗證(一段式狀態(tài)機實現(xiàn))

    ??歡迎來到FPGA專欄~按鍵消抖模塊設(shè)計與驗證 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏與酒 ?? ? 博客主頁: 小夏與酒的博客 ??該系列 文章專欄: FPGA學(xué)習(xí)之旅 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯誤,希望大家能指正?? ?? 歡迎大家關(guān)注! ?? ?? 模塊設(shè)計: ?? 按鍵消

    2024年02月12日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包