開發板上的鍵盤主要分為獨立鍵盤和矩陣鍵盤兩種,通過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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