開發(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)