91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

按鍵操作的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

CHANBAEK ? 來(lái)源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-08 10:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

按鍵在我們的項(xiàng)目中是經(jīng)常使用到的組件。一般來(lái)說(shuō),我們都是在用到按鍵時(shí)直接針對(duì)編碼,但這樣每次都做很多重復(fù)性的工作。所以在這里我們考慮做一般性抽象得到一個(gè)可應(yīng)用于按鍵操作的通用性驅(qū)動(dòng)程序。

1、功能概述

按鍵操作在我們的產(chǎn)品種經(jīng)常用到,一般都是在特定的應(yīng)用環(huán)境中直接有針對(duì)性的操作。但這些按鍵的操作往往有很多的共性,這就為代碼復(fù)用提供了可能。

1.1、按鍵的定義

在開(kāi)始考慮按鍵操作之前,我們先來(lái)分析一下究竟什么是按鍵。按鍵一般來(lái)講就是用于信號(hào)輸入的按鈕,通過(guò)響應(yīng)它的操作我們可以實(shí)現(xiàn)想要的功能。但我們這里所說(shuō)的按鍵不僅包括普通的單體按鍵,還包括如組合鍵、鍵盤(pán)等。

對(duì)于這些種類的按鍵它們的形態(tài)、功能或許有較大的差異,但我們可以對(duì)它們所進(jìn)行的操作卻很類似。這也是我們能夠統(tǒng)一考慮它們的基礎(chǔ)。

1.2、原理分析

我們已經(jīng)給我們要操作的按鍵劃分了范圍,在此基礎(chǔ)上我們簡(jiǎn)單分析實(shí)現(xiàn)按鍵操作的基本原理。

首先我們來(lái)考慮按鈕操作的原理,其實(shí)很簡(jiǎn)單,無(wú)非就是按下或者彈起兩種狀態(tài)。至于按鈕本身是常開(kāi)或者常閉,是低電平有效還是高電平有效都沒(méi)有問(wèn)題,我們只要能檢測(cè)出其狀態(tài)就可以了。我們考慮按鍵的按下、彈起、連擊和長(zhǎng)按等狀態(tài),如下圖:

Dingtalk_20221206154648.jpg

其次我們來(lái)考慮按鍵狀態(tài)的存儲(chǔ)。在系統(tǒng)中的多個(gè)按鍵需要操作時(shí),如何處理響應(yīng)事件就會(huì)是一個(gè)問(wèn)題。我們考慮以先入先出隊(duì)列來(lái)存儲(chǔ)按鍵的狀態(tài),進(jìn)而根據(jù)狀態(tài)進(jìn)行操作。我們需要設(shè)計(jì)一個(gè)隊(duì)列,這是一個(gè)先入先出的隊(duì)列,擁有一定的存儲(chǔ)空間和讀寫(xiě)操作指針,具體如下圖所示:

Dingtalk_20221206154648.jpg

在上圖中,當(dāng)讀指針與寫(xiě)指針一樣時(shí),則表示隊(duì)列為空。當(dāng)寫(xiě)入一個(gè)數(shù)據(jù),則寫(xiě)指針加一;當(dāng)讀出一個(gè)數(shù)據(jù),則讀指針加一;當(dāng)讀指針遇到寫(xiě)指針則表示在沒(méi)有數(shù)據(jù)了。

最后來(lái)說(shuō)一說(shuō)按鍵狀態(tài)的響應(yīng)。所謂響應(yīng)其實(shí)就是對(duì)不同的狀態(tài)我們來(lái)處理不同的事件。對(duì)于每個(gè)按鍵我們根據(jù)其狀態(tài)定義事件。在不同的事件中處理我們需要的功能。

Dingtalk_20221206154648.jpg

在上圖中,狀態(tài)和時(shí)間都可以在我們的對(duì)象中聲明,但具體的實(shí)現(xiàn)形式在應(yīng)用中完成。

2、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

我們已經(jīng)簡(jiǎn)單分析了按鍵的基本操作原理,接下來(lái)我們將以此為基礎(chǔ)來(lái)分析并設(shè)計(jì)按鍵操作的通用驅(qū)動(dòng)方法。

