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