成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

物協(xié)寒假培訓(xùn)Day12—鍵盤-創(chuàng)新互聯(lián)

一、認識開發(fā)板上的鍵盤

開發(fā)板上的鍵盤主要分為獨立鍵盤和矩陣鍵盤兩種,通過J5跳線帽切換這兩種鍵盤。開發(fā)板上面分別標有KBD和BTN,其中KBD就是key board,鍵盤的意思(矩陣鍵盤),BTN表示button,獨立按鍵,知道了這個我們就能很好的記憶。下面為開發(fā)板的實物圖:

創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、河池網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為河池等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。 1.獨立鍵盤

當J5跳線帽接2,3的時候為獨立鍵盤,接1,2的時候為矩陣鍵盤。下圖為獨立鍵盤的示意圖:

此處的S4,S5,S6,S7四個按鍵組成了獨立鍵盤,當我們按下S4時,P33與GND接通,此時單片機的P33口讀取到的電壓為0,那么其它三個端口的電壓為多少呢?我們看下面的圖片:

我們現(xiàn)在使用的STC15F2K60S2系列的P3口默認都為準雙向口,通過上面的圖片可以看到,如果端口引腳沒有輸入的時候,其輸入數(shù)據(jù)會被上拉電阻強行置為高電平。再看最后一句,準雙向口讀取外部狀態(tài)前,要先鎖存為"1"才可讀到外部正確的狀態(tài),我們使用的15系列單片機在上電的時候就會把引腳置為高電平,已經(jīng)默認鎖存為1,可以直接讀取外部狀態(tài)。

2.矩陣鍵盤

當J5跳線帽接1,2的時候,此部分就會由獨立鍵盤變?yōu)榫仃囨I盤。

對于按鍵狀態(tài)的識別,我們常用的方法有兩種:線翻轉(zhuǎn)法和行掃描法。

下面是官方書籍中的介紹(采用行掃描法)
矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,列線通過電阻接正電源,并將行線所接的單片機的 I/O 口作為輸出端,而列線所接的 I/O 口則作為輸入端。這樣,當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。 矩陣鍵盤中按鍵的識別有行掃描和線翻轉(zhuǎn)兩種方法,其中 行掃描法是一種最常用的按鍵識別方法,過程如下:
(1)逐行輸出 0,檢查列線是否非全高;
(2)如果某行輸出 0 時,查到列線非全高,則該行有按鍵按下;
(3)根據(jù)輸出 0 的行線和讀入 0 的列線,即可判斷按下按鍵的位置。
行掃描法的工作原理

P30,P31,P32,P33作為單片機輸入引腳,P34,P35,P42,P44作為單片機的輸出引腳。當開始工作時,我們把單片機四個輸出引腳分別置0,然后在輸入引腳處讀取數(shù)值從而判斷到底是哪個按鍵被按下。

舉個栗子:我們假設(shè)S9按鍵被按下。首先,我們將單片機的P44引腳置0,由于S4~S7未有按鍵按下,因此單片機由于上拉電阻的作用,在輸入端讀取的數(shù)值都為1。然后我們把P44重新置為1,把P42置為0,由于S9被按下,此線路導(dǎo)通,因此P32引腳被置為0,其它為1,由此我們可以得知S9按鍵被按下了,往后以此類推。

代碼原理分析
unsigned int Key_New; //16位無符號整數(shù)

P44 = 0; P42 = 1; P35 = 1; P34 = 1; // 第 1 列
//此時若有按鍵按下,則P30~P33對應(yīng)的引腳置零
Key_New = P3 & 0x0f; //只保留末四位的數(shù)據(jù)

P44 = 1; P42 = 0; // 第 2 列 切換掃描的行
Key_New = (Key_New<< 4) | (P3 & 0x0f); //先把先前的數(shù)據(jù)往高四位移動,然后保留末四位數(shù)據(jù)

P42 = 1; P35 = 0; // 第 3 列
Key_New = (Key_New<< 4) | (P3 & 0x0f); 

P35 = 1; P34 = 0; // 第 4 列
Key_New = (Key_New<< 4) | (P3 & 0x0f);

以上為代碼的工作原理,按照4位一組,最終的結(jié)果為0x0400,對應(yīng)S9按鍵被按下。

二、代碼編寫 1.獨立鍵盤
#include "key.h"

unsigned char Key_Read_BTN(void){
    unsigned char Key_Value;
    
    if(P30 == 0) Key_Value = 7;
    else if(P31 == 0) Key_Value = 6;
    else if(P32 == 0) Key_Value = 5;
    else if(P33 == 0) Key_Value = 4;
    else Key_Value = 0;
    
    return Key_Value;
}
2. 矩陣鍵盤

😋此處代碼的switch()里面非常有規(guī)律。

// 運行程序時,將 J5 調(diào)整為 KBD 模式(1、2 腳短接)
#include "key.h"

