bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

物協寒假培訓Day12—鍵盤-創新互聯

一、認識開發板上的鍵盤

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

創新互聯公司專注于企業成都全網營銷、網站重做改版、河池網站定制設計、自適應品牌網站建設、HTML5商城網站建設、集團公司官網建設、外貿營銷網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為河池等各大城市提供網站開發制作服務。 1.獨立鍵盤

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

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

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

2.矩陣鍵盤

當J5跳線帽接1,2的時候,此部分就會由獨立鍵盤變為矩陣鍵盤。

對于按鍵狀態的識別,我們常用的方法有兩種:線翻轉法和行掃描法。

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

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

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

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

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

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

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位一組,最終的結果為0x0400,對應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()里面非常有規律。

// 運行程序時,將 J5 調整為 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,穩定期>數百ms)

1.按鍵抖動原理

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

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

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

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

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

3)標志位定時器延時

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

4)狀態機

算法成熟但代碼量大(設置三種狀態)

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

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

假設S4被按下了:

Key_Old

Key_Value

對應的按鍵過程

Key_Old ^ Key_Value

Key_Down

0

0

未按下

0

0

0

4

按下過程中

4

4

4

4

按下穩定期間

0

0

4

0

抬起過程中

4

0

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

Key_Old

Key_Value

對應的按鍵過程

Key_Old ^ Key_Value

Key_Up

0

4

未按下

0

0

0

0

按下過程中

4

0

4

0

按下穩定期間

0

0

4

4

抬起過程中

4

4

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

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

本文標題:物協寒假培訓Day12—鍵盤-創新互聯
文章網址:http://vcdvsql.cn/article20/ccshco.html

成都網站建設公司_創新互聯,為您提供網站收錄網站策劃外貿建站虛擬主機手機網站建設App開發

廣告

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

h5響應式網站建設