www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]在嵌入式系統(tǒng)中,用的最多的輸入設(shè)備就是按鍵,用戶的應(yīng)用需求可通過相應(yīng)按鍵傳遞到系統(tǒng)軟件中,軟件轉(zhuǎn)而完成用戶請求,實現(xiàn)簡單的人機交互。筆者此處就矩陣按鍵的實現(xiàn)作一個簡單的介紹。1. 按鍵輸入概述按鍵是一種常

在嵌入式系統(tǒng)中,用的最多的輸入設(shè)備就是按鍵,用戶的應(yīng)用需求可通過相應(yīng)按鍵傳遞到系統(tǒng)軟件中,軟件轉(zhuǎn)而完成用戶請求,實現(xiàn)簡單的人機交互。筆者此處就矩陣按鍵的實現(xiàn)作一個簡單的介紹。

1. 按鍵輸入概述

按鍵是一種常開型按鈕開關(guān),平時鍵的二個觸點處于斷開狀態(tài),按下鍵時它們才閉合。按鍵控制電路就是用來實時監(jiān)視按鍵,當有鍵接下時,電路監(jiān)控中的輸入引腳電平發(fā)生變化,檢測到這種變化后,控制電路進行按鍵掃描,定位按鍵的位置,并把相關(guān)的按鍵信息反饋回上一層應(yīng)用中。常見的按鍵輸入設(shè)計有獨立式按鍵,矩陣式按鍵。獨立式按鍵每個鍵占用一個IO口,電路配置靈活,軟件簡單,但按鍵較多時,IO口浪費大。矩陣式按鍵適用于按鍵數(shù)量較多的場合,由行線和列線組成,按鍵位于行列的交叉點上。節(jié)省IO口。通常按鍵控制電路通過查詢方式或中斷方式去檢測按鍵的輸入,查詢方式需占用一定的cpu資源,查詢頻率太低可能造成按鍵輸入丟失,太高浪費cpu資源,通常按鍵查詢頻率約50HZ較合適。中斷方式需占用cpu一路外部中斷,但不會占用cpu資源,只要有按鍵按下時,cpu即可馬上檢測到輸入,進行掃描并得到按鍵值。

2. 硬件設(shè)計

筆者此處采用4x4的矩陣按鍵設(shè)計,當然,矩陣鍵盤可通過四個肖特基二極管構(gòu)成四輸入的與門(可參考筆者這篇文章<淺談小信號肖特基二極管在數(shù)字電路中的應(yīng)用>),連接到單片機的外部中斷引腳,從而實現(xiàn)中斷方式檢測按鍵輸入。為兼容目前開發(fā)板常見的矩陣按鍵設(shè)計,筆者把4x4的矩陣按鍵接口接在P1口,通過查詢方式檢測按鍵輸入。


圖2-1 4x4矩陣按鍵

3. 驅(qū)動實現(xiàn)

由于我們采用的是查詢方式按鍵設(shè)計,因此單片機需一定的頻率去掃描P1口的按鍵,通常這個頻率約50HZ較合適,為保證這個掃描頻率,通常是通過定時器產(chǎn)生時標周期性進行執(zhí)行掃描。P1.4~P1.7列線通過上拉電阻接到VCC上,P1.0~P1.3行線產(chǎn)生相應(yīng)的掃描信號,無按鍵,列線處于高電平狀態(tài),有鍵按下,列線電平狀態(tài)將由與此列線相連的行線電平?jīng)Q定。行線電平為低,則列線電平為低,行線電平為高,則列線電平為高。

按鍵掃描函數(shù)如下,該函數(shù)需周期執(zhí)行,以掃描按鍵的狀態(tài)。以51單片機為例,P1.0~P1.3逐行輸出掃描信號,在Key.h模塊頭文件實現(xiàn)接口宏KeyOutputSelect()

#define KeyOutputSelect(Select) {P1 = ~(1<<(Select));}

輸出掃描線后,需要讀取對應(yīng)掃描線的按鍵狀態(tài)(P1.4~P1.7),同樣在Key.h模塊頭文件實現(xiàn)引腳狀態(tài)讀取接口宏KeyGetPinState()

#define KeyGetPinState() (P1>> 4)

讀取了對應(yīng)掃描線下的按鍵引腳狀態(tài),就需判斷哪些引腳電平為0(按下),對讀到的引腳狀態(tài)進行取反轉(zhuǎn)換成對引腳狀態(tài)變量進行搜1算法,得到鍵值的速度能達到最快,并且多個按鍵同時按下時也能夠正確得到優(yōu)先級最高的按鍵。按鍵有效按下會得到0~15的鍵值,無按鍵按下時得到鍵值16。

voidKeyScan()