2.1、對(duì)象定義

我們依然采用基于對(duì)象的操作方式。當(dāng)然前提是我們得到了可用于操作的對(duì)象,所以我們先來(lái)分析一下如何抽象面向按鍵操作的對(duì)象。

2.1.1、定義對(duì)象類型

一般來(lái)講,一個(gè)對(duì)象會(huì)包括屬性和操作。接下來(lái)我們就從這兩個(gè)方面來(lái)考慮按鍵對(duì)象問(wèn)題。

首先我們來(lái)考慮按鍵對(duì)象的屬性問(wèn)題。我們的系統(tǒng)中總有多個(gè)按鍵,為了區(qū)分這些按鍵我們?yōu)槊恳粋€(gè)按鍵分配一個(gè)ID,用于區(qū)別這些按鍵。所以我們將按鍵ID作為其一個(gè)屬性。對(duì)于按鍵操作我們一般都會(huì)有軟件濾波來(lái)實(shí)現(xiàn)消抖,我們一如一個(gè)濾波計(jì)數(shù)用以實(shí)現(xiàn)這一過(guò)程,我們將濾波計(jì)數(shù)也當(dāng)作它的一個(gè)屬性。長(zhǎng)按鍵我們需要預(yù)設(shè)檢測(cè)時(shí)長(zhǎng),同時(shí)需要一個(gè)計(jì)數(shù)來(lái)記錄這一過(guò)程,所以我們將其設(shè)為屬性。同樣連續(xù)按鍵的周期需要預(yù)設(shè),而且需要計(jì)數(shù)來(lái)記錄過(guò)程,所以也將這兩個(gè)作為屬性。當(dāng)然按鍵當(dāng)前的狀態(tài),我們也可能需要記錄一下,按鍵按下時(shí)的有效電平,我們也需要分辨,這些我們也都將其作為屬性。綜上所述按鍵對(duì)象的類型定義如下:

/*定義按鍵對(duì)象類型*/
    typedef struct KeyObject {
     uint8_t id;//按鍵的ID
     uint8_t Count;//濾波器計(jì)數(shù)器
     uint16_t LongCount;//長(zhǎng)按計(jì)數(shù)器
     uint16_t LongTime;  //按鍵按下持續(xù)時(shí)間, 0 表示不檢測(cè)長(zhǎng)按
     uint8_t  State;//按鍵當(dāng)前狀態(tài)(按下還是彈起)
     uint8_t  RepeatPeriod;//連續(xù)按鍵周期
     uint8_t  RepeatCount;//連續(xù)按鍵計(jì)數(shù)器
     uint8_t ActiveLevel;//激活電平
    }KeyObjectType;

除了按鍵對(duì)象,其實(shí)我們還需要定義一個(gè)數(shù)據(jù)隊(duì)列的對(duì)象。者如我們前面所說(shuō),隊(duì)列除了一個(gè)數(shù)據(jù)存儲(chǔ)區(qū)外還需要讀寫(xiě)指針。我們定義如下:

/*定義鍵值存儲(chǔ)隊(duì)列的類型*/
    typedef struct KeyStateQueue{
      uint8_t queue[KEY_FIFO_SIZE];//鍵值存儲(chǔ)隊(duì)列
     uint8_t pRead;//讀隊(duì)列指針
     uint8_t pWrite;//寫(xiě)隊(duì)列指針
    }KeyStateQueueType;

2.1.2、對(duì)象初始化配置

對(duì)象定義之后并不能立即使用我們還需要對(duì)其進(jìn)行初始化。所以這里我們來(lái)考慮按鍵對(duì)象的初始化函數(shù)。關(guān)于對(duì)象的初始化,初始化函數(shù)需要處理幾個(gè)方面的問(wèn)題。一是檢查輸入?yún)?shù)是否合理;二是為對(duì)象的屬性賦初值;三是對(duì)對(duì)象作必要的初始化配置。據(jù)此思路我們?cè)O(shè)計(jì)按鍵對(duì)象的初始化函數(shù)如下:

