若單片機需要連接多個按鍵,每個按鍵與單片機的I/O端口單獨連接的方式就不太適用了,因為單片機的I/O端口是單片機系統與外界設備交互的重要資源,如果采用按鍵與I/O端口獨立連接的方式,就會占用過多的I/O端口資源,導致單片機與其它外部設備無法連接。在這種情況下,可以使用矩陣鍵盤,實現多個按鍵與單片機的連接,而且不浪費單片機的I/O端口資源。
矩陣鍵盤是一種很好地節約I/O端口資源的技術方法,矩陣鍵盤將多個按鍵排列成矩陣形式。例如:將16個按鍵排成4行4列,每行將按鍵的一端連接在一起構成行線,每列將按鍵的另一端連接在一起構成列線,這樣一共有4行4列8根線,將這8根線連接到單片機的8個I/O端口上,通過檢測程序掃描矩陣鍵盤就可以檢測16個按鍵。通過這種連接方式,可以實現3行3列9個鍵,5行5列25個鍵,6行6列36個鍵等多個按鍵的檢測。
上圖為設計的4 X 4矩陣鍵盤,每行4個按鍵,每列4個按鍵,可以檢測16個按鍵。每列按鍵的右端連接在一起,分別連接P3.4 ~ P3.7,每行按鍵的左端連接在一起,分別連接P3.0~P3.3,這樣可以使用8個I/O端口檢測16個按鍵。
雖然矩陣鍵盤充分利用了I/O端口資源,但增加了檢測程序的復雜性。因為獨立按鍵有一端固定為低電平,編寫單片機鍵盤檢測程序比較方便,而矩陣鍵盤兩端都與I/O端口相連,因此檢測程序需要向I/O端口人為送出低電平。具體檢測方法:先送一行低電平,其余各行為高電平,現在已經確定了行數(送入低電平的行),然后循環檢測與該行相交的各列是否有低電平,若檢測到某列有低電平,說明與該行相交的某列按鍵被按下,即確定了當前按下的按鍵屬于哪一行哪一列。同理,使用同樣的方法輪流送各行一次低電平,再輪流檢測各列是否有低電平,即可完成所有按鍵的檢測。當然也可以先送各列為低電平,然后再循環檢測各行是否有低電平。
矩陣鍵盤應用案例:應用16個獨立按鍵構成4行4列的矩陣鍵盤,行線接P3.0 ~ P3.3,列線接P3.4~P3.7。按鍵排列順序為:1行1列為第1個按鍵,1行2列為第2個按鍵,……,2行1列為第5個按鍵,2行2列為第6個按鍵,……,4行4列為第16個按鍵。要求用戶按下按鍵1后,數碼管顯示數字1,按下按鍵2后,數碼管顯示數字2,……,依次顯示3,4,5,6,7,8,9,A,B,C,D,E,F。
下圖是矩陣鍵盤案例電路設計圖:
數碼管采用7SEG-MPX1-CA,為共陽極數碼管,獨立按鍵采用SPST Push Button,請同學們參考上圖使用proteus繪制電路設計圖。
單片機內運行的完整C程序如下:
#include
#include
unsigned char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8,0x3,0xc6,0x21,0x6,0xe};
unsigned char key[] = {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
unsigned char rowscan[] = {0xfe,0xfd,0xfb,0xf7};
void delay(unsigned int millisecond)
{
unsigned int i,j;
for(i=millisecond;i >0;i--)
for(j=120;j >0;j--);
}
void show_keyvalue(int keynum)
{
P0 = led[keynum];
delay(100);
}
void marix_keyscan()
{
unsigned int i,j;
unsigned char temp;
for( i = 0; i< 4; i++ )
{
P3 = rowscan[i];
temp = P3;
temp = temp & 0xf0;
if( temp != 0xf0 )
{
delay(10);
temp = P3;
temp = temp & 0xf0;
if( temp != 0xf0 )
{
temp = P3;
for( j = 0; j < 16; j++ )
{
if( temp == key[j] )
break;
}
while(temp != 0xf0)
{
temp = P3;
temp = temp & 0xf0;
}
show_keyvalue(j);
}
}
}
}
void main(void)
{
while(1)
{
marix_keyscan();
}
}
程序設計思路:
按矩陣鍵盤的行線和列線順序對16個按鍵進行編碼,編碼值是矩陣鍵盤某按鍵被按下后P3端口的值。例如:行1列1按鍵被按下后,P3端口的值為0xee,行2列1按鍵被按下后,P3端口的值為0xed。對所有按鍵進行編碼后,可以通過P3端口的值來確定哪個按鍵被按下。
掃描矩陣鍵盤需要對4條行線循環送出低電平,然后再判斷列線是否有低電平。在電路設計中矩陣鍵盤的4條行線接P3口的低4位P3.0 ~ P3.3,因此在行線循環中為P3口賦不同的值,即可完成對4條行線循環送出低電平的操作,1~4條行線送入低電平P3口的值分別為0xfe、0xfd、0xfb、0xf7。
矩陣鍵盤掃描程序需要一個循環結構,循環次數為矩陣鍵盤的行線數量,在循環體內依次為4條行線送入低電平,然后讀取P3口的值,將P3口與0xf0進行與運算,若運算結果不為0xf0,說明有按鍵被按下(有列線為低電平),延遲10ms后再次檢測有按鍵是否被按下,若確認有按鍵被按下,使用for循環遍歷已定義16個按鍵編碼值的數組,定位被按下按鍵的索引,最后調用數碼管顯示函數將按鍵索引對應的字符顯示出來。
代碼說明:
數組led[]定義了數碼管顯示的字符編碼值,數組長度為16。數組key[]定義了16個按鍵的編碼值,數組長度為16。數組rowscan[]定義了4條行線送入低電平P3口的值,數組長度為4。
delay()函數為時間延遲函數,show_keyvalue()為數碼管顯示字符的函數,參數keynum為字符led數組元素的索引,該索引與key數組元素的索引對應。marix_keyscan()為矩陣鍵盤掃描函數,用于檢測按鍵是否被按下。
-
單片機
+關注
關注
6057文章
44811瀏覽量
644266 -
端口
+關注
關注
4文章
1004瀏覽量
32620 -
按鍵
+關注
關注
4文章
225瀏覽量
57885 -
矩陣鍵盤
+關注
關注
7文章
207瀏覽量
31845
發布評論請先 登錄
相關推薦
51單片機矩陣鍵盤檢測問題
如何去實現PIC單片機矩陣鍵盤檢測呢
怎樣去實現PIC單片機矩陣鍵盤檢測呢
51單片機按鍵檢測--獨立按鍵與矩陣鍵盤

51單片機——矩陣鍵盤的檢測

評論