unsigned char Key_Read(void){
    unsigned int  Key_New;
    unsigned char Key_Val;

    P44 = 0; P42 = 1; P35 = 1; P34 = 1;
    Key_New = P3;
    P44 = 1; P42 = 0;					
    Key_New = (Key_New<< 4) | (P3 & 0x0f);
    P42 = 1; P35 = 0;					
    Key_New = (Key_New<< 4) | (P3 & 0x0f);
	P35 = 1; P34 = 0;				
    Key_New = (Key_New<< 4) | (P3 & 0x0f);

    switch(~Key_New) {
        
        case 0x8000: Key_Val = 4; break;	// S4
        case 0x4000: Key_Val = 5; break;	// S5
        case 0x2000: Key_Val = 6; break;	// S6
        case 0x1000: Key_Val = 7; break;	// S7
        
        case 0x0800: Key_Val = 8; break;	// S8
        case 0x0400: Key_Val = 9; break;	// S9
        case 0x0200: Key_Val = 10; break;	// S10
        case 0x0100: Key_Val = 11; break;	// S11
        
        case 0x0080: Key_Val = 12; break;	// S12
        case 0x0040: Key_Val = 13; break;	// S13
        case 0x0020: Key_Val = 14; break;	// S14
        case 0x0010: Key_Val = 15; break;	// S15
        
        case 0x0008: Key_Val = 16; break;	// S16
        case 0x0004: Key_Val = 17; break;	// S17
        case 0x0002: Key_Val = 18; break;	// S18
        case 0x0001: Key_Val = 19; break;	// S19
        default: Key_Val = 0;
    }
    return Key_Val;
}
三、按鍵消抖

(純手畫,比例不是很對,按下和松手的抖動時間<10ms,穩(wěn)定期>數(shù)百ms)

1.按鍵抖動原理

通常的按鍵所用開關(guān)為機械彈性開關(guān),當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。

2.按鍵消抖的方法 1)普通軟件延時

軟件延時和松手檢測都會占用CPU資源(delay)

while(1) {
    if(key==0) {
	Delay10ms();
	    if(key==0) {
              //按鍵按下執(zhí)行相關(guān)功能代碼                   
                while(!key);
	    }
    }
}
2)標志位軟件延時

通過引入按下標志位,省去了while(!KEY)的松手檢測,將按下時穩(wěn)定期的數(shù)百ms釋放出來,只占用了按下和松手時的共20ms的消抖時間。

3)標志位定時器延時

使用定時器進行延時消抖,使用標志位代替松手檢測(不會對主函數(shù)進行明顯干擾)

4)狀態(tài)機

算法成熟但代碼量大(設(shè)置三種狀態(tài))

5)三行代碼(位運算)
unsigned char Key_Value,Key_Down,Key_Old;//定義全局變量

Key_Value = Key_Read(); //讀取10ms更新一次的I/O電平狀態(tài),并儲存于變量Key_Value
Key_Down = Key_Value & (Key_Old ^ Key_Value);   //按下為按鍵值,其它為0
Key_Old = Key_Value;//把讀取到的臨時按鍵值Key_Value更新到Key_Old中,作為下一次舊的按鍵值

假設(shè)S4被按下了:

Key_Old

Key_Value

對應(yīng)的按鍵過程

Key_Old ^ Key_Value

Key_Down

0

0

未按下

0

0

0

4

按下過程中

4

4

4

4

按下穩(wěn)定期間

0

0

4

0

抬起過程中

4

0

拓展:Key_Up = ~Key_Value & (Key_Old ^ Key_Value);

Key_Old

Key_Value

對應(yīng)的按鍵過程

Key_Old ^ Key_Value

Key_Up

0

4

未按下

0

0

0

0

按下過程中

4

0

4

0

按下穩(wěn)定期間

0

0

4

4

抬起過程中

4

4

長按:if(Key_Old == 4 {(......)}
雙擊:設(shè)置一個標志位,每次加一

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

本文標題:物協(xié)寒假培訓(xùn)Day12—鍵盤-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://jinyejixie.com/article20/ccshco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)站策劃、外貿(mào)建站虛擬主機、手機網(wǎng)站建設(shè)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
尼勒克县| 苗栗县| 南阳市| 民勤县| 长沙市| 游戏| 台东县| 彭水| 崇文区| 佛教| 遵义市| 衡山县| 建宁县| 德化县| 廊坊市| 乐都县| 上高县| 万全县| 招远市| 灵璧县| 萍乡市| 乌恰县| 鸡西市| 孝感市| 靖边县| 武川县| 永嘉县| 无为县| 华坪县| 西和县| 江华| 娄烦县| 双江| 易门县| 阳江市| 郸城县| 仪陇县| 罗田县| 天台县| 西贡区| 清新县|