微控制器 按鍵掃瞄

2021-10-08 17:50:51 字數 2860 閱讀 1444

按鍵掃瞄,我想應該是比較簡單的微控制器應用了,但是有時候看起來簡單的東西反而不好寫。

本文拿大部分人覺得簡單的按鍵掃瞄聊聊我工作至今對於軟體結構的理解。嗯,對的,是結構,不是架構,暫時不敢提架構這個詞。

下面說說我個人對於乙個按鍵檢測的**理解。

按鍵檢測需要做什麼事情呢?乙個是按鍵按下的這個物理事件的檢測,乙個是按下時候的消抖。能想到這兩個已經可以寫一段**來實現功能了。

#define debounce 10//延時消抖時間

uint8 key_scan( uint8 keycur )

}else

else

keycountdowm = 0;

}keylast = keycur;//按鍵備份值更新

return keyret;上面是乙個簡單的按鍵掃瞄函式,函式需要放置在乙個10ms的定時函式裡面,注意是定時函式不是定時中斷函式,需要傳遞按鍵資訊,這個資訊可以是從通訊函式獲取的,也可以是直接讀取io埠獲得,返回乙個消抖過後的鍵值,鍵值不做邏輯判斷。

然後我們來聊聊這個消抖函式,這個消抖函式只實現了乙個功能,按下消抖,那如果使用環境或者硬體設計缺陷,導致抬起的時候也有抖動呢?所以需要新增抬起消抖。

下面對函式進行優化一下

#define debounce 10//延時消抖時間

uint8 key_scan( uint8 keycur )

}else }}

keylast = keycur;

return keyret;新增了20ms的抬起消抖,這段**新增了兩個消抖檢測,乙個是在抬起的時候有20ms的消抖,乙個是在按鍵按下過程的乙個過程消抖。

上面的**實現的是抬起有效,那麼如果需要做到按下有效呢?

#define debounce 10//延時消抖時間

uint8 key_scan( uint8 keycur ) }}

else

}keylast = keycur;

return keyret;挪動按鍵的延時檢測判斷語句,在按下超過延時消抖時間的時候,返回按鍵按下值。

然後乙個簡單按鍵檢測函式就實現了,下面再給這個函式新增長按鍵判斷和連續按鍵。

#define debounce 10//延時消抖時間

#define longpress 100//長按鍵判斷函式

uint16 key_scan( uint8 keycur )

else if( keycountdowm == longpress )//長按鍵判斷

else if(keycountdowm > longpress+debounce)//連續按鍵判斷

}}else

}keylast = keycur;

return keyret;當有多個裝置的時候,可以將靜態區域性變數修改為結構體指標的形式,如下

type struct key

key_type;

#define debounce 10//延時消抖時間

#define longpress 100//長按鍵判斷函式

uint16 key_scan( key_type *key ,uint8 keycur)

else if( key->countdowm == longpress )//長按鍵判斷

else if(keyckey->countdowmountdowm > longpress+debounce)//連續按鍵判斷

}}else

}key->keylast = keycur;

return keyret;最後說說這個功能的實現,按鍵檢測分為三個部分,乙個是按鍵獲取函式,乙個是消抖,乙個是按鍵篩選函式,先把**貼上來。

type struct key

key_type;

#define debounce 10//延時消抖時間

#define longpress 100//長按鍵判斷函式

/**/

uint16 key_scan( key_type *key ,uint8 keycur)

else if( key->countdowm == longpress )//長按鍵判斷

else if(keyckey->countdowmountdowm > longpress+debounce)//連續按鍵判斷

}}else

}key->keylast = keycur;

return keyret;/

uint8 getkeyvalue(void)

#define key_null 0

#define key_up 1

#define key_down 2

#define key_on 3

#define key_up_l 4

#define key_doen_l 5

#define key_on_l 6

/**/

uint8 getkeyvalue(uint8 key)

break;

0x0101:

break;

default:

break;

}

return ret;
函式的三個部分的按鍵獲取函式部分需要自己去編寫,不同的鍵值**不同,我試過從iic中讀取鍵值,也試過從gpio中讀取鍵值。

然後是消抖函式,消抖函式需要如果有多個按鍵**的話需要定義多個結構體,如果只有乙個鍵值**可以替換成靜態區域性變數版的函式。

分成三個部分的好處是,函式間各幹各事情,互不影響,更容易讀,我在接手別人的**時候,如果涉及到按鍵部分出現問題的話,一般先問上乙個維護的人做沒做過程消抖,如果回答說有做,好的,接著問怎麼做的,一般把對方的過程消抖搞懂了,基本就懂了按鍵這部分的**。如果對方說沒有做或者很茫然的看著我,好吧,我會直接把對方的這部分**刪掉,重寫。

STC微控制器按鍵掃瞄程式

最近在做乙個電子秤相關專案,使用stc系列微控制器作為主控晶元,專案第一階段直接使用iap15w4k58s4驅動兩個矩陣鍵盤,一切除錯順利,在專案即將結束時老闆要求使用另一塊微控制器驅動矩陣鍵盤,讀取鍵值後通過串列埠傳回之前的iap主控 理由是為了節省從矩陣鍵盤到主控板之間的長排線的成本,16p 1...

51微控制器按鍵的掃瞄

include sbit addr0 p1 0 sbit addr1 p1 1 sbit addr2 p1 2 sbit addr3 p1 3 sbit enled p1 4 sbit key1 p2 4 sbit key2 p2 5 sbit key3 p2 6 sbit key4 p2 7 un...

51微控制器按鍵掃瞄C程式

大二上學期做過8051微控制器的按鍵程式,當時專案要求實現按鍵控制led屏顯示並且接收gprs傳來的資料。當時為了節省成本,就去大西電子市場買來8 8的led塊,然後自己一點一點的拼接成128 16的。做完之後雖然可以執行,但是很勉強,尤其是按鍵掃瞄程式沒有下面這位哥寫得簡潔縝密,所以就貼過來,以後...