/*按鍵讀取初始化*/
    void KeysInitialization(KeyObjectType *pKey,uint8_t id,uint16_t longTime, uint8_t repeatPeriod,KeyActiveLevelType level)
    {
     if(pKey==NULL)
     {
     return;
     }
     
     pKey->id=id;
     pKey->Count=0;
     pKey->LongCount=0;
     pKey->RepeatCount=0;
     pKey->State=0;
     
     pKey->ActiveLevel=level;
     
     pKey->LongTime=longTime;
     pKey->RepeatPeriod=repeatPeriod;
    }

2.2、對(duì)象操作

我們已經(jīng)抽象了按鍵對(duì)象類型,也設(shè)計(jì)了對(duì)象的初始化函數(shù)。接下來(lái)我們需要考慮使用對(duì)象如何實(shí)現(xiàn)操作。根據(jù)我們前面的分析,操作可分為量個(gè)部分:按鍵狀態(tài)的檢測(cè)和鍵值隊(duì)列的操作。

2.2.1、按鍵狀態(tài)檢測(cè)

需要周期性的檢測(cè)按鍵的狀態(tài)以便我們響應(yīng)按鍵的操作。我們一般10ms檢測(cè)一次狀態(tài),并持續(xù)一定的濾波周期用于消抖。我們檢測(cè)到按鍵的不同狀態(tài)后將狀態(tài)存入到相關(guān)的鍵值隊(duì)列中。

/*按鍵周期掃描程序*/
    void KeyValueDetect(KeyObjectType *pKey)
    {
     
     if (CheckKeyDown(pKey))
     {
     if (pKey->Count < KEY_FILTER_TIME)
     {
     pKey->Count = KEY_FILTER_TIME;
     }
     else if(pKey->Count < 2 * KEY_FILTER_TIME)
     {
     pKey->Count++;
     }
     else
     {
     if (pKey->State == 0)
     {
     pKey->State = 1;
     
     /*發(fā)送按鍵按下事件消息*/
     KeyValueEnQueue((uint8_t)((pKey->id<<2) + KeyDown));
     }
     
     if (pKey->LongTime > 0)
     {
     if (pKey->LongCount < pKey->LongTime)
     {
     /* 發(fā)送按建持續(xù)按下的事件消息 */
     if (++pKey->LongCount == pKey->LongTime)
     {
     /* 鍵值放入按鍵FIFO */
     KeyValueEnQueue((uint8_t)((pKey->id<<2) + KeyLong));
     }
     }
     else
     {
     if (pKey->RepeatPeriod > 0)
     {
     if (++pKey->RepeatCount >= pKey->RepeatPeriod)
     {
     pKey->RepeatCount = 0;
     /*長(zhǎng)按鍵后,每隔10ms發(fā)送1個(gè)按鍵*/
     KeyValueEnQueue((uint8_t)((pKey->id<<2) + KeyDown));
     }
     }
     }
     }
     }
     }
     else
     {
     if(pKey->Count > KEY_FILTER_TIME)
     {
     pKey->Count = KEY_FILTER_TIME;
     }
     else if(pKey->Count != 0)
     {
     pKey->Count--;
     }
     else
     {
     if (pKey->State == 1)
     {
     pKey->State = 0;
     
     /*發(fā)送按鍵彈起事件消息*/
     KeyValueEnQueue((uint8_t)((pKey->id<<2)+ KeyUP));
     }
     }
     
     pKey->LongCount = 0;
     pKey->RepeatCount = 0;
     }
    }

2.2.2、鍵值隊(duì)列的操作

鍵值隊(duì)列的操作就簡(jiǎn)單了,主要包括數(shù)據(jù)的寫(xiě)入、讀出、清空隊(duì)列以及隊(duì)列是否為空。需要說(shuō)的是鍵值的存儲(chǔ),包括量方面類容:按鍵的ID和按鍵的狀態(tài)。我們使用一個(gè)字節(jié)來(lái)存儲(chǔ)這些信息,前六個(gè)位存儲(chǔ)ID,后兩位存儲(chǔ)狀態(tài)。具體如下圖所示:

Dingtalk_20221206154648.jpg

這樣一種存儲(chǔ)格式,我們最多可以存儲(chǔ)64個(gè)按鍵和4種狀態(tài),當(dāng)然這還要看隊(duì)列的大小。

/*鍵值出隊(duì)列程序*/
    uint8_t KeyValueDeQueue(void)
    {
     uint8_t result; 
     
     if(keyState.pRead==keyState.pWrite)
     {
     result=0;
     }
     else
     {
     result=keyState.queue[keyState.pRead];
     
     if(++keyState.pRead>=KEY_FIFO_SIZE)
     {
     keyState.pRead=0;
     }
     }
     return result;
    }
     
    /*鍵值入隊(duì)列程序*/
    void KeyValueEnQueue(uint8_t keyCode)
    {
     keyState.queue[keyState.pWrite]=keyCode;
     
     if(++keyState.pWrite >= KEY_FIFO_SIZE)
     {
     keyState.pWrite=0;
     }
    }

3、驅(qū)動(dòng)的使用

我們已經(jīng)設(shè)計(jì)了按鍵操作的驅(qū)動(dòng)程序,還需要對(duì)這一設(shè)計(jì)進(jìn)行驗(yàn)證。這一節(jié)我們將以前面的設(shè)計(jì)為基礎(chǔ),用一個(gè)簡(jiǎn)單的應(yīng)用來(lái)驗(yàn)證。我們?cè)O(shè)計(jì)4個(gè)單體按鍵,并由它們生出兩組組合鍵,所以我們的應(yīng)用程序就是面向這6個(gè)按鍵對(duì)象進(jìn)行操作。

3.1、聲明并初始化對(duì)象

在開(kāi)始面向一個(gè)對(duì)象的操作之前,我們需要得到這個(gè)對(duì)象的一個(gè)實(shí)例。那么我們要先聲明對(duì)象。我們前面已經(jīng)定義了按鍵對(duì)象類型KeyObjectType和存儲(chǔ)鍵值的隊(duì)列類型KeyStateQueueType。我們使用這兩個(gè)類型先聲明兩個(gè)對(duì)象變量如下:

KeyObjectType keys[6];

KeyStateQueueType keyState;

聲明了對(duì)象還需要對(duì)變量進(jìn)行初始化。在驅(qū)動(dòng)的設(shè)計(jì)中我們已經(jīng)設(shè)計(jì)了初始化函數(shù),對(duì)象變量的初始化操作就通過(guò)這一函數(shù)來(lái)實(shí)現(xiàn)。初始化函數(shù)需要一些輸入?yún)?shù):

KeyObjectType *pKey,按鍵對(duì)象

uint8_t id,按鍵ID

uint16_t longTime,長(zhǎng)按有效時(shí)間

uint8_t repeatPeriod,連按間隔周期

KeyActiveLevelType level,按鍵按下有效電平

在這些參數(shù)中pKey為按鍵對(duì)象,是我們要初始化的對(duì)象。而其它參數(shù)只需要根據(jù)實(shí)際設(shè)置輸入就可以了。說(shuō)一初始化函數(shù)可調(diào)用為:

/*按鍵硬件初始化配置*/
    static void Key_Init_Configuration(void)
    {
      KeyIDType id;
      for(id=KEY1;idid++)
      {
     KeysInitialization(&keys[id],id,KEY_LONG_TIME,0,KeyHighLevel);
      }
    }

關(guān)于按鍵ID,我們使用枚舉來(lái)定義。與我們前面定義的按鍵對(duì)象數(shù)組配合能夠起到很好的效果。在這一我們定義按鍵ID為:

/*定義按鍵枚舉*/
    typedef enum KeyID {
     KEY1,
     KEY2,
     KEY3,
     KEY4,
    KEY1KEY2,
     KEY3KEY4,
     KEYNUM
    }KeyIDType;

按鍵ID作為作為按鍵的唯一標(biāo)識(shí),不但在我們的按鍵狀態(tài)記錄中要使用到,同時(shí)也可作為我們按鍵對(duì)象數(shù)組的下標(biāo)來(lái)使用。

3.2、基于對(duì)象進(jìn)行操作

我們定義了對(duì)象,接下來(lái)就可以基于對(duì)象實(shí)現(xiàn)我們的應(yīng)用。對(duì)于按鍵操作我們需要考慮2個(gè)方面的事情:一是周期型的檢查按鍵狀態(tài)并壓如隊(duì)列;二是讀取隊(duì)列中的按鍵狀態(tài)觸發(fā)不同的操作。

首先我們來(lái)說(shuō)一說(shuō)周期型的檢查按鍵的狀態(tài)。我們采用10ms的周期來(lái)檢查按鍵,所以我們需要使用定時(shí)中端的方式來(lái)實(shí)現(xiàn),將如下函數(shù)加入到10ms定時(shí)中端即可。

/*按鍵掃描程序*/
    void KeyScanHandle(void)
    {
      KeyIDType id;
      for(id=KEY1;idid++)
      {
         KeyValueDetect(&keys[id]);
      }
    }

其實(shí)還有一個(gè)回調(diào)函數(shù)需要實(shí)現(xiàn),其原型如下:

/*檢查某個(gè)ID的按鍵(包括組合鍵)是否按下*/
    __weak uint8_t CheckKeyDown(KeyObjectType *pKey)

根據(jù)我們定義的按鍵對(duì)象和ID枚舉我們實(shí)現(xiàn)這個(gè)回調(diào)函數(shù)并不困難,我們實(shí)現(xiàn)其如下:

/*檢查某個(gè)ID的按鍵(包括組合鍵)是否按下*/
    uint8_t CheckKeyDown(KeyObjectType *pKey)
    {
     /* 實(shí)體單鍵 */
     if (pKey->id < KEY1KEY2)
     {
     uint8_t i;
     uint8_t count = 0;
     uint8_t save = 255;
     
     /* 判斷有幾個(gè)鍵按下 */
      for (i = 0; i < KEY1KEY2; i++)
     {
     if (KeyPinActive(pKey)) 
     {
     count++;
     save = i;
     }
     }
     
     if (count == 1 && save == pKey->id)
     {
     return 1;/* 只有1個(gè)鍵按下時(shí)才有效 */
     }
     return 0;
     }
     
     /* 組合鍵 K1K2 */
     if (pKey->id == KEY1KEY2)
     {
     if (KeyPinActive(&keys[KEY1]) && KeyPinActive(&keys[KEY2]))
     {
     return 1;
     }
     else
     {
     return 0;
     }
     }
     
      /* 組合鍵 K3K4 */
     if (pKey->id == KEY3KEY4)
     {
     if (KeyPinActive(&keys[KEY3]) && KeyPinActive(&keys[KEY4]))
     {
     return 1;
     }
     else
     {
     return 0;
     }
     }
     return 0;
    }

此外,我們還需要讀取按鍵的狀態(tài)并進(jìn)行相應(yīng)的響應(yīng)。我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的處理函數(shù)如下:

/*按鍵處理函數(shù)*/
    static void KeyProcessing(void)
    {
      uint8_t keyCode;
     keyCode=KeyValueDeQueue();
    
     if(keyCode==((keys[KEY1].id<<2)+KeyDown))
     {
     //key1按下時(shí)觸發(fā)的事件
     }
     else if(keyCode==((keys[KEY1].id<<2)+KeyUP))
     {
     //key1彈起時(shí)觸發(fā)的事件
     }
    }

4、應(yīng)用總結(jié)

我們已經(jīng)實(shí)現(xiàn)了按鍵對(duì)象的操作,并在次基礎(chǔ)上實(shí)現(xiàn)了簡(jiǎn)單的驗(yàn)證。操作的結(jié)果符合我們的期望。而且擴(kuò)展性也很強(qiáng)。

按照我們對(duì)信息存儲(chǔ)方式和消息隊(duì)列的設(shè)計(jì),最多可以存儲(chǔ)64個(gè)按鍵和4中狀態(tài),當(dāng)然這需要看定義的隊(duì)列的大小。隊(duì)列不應(yīng)太小,太小有可能會(huì)造成某些按鍵操不會(huì)響應(yīng);也不應(yīng)太大,太大可能會(huì)造成操作遲緩和空間浪費(fèi)。

在應(yīng)用中,我們建議定義按鍵ID時(shí)最好使用枚舉,使用枚舉的好處有幾點(diǎn)。一是不會(huì)出現(xiàn)重復(fù),每個(gè)按鍵能保證有唯一的ID值。二是便于與按鍵對(duì)象數(shù)組組合操作,簡(jiǎn)化編碼。三是使用枚舉擴(kuò)展很方便,代碼改動(dòng)比較小。當(dāng)然,枚舉值最好是連續(xù)的而且從0開(kāi)始。

在使用驅(qū)動(dòng)是還需要注意,檢測(cè)按鍵操作是只對(duì)個(gè)體單鍵的硬件有效,如果可能也使用數(shù)組操作,能與ID枚舉配合使用簡(jiǎn)化操作。對(duì)于組合鍵要檢測(cè)多個(gè)物理硬件,但也是對(duì)這些但體檢的檢測(cè),所以在硬件上不需要定義。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 按鍵
    +關(guān)注

    關(guān)注

    4

    文章

    229

    瀏覽量

    58501
  • 對(duì)象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    17737
  • 驅(qū)動(dòng)設(shè)計(jì)

    關(guān)注

    1

    文章

    113

    瀏覽量

    15745
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux下如何使用中斷的方式來(lái)驅(qū)動(dòng)按鍵

    Linux下的按鍵輸入驅(qū)動(dòng)開(kāi)發(fā)模板一文中介紹了基本的按鍵輸入捕獲流程,這里將進(jìn)一步介紹如何使用中斷的方式來(lái)驅(qū)動(dòng)按鍵,同時(shí)通過(guò)定時(shí)器
    發(fā)表于 07-29 08:59 ?1369次閱讀

    linux系統(tǒng)中裸機(jī)按鍵中斷的驅(qū)動(dòng)?方法

    今天主要和大家聊一聊,如何實(shí)現(xiàn)按鍵中斷的驅(qū)動(dòng)方法。
    發(fā)表于 12-09 11:59 ?1120次閱讀

    EmbeddedButton嵌入式按鍵驅(qū)動(dòng)設(shè)計(jì)實(shí)現(xiàn)

    EmbeddedButton是一個(gè)輕量級(jí)簡(jiǎn)單易用的嵌入式按鍵驅(qū)動(dòng)模塊,可無(wú)限拓展按鍵,支持多連擊、長(zhǎng)按、短按長(zhǎng)按等多種按鍵事件;該模塊通過(guò)異步回調(diào)方式來(lái)簡(jiǎn)化程序結(jié)構(gòu),根據(jù)幾個(gè)簡(jiǎn)單原則完
    的頭像 發(fā)表于 08-28 15:47 ?2264次閱讀
    EmbeddedButton嵌入式<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)<b class='flag-5'>實(shí)現(xiàn)</b>

    開(kāi)發(fā)第1個(gè)LVGL程序與實(shí)現(xiàn)按鍵操作

    開(kāi)發(fā)第1個(gè)LVGL程序與實(shí)現(xiàn)按鍵操作
    的頭像 發(fā)表于 01-07 13:49 ?4802次閱讀
    開(kāi)發(fā)第1個(gè)LVGL程序與<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>按鍵</b><b class='flag-5'>操作</b>

    如何使用軟件Proteus和Keil uVision4實(shí)現(xiàn)多個(gè)按鍵操作?

    如何使用軟件Proteus和Keil uVision4實(shí)現(xiàn)多個(gè)按鍵操作
    發(fā)表于 10-20 07:22

    如何使用STM32擴(kuò)展板實(shí)現(xiàn)按鍵驅(qū)動(dòng)?

    樹(shù)莓派和STM32之間如何連線?如何使用STM32擴(kuò)展板實(shí)現(xiàn)按鍵驅(qū)動(dòng)
    發(fā)表于 01-17 07:46

    獨(dú)立按鍵操作方法

    慧凈HL-1 配套C實(shí)驗(yàn)例程100例【實(shí)驗(yàn)11】獨(dú)立按鍵操作方法),很好的C51學(xué)習(xí)資料程序。
    發(fā)表于 03-21 17:01 ?4次下載

    使用單片機(jī)C語(yǔ)言實(shí)現(xiàn)獨(dú)立按鍵檢測(cè)與矩陣鍵盤(pán)操作的資料和程序

    所有的電子產(chǎn)品幾乎到涉及到按鍵操作。所以微控制器是如何識(shí)別一個(gè)按鍵是否被按下,按下后又該如何做出反應(yīng),又如何防止按鍵抖動(dòng)呢?更深入一點(diǎn),微控制器又是如何識(shí)別矩陣鍵盤(pán)的?本文將詳細(xì)闡述如
    發(fā)表于 07-16 17:39 ?2次下載
    使用單片機(jī)C語(yǔ)言<b class='flag-5'>實(shí)現(xiàn)</b>獨(dú)立<b class='flag-5'>按鍵</b>檢測(cè)與矩陣鍵盤(pán)<b class='flag-5'>操作</b>的資料和程序

    使用單片機(jī)實(shí)現(xiàn)2按鍵加減操作的C語(yǔ)言實(shí)例免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)實(shí)現(xiàn)2按鍵加減操作的C語(yǔ)言實(shí)例免費(fèi)下載。
    發(fā)表于 11-18 17:44 ?18次下載

    嵌入式LinuxQT操作自定義按鍵

    嵌入式Linux系統(tǒng)中,用QT做的應(yīng)用層程序,需要檢測(cè)自定義的按鍵狀態(tài)。使用的QT的按鍵事件,驅(qū)動(dòng)層使用的Linux的input子系統(tǒng)。環(huán)境如下:硬件:Imx6ullQT版本:5.5在QT中使用
    發(fā)表于 10-20 19:21 ?9次下載
    嵌入式LinuxQT<b class='flag-5'>操作</b>自定義<b class='flag-5'>按鍵</b>

    MCU之按鍵驅(qū)動(dòng) -剝離按鍵驅(qū)動(dòng)和事件處理

    ButtonDrive 自己寫(xiě)的一個(gè)按鍵驅(qū)動(dòng),支持單雙擊、連按、長(zhǎng)按;采用回調(diào)處理按鍵事件(自定義消抖時(shí)間),使用只需3步,創(chuàng)建按鍵,按鍵
    發(fā)表于 10-28 19:21 ?18次下載
    MCU之<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b> -剝離<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>和事件處理

    Nand Flash驅(qū)動(dòng)(實(shí)現(xiàn)初始化以及讀操作)

    Nand Flash驅(qū)動(dòng)(實(shí)現(xiàn)初始化以及讀操作)
    發(fā)表于 12-02 12:36 ?11次下載
    Nand Flash<b class='flag-5'>驅(qū)動(dòng)</b>(<b class='flag-5'>實(shí)現(xiàn)</b>初始化以及讀<b class='flag-5'>操作</b>)

    按鍵驅(qū)動(dòng)的實(shí)驗(yàn)

    按鍵驅(qū)動(dòng)實(shí)驗(yàn)與LED以及Beep在整體使用邏輯上一樣,只是按鍵是輸入模式。
    的頭像 發(fā)表于 03-02 16:25 ?1600次閱讀
    <b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>的實(shí)驗(yàn)

    基于狀態(tài)機(jī)的按鍵驅(qū)動(dòng)設(shè)計(jì)

    按鍵作為單片機(jī)的輸入設(shè)備,可以向單片機(jī)輸入數(shù)據(jù)、傳輸命令等,是設(shè)置參數(shù)和控制設(shè)備的常用接口。所以,學(xué)會(huì)按鍵驅(qū)動(dòng)也是初學(xué)者必不可少的能力。說(shuō)到按鍵驅(qū)動(dòng)
    的頭像 發(fā)表于 07-04 11:43 ?2757次閱讀
    基于狀態(tài)機(jī)的<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)

    如何在FPGA中實(shí)現(xiàn)按鍵消抖

    按鍵操作。因此,實(shí)現(xiàn)有效的按鍵消抖機(jī)制對(duì)于提高系統(tǒng)的穩(wěn)定性和可靠性至關(guān)重要。以下是在FPGA中實(shí)現(xiàn)按鍵
    的頭像 發(fā)表于 08-19 18:15 ?4718次閱讀