日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

1. 按鍵輸入概述

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

2. 硬件設(shè)計(jì)

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


圖2-1 4x4矩陣按鍵

3. 驅(qū)動(dòng)實(shí)現(xiàn)

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

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

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

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

#define KeyGetPinState() (P1>> 4)

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

voidKeyScan()

{

unsigned char i;

unsigned char KeyValue;

unsigned char PinState;

if (KeyState.State == STATE_DISABLE) {

return; // 按鍵禁用時(shí),不對(duì)鍵盤進(jìn)行掃描

}

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

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

KeyValue = 0;

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

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

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

PinState = KeyGetPinState();

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

PinState = ~PinState;

// 搜索Pinstate第一個(gè)為1的位

if (!(PinState & 0xf)) {

KeyValue += 4;

continue; // 該掃描線沒有按鍵按下,進(jìn)入下一掃描線

}

// 該掃描線有鍵按下,對(duì)半進(jìn)行檢索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)

}

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

typedef struct {

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

unsigned int TimeCount; // 用來跟蹤各個(gè)狀態(tài)的計(jì)時(shí)

} KEY_STATE;

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

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

typedef struct {

unsigned char Value;

unsigned char State;

} KEY_EVENT;

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

static volatile KEY_EVENT KeyBuffer;

按鍵消抖以及長(zhǎng)按均是需要以時(shí)間為判斷標(biāo)準(zhǔn),我們?cè)谀K中定義消抖時(shí)間以及長(zhǎng)按時(shí)間判決以及相應(yīng)的狀態(tài)宏

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

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

#define LONG_COUNT 100 // 長(zhǎng)按100個(gè)掃描周期判斷為長(zhǎng)按(2S)

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

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

#define STATE_LONG 0x2 // 按鍵長(zhǎng)按檢測(cè)狀態(tài)

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

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

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

static voidKeyStore(unsigned char Value)

{

static unsigned char LastValue;

switch (KeyState.State) {

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

if (Value < KEY_NULL) {

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

LastValue = Value;

KeyState.TimeCount = WOBBLE_COUNT -1;

KeyState.State = STATE_WOBBLE;

}

break;

case STATE_WOBBLE:

if (KeyState.TimeCount) {

KeyState.TimeCount--; // 消抖計(jì)時(shí)未到

break;

}

// 消抖后再次判斷為同一鍵值則認(rèn)為鍵按下保存鍵值

// 并進(jìn)入到長(zhǎng)按檢測(cè)

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