前面提到了獨立按鍵,可見,獨立按鍵是由矩陣鍵盤分離而來的。接下來看的是 4*4 的矩陣鍵盤,這里使用的還是上節所使用的,延時消抖檢測。?
先附上矩陣鍵盤的原理圖:?
在使用據矩陣鍵盤時,J5 排針處的跳帽連接 1 腳和 2 腳,使所有按鍵的有效端口全部連接至 I/O 口。?
具體的掃描方式為:?
先把P3^0~P3^7高四位和第四位賦不一樣的電平值,當確定有鍵按下時,檢測按下的是哪一行或哪一列(原本高電平的四位中有一位會變低電平),再將高四位和第四位賦與上一次相反的電平。再檢測,即可找到所按下的按鍵。
實例為:把S4~S19 這16個按鍵,從上到下、從左至右,分別設置為1~16不同的鍵值,當S4按下時,數碼管顯示為 1;當S19按下時,數碼管顯示為16。?
其核心代碼如下(數碼管段碼,顯示函數等變量的定義,請參照前面給出的數碼管的博文):
uchar temp; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //用于存儲 P3 口的狀態
uchar key_value = 0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//鍵值的定義
void matrixKeyScan()
{
P3 = 0x0f; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設置P3高四位為0,第四位為1
temp = P3; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//用一個變量存儲P3口的狀態,以免外界影響P3口,從而造成掃描有誤
if(temp != 0x0f)
{
delay10ms();
if(temp!= 0x0f) ? ? ? ? ? ? ? ? ? ? ? ? ? ? //確定有鍵按下
{ ? ? ??
switch(temp) ? ? ? ? ? ? ? ? ? ? ? ? ? ?//查看P3(temp)的狀態
{
case 0x0e :key_value = 1; break; ? ?//按下的為第一行
case 0x0d :key_value = 5; break; ? ?
case 0x0b :key_value = 9; break; ? ?
case 0x07 :key_value = 13;break; ? ?//按下的為第四行
} ??
} ??
P3 = 0xf0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//再將 P3 口重新賦值,高四位為1,第四位為0
temp = P3;
if(temp != 0xf0)
{
switch(temp)
{
case 0xe0 : key_value +=3 ; break; ? //按下的是第四列,鍵值key_value加3
case 0xd0 : key_value +=2 ; break;
case 0xb0 : key_value +=1 ; break;
case 0x70 : key_value +=0 ; break; ? //按下的是第一列,鍵值key_value加0
}
}
while(P3 != 0xf0); ? ? ? ? ? ? ? ? ? ? ? ? ? //松手檢測,因為最近的一次賦值是P3 = 0xf0
}
}
void main()
{
while(1)
{
matrixKeyScan(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //在主函數中調用矩陣鍵盤掃描函數
if(key_value > 9) ? ? ? ? ? ? ? ? ? ? ? ? ? ?//判斷鍵值,并顯示
{?
dspbuf[1] = key_value%10; ?
dspbuf[0] = key_value/10;
}
else
{
dspbuf[0] = key_value;
dspbuf[1] = 10; ? ? ? ? ? ? ? ? ? ? ? ? ? //若鍵值小于10,則十位不顯示,只顯示個位,段碼數組第10個為消影
}?
display(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//數碼管顯示函數
}
}
注:在此我們基于的是89C52單片機的按鍵掃描,但是對于藍橋杯指定開發板平臺(CT107D)所用的單片機為STC15F2K61S2,它與STC89C52在矩陣鍵盤的區別的是:前者沒有P3^6和P3^7這兩個 I/O 口,他們分別用P4^2,P4^4代替,具體的可以就參照STC15F2K61S2芯片手冊(其他的區別大致有:它的運行速度比51單片機快,工作時可以選擇是否分頻;它的中斷模式比51多,一些 I/O 口有其他功能等等……)。
這里有幾點需要注意:?
1、在編程時,主函數盡可能少的進行一些數據處理等操作,主函數主要用來調用其他的函數。?
2、若使用的是STC15F2K61S2單片機,則在給 P3 口的兩次賦值和高四位的電平檢測階段,需要將P4^2,P4^4單獨列出來,與其余6個P3引腳的 I/O 口一起檢測,并且在使用P4^2,P4^4之前,需要進行sbit位定義,以及 P4 引腳的尋址(srf P4 = 0xC0)。?
3、P3口的第二次賦值,應該也囊括在第一個 if 語句之中,因為只有當確定按下之后,才會開始行與列的掃描,行、列掃描是對于一次按鍵的掃描,所以不可分開。
評論
查看更多