{

unsigned char i;

unsigned char KeyValue;

unsigned char PinState;

if (KeyState.State == STATE_DISABLE) {

return; // 按鍵禁用時,不對鍵盤進行掃描

}

// 鍵值為0~15,未按鍵鍵值為16,任意多的鍵按下均能

// 正確返回優(yōu)先級最高的鍵值

KeyValue = 0;

for (i=0; i<4; i++) {

KeyOutputSelect(i); // 輸出掃描線

// 得到對應(yīng)掃描線時的按鍵狀態(tài)

PinState = KeyGetPinState();

// 有鍵按下時,PinState中有0的位置即為鍵值位置

PinState = ~PinState;

// 搜索Pinstate第一個為1的位

if (!(PinState & 0xf)) {

KeyValue += 4;

continue; // 該掃描線沒有按鍵按下,進入下一掃描線

}

// 該掃描線有鍵按下,對半進行檢索1的位置

if (!(PinState & 0x3)) {

KeyValue += 2; // 低2位(P1.4~P1.5)沒有按下

PinState >>= 2; // 移位檢索(P1.6~P1.7)

}

if (!(PinState & 0x1)){

KeyValue += 1;

}

break; // 有鍵按下,退出繼續(xù)掃描

}

KeyStore(KeyValue); // 保存按鍵狀態(tài)

}

得到了按鍵值后,我們需要對按鍵值進行處理并根據(jù)按鍵狀態(tài)把可能產(chǎn)生的按鍵消息保存進緩沖區(qū)中,以便用戶程序讀取處理。按鍵通常有按下、松手、長按這幾個狀態(tài),需要支持按下檢測、松手檢測、長按、連擊的功能,并且需要對按鍵進行去抖濾波。按鍵的狀態(tài)往往會在這幾種情況進行切換,因此,對按鍵進行狀態(tài)機編程是相當清晰的思路。我們在KeyStore()函數(shù)中實現(xiàn)對按鍵狀態(tài)的轉(zhuǎn)移判斷,在模塊中我們通過按鍵狀態(tài)結(jié)構(gòu)變量KeyState來跟蹤記錄按鍵的狀態(tài)

typedef struct {

unsigned char State; // 按鍵的各個狀態(tài)轉(zhuǎn)移

unsigned int TimeCount; // 用來跟蹤各個狀態(tài)的計時

} KEY_STATE;

static KEY_STATE KeyState; // 按鍵狀態(tài)機狀態(tài)轉(zhuǎn)移

檢測到相應(yīng)的按鍵事件后(KEY_UP、KEY_DOWN、KEY_LONG),需產(chǎn)生相應(yīng)的按鍵消息保存進按鍵緩存區(qū),通??梢蚤_辟一個按鍵隊列緩存,以便保存多個產(chǎn)生的按鍵消息,不會因用戶代碼未能及時處理按鍵而造成按鍵丟失,筆者此處為避免復(fù)雜,以一個按鍵緩沖為例,按鍵事件結(jié)構(gòu)變量KeyBuffer用來保存按鍵消息

typedef struct {

unsigned char Value;

unsigned char State;

} KEY_EVENT;

// 按鍵掃描得到的鍵值存放在KeyBuffer中,包含鍵值及鍵狀態(tài)

static volatile KEY_EVENT KeyBuffer;

按鍵消抖以及長按均是需要以時間為判斷標準,我們在模塊中定義消抖時間以及長按時間判決以及相應(yīng)的狀態(tài)宏

// 按鍵的掃描周期為20ms

#define WOBBLE_COUNT 1 // 按鍵消抖計數(shù),1個按鍵掃描周期(20ms)

#define LONG_COUNT 100 // 長按100個掃描周期判斷為長按(2S)

#define STATE_INIT 0x0 // 按鍵初始化狀態(tài)

#define STATE_WOBBLE 0x1 // 按鍵消抖狀態(tài)

#define STATE_LONG 0x2 // 按鍵長按檢測狀態(tài)

#define STATE_RELEASE 0x3 // 按鍵釋放狀態(tài)

#define STATE_DISABLE 0x4 // 按鍵禁用狀態(tài)

完整的KeyStore()函數(shù)實現(xiàn)如下

static voidKeyStore(unsigned char Value)

{

static unsigned char LastValue;

switch (KeyState.State) {

case STATE_INIT: // 初始狀等待按鍵

if (Value < KEY_NULL) {

// 記錄下按下的鍵并進入消抖狀態(tài)

LastValue = Value;

KeyState.TimeCount = WOBBLE_COUNT -1;

KeyState.State = STATE_WOBBLE;

}

break;

case STATE_WOBBLE:

if (KeyState.TimeCount) {

KeyState.TimeCount--; // 消抖計時未到

break;

}

// 消抖后再次判斷為同一鍵值則認為鍵按下保存鍵值

// 并進入到長按檢測

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