大二——開啟我的菜鳥模式
811
2025-04-01
3.4?矩陣鍵盤
3.4.1 矩陣鍵盤原理圖
要使用矩陣鍵盤,需要將JP4接到JP8(P1)上面,JP165跳線帽需要斷開(否則會導致矩陣鍵盤最右一排無法正常使用)。
圖3-4-1
圖3-4-2(這張圖看起來更加方便)
圖3-4-3
3.4.2 矩陣鍵盤介紹
在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵),在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。
矩陣按鍵設置在行、列線交點上;行、列線分別連接到按鍵開關的兩端,行線通過上拉電阻接到+5V電源上。無按鍵按下時,行線處于高電平的狀態,而當有按鍵按下時,行線電平與此行線相連的列線電平決定。
3.4.3 示例代碼:?行列掃描
下面示例代碼,使用矩陣鍵盤行列掃描,反轉法檢測按鍵按下的狀態。
示例代碼:
#include?
#define?KEY?P1?? //定義按鍵
sbit?key1=KEY^0;
sbit?key2=KEY^1;
sbit?key3=KEY^2;
sbit?key4=KEY^3;
sbit?key5=KEY^4;
sbit?key6=KEY^5;
sbit?key7=KEY^6;
sbit?key8=KEY^7;
/*
矩陣鍵盤掃描函數
矩陣鍵盤尺寸:4*4
接在P1口上。
*/
u8?Array_Scan(void)
{
u8?key_a=0,key_b=0,key_c=0,key_d=0;??//用來存放矩陣按鍵按下的標志
KEY=0xF0;?//矩陣鍵盤賦值,4個IO為高電平4個IO為低電平
if(KEY!=0xF0)?//判斷是否有按鍵按下
{
DelayMs(50);??//消抖
if(KEY!=0xF0)?//再次判斷
{
//檢測是哪一排的按鍵的按下了
if(key5==0)key_a=1;?//s1,s5,s9,s13?其中一個按鍵按下
if(key6==0)key_b=1;?//s2?s6?s10?s14?其中一個按鍵按下
if(key7==0)key_c=1;?//s3?s7?s11?s15?其中一個按鍵按下
if(key8==0)key_d=1;?//s4?s8?s12?s16?其中一個按鍵按下
KEY=0x0F;?//反轉法重新賦值
if(KEY!=0x0F)?//檢測按鍵是否按下
{
if(key1==0&&key_a==1)return?1;
if(key1==0&&key_b==1)return?2;
if(key1==0&&key_c==1)return?3;
if(key1==0&&key_d==1)return?4;
if(key2==0&&key_a==1)return?5;
if(key2==0&&key_b==1)return?6;
if(key2==0&&key_c==1)return?7;
if(key2==0&&key_d==1)return?8;
if(key3==0&&key_a==1)return?9;
if(key3==0&&key_b==1)return?10;
if(key3==0&&key_c==1)return?11;
if(key3==0&&key_d==1)return?12;
if(key4==0&&key_a==1)return?13;
if(key4==0&&key_b==1)return?14;
if(key4==0&&key_c==1)return?15;
if(key4==0&&key_d==1)return?16;
}
}
}
return?0;
}
3.4.4 示例代碼:?增加按鍵松開檢測
下面代碼里增加了一個靜態變量,記錄按鍵按下的狀態,全部按鍵松開再清除標志位,如果有按鍵沒有松開,就無法進行二次檢測,這樣可以達到精準消抖效果。
示例代碼:
#include?
#define?KEY?P1??//定義按鍵
sbit?key1=KEY^0;
sbit?key2=KEY^1;
sbit?key3=KEY^2;
sbit?key4=KEY^3;
sbit?key5=KEY^4;
sbit?key6=KEY^5;
sbit?key7=KEY^6;
sbit?key8=KEY^7;
/*
矩陣鍵盤掃描函數
矩陣鍵盤尺寸:4*4
接在P1口上。
*/
u8?Array_Scan(void)
{
static?u8?flag=0;
u8?key_a=0,key_b=0,key_c=0,key_d=0;??//用來存放矩陣按鍵按下的標志
KEY=0xF0;?//矩陣鍵盤賦值,4個IO為高電平4個IO為低電平
if((KEY!=0xF0)&&(flag==0))?//判斷是否有按鍵按下
{
DelayMs(50);??//消抖
if((KEY!=0xF0)&&(flag==0))?//再次判斷
{
flag=1;?//記錄按鍵按下
//檢測是哪一排的按鍵的按下了
if(key5==0)key_a=1;?//s1,s5,s9,s13?其中一個按鍵按下
if(key6==0)key_b=1;?//s2?s6?s10?s14?其中一個按鍵按下
if(key7==0)key_c=1;?//s3?s7?s11?s15?其中一個按鍵按下
if(key8==0)key_d=1;?//s4?s8?s12?s16?其中一個按鍵按下
KEY=0x0F;?//反轉法重新賦值
if(KEY!=0x0F)?//檢測按鍵是否按下
{
if(key1==0&&key_a==1)return?1;
if(key1==0&&key_b==1)return?2;
if(key1==0&&key_c==1)return?3;
if(key1==0&&key_d==1)return?4;
if(key2==0&&key_a==1)return?5;
if(key2==0&&key_b==1)return?6;
if(key2==0&&key_c==1)return?7;
if(key2==0&&key_d==1)return?8;
if(key3==0&&key_a==1)return?9;
if(key3==0&&key_b==1)return?10;
if(key3==0&&key_c==1)return?11;
if(key3==0&&key_d==1)return?12;
if(key4==0&&key_a==1)return?13;
if(key4==0&&key_b==1)return?14;
if(key4==0&&key_c==1)return?15;
if(key4==0&&key_d==1)return?16;
}
}
}
else?if(KEY==0xF0)?//按鍵全部松開
{
flag=0;
}
return?0;
}
單片機
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。