導(dǎo)語
獨立按鍵在系統(tǒng)中大量使用,會占用大量的IO口,因此采用矩陣按鍵的設(shè)計。使用 8個 IO可實現(xiàn)了 16個按鍵,與此對應(yīng)的也可以設(shè)計更為復(fù)雜的電路,來實現(xiàn)更少的IO,更多的按鍵,本質(zhì)上都是通過IO捕獲電平上的變化。
矩陣按鍵
電路
通過行與列的掃描來檢查那個IO電平被按下,而當(dāng)某一個按鍵按下時,改按鍵對應(yīng)的行和列就會短接,當(dāng)按鍵按下時,一個高電平和低電平短接會把高電平拉低。
逐行掃描:高4位P17-P14鏈接每一行,依次把每一行設(shè)置為低電平,把低4位設(shè)置未高電平,然后檢測第四位是否全為1,如果不全為1,說明有按鍵按下,電平被拉低,也就是對應(yīng)的按鍵被按下,如此循環(huán)檢測每一行;其實根據(jù)原理可以看出來,除了逐行掃描,也可以逐列掃描,原理相同;
行列掃描:和逐行或逐列掃描不通的是行列掃描;掃描原理是先把高4位設(shè)置為低電平,把低4位設(shè)置為高電平,這樣如果低4位中有電平變低,說明該列有按鍵按下,但不知道具體是哪一行的按鍵;接著反過來操作,把高4位設(shè)置為高電平,低四位設(shè)置為低電平,檢測高4位哪一位被拉低,那么按鍵就在對應(yīng)的行上,這樣通過兩次掃描就知道該按鍵在哪一行哪一列了,也就知道具體是哪個按鍵被按下了。
程序
void KeyScan()
{
//4*4矩陣鍵盤掃描
P3 = 0XF0;//列掃描
if(P3 != 0XF0)//判斷按鍵是否被按下
{
delay(10);//軟件消抖10ms
if(P3 != 0XF0)//判斷按鍵是否被按下
{
switch(P3) //判斷那一列被按下
{
case 0xe0:KeyValue = 0;break;//第一列被按下
case 0xd0:KeyValue = 1;break;//第二列被按下
case 0xb0:KeyValue = 2;break;//第三列被按下
case 0x70:KeyValue = 3;break;//第四列被按下
}
P3 = 0X0F;//行掃描
switch(P3) //判斷那一行被按下
{
case 0x0e:KeyValue = KeyValue;break;//第一行被按下
case 0x0d:KeyValue = KeyValue + 4;break;//第二行被按下
case 0x0b:KeyValue = KeyValue + 8;break;//第三行被按下
case 0x07:KeyValue = KeyValue + 12;break;//第四行被按下
}
while(P3 != 0X0F);//松手檢測
}
}
P3 = 0XFF;//獨立按鍵掃描
if(P3 != 0XFF)
{
delay(10);//軟件消抖10ms
if(P3 != 0XFF)
{
switch(P3) //判斷那一行被按下
{
case 0xfe:KeyValue = 16;break;//S2被按下
case 0xfd:KeyValue = 17;break;//S3被按下
case 0xfb:KeyValue = 18;break;//S4被按下
case 0xf7:KeyValue = 19;break;//S5被按下
}
while(P3 != 0XFF);//松手檢測
}
}
}
其他鍵盤
8個IO控制64個IO。
審核編輯:湯梓紅
-
單片機
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631981 -
51單片機
+關(guān)注
關(guān)注
273文章
5697瀏覽量
122993 -
矩陣按鍵
+關(guān)注
關(guān)注
0文章
28瀏覽量
8356 -
獨立按鍵
+關(guān)注
關(guān)注
1文章
45瀏覽量
11534
發(fā)布評論請先 登錄
相關(guān)推薦
評論