一、什么是矩陣鍵盤
矩陣鍵盤是單片機外部設備中所使用的排布類似于矩陣的鍵盤組,由于電路設計時需要更多的外部輸入,單獨的控制一個按鍵需要浪費很多的IO資源,所以就有了矩陣鍵盤,常用的矩陣鍵盤有4*4和8*8,其中用的最多的是4*4。
網上搜了兩張實物圖,大家可以看看
看上圖就知道,4*4鍵盤還是很多地方用到的吧^_^
二、矩陣鍵盤的原理
矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數是4×4個。這種行列式鍵盤結構能夠有效地提高單片機系統中I/O口的利用率。由于單片機IO端口具有線與的功能,因此當任意一個按鍵按下時,行和列都有一根線被線與,通過運算就可以得出按鍵的坐標從而判斷按鍵鍵值。
原理如同矩陣數列的行列式
三、驅動電路圖
按4*4矩陣搭建的按鍵矩陣還是比較簡單的,也有的人為了保證電路的穩定性,加上二極管保護和上拉電阻,但是一般要求不太高的電路就不需要加了,向下面設置的電路那樣就可以
四、軟件程序設計
根據4*4鍵盤的原理軟件設計程序如下:
//*************************************************** ?
//函數功能: ?
//單片機驅動4*4鍵盤,讀入鍵盤值并使用數碼管靜態 ?
//顯示按鍵鍵值,若沒有數碼管用8421碼顯示LED燈也可以的 ?
//讀入原理:先令單片機端口輸出11110000讀一次,然后 ?
//再令單片機輸出00001111讀一次把兩次的值相加,最后 ?
//獲取一個高位和低位分別有0的值即可判斷鍵值, ?
//如11101110 ?
//*************************************************** ?
#include ?
#define uchar unsigned char ??
#define uint unsigned int ??
unsigned char code smg_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; ?
//************************************************ ?
//延時函數,在12MHz的晶振頻率下 ?
//大約50us的延時 ?
//************************************************ ?
void delay_50us(uint t) ?
{ ?
uchar j; ?
for(;t>0;t--) ?
for(j=19;j>0;j--); ?
} ?
void main() ?
{ ?
uchar key_l,key_h; ?
uchar key; ?
while(1) ?
{ ?
P1=0xf0; ?
key_l=P1; ? ? ? ? ?//讀P1端口的值 ?
key_l=key_l&0xf0; ?//令低4位置位為0 ?
if(key_l!=0xf0) ? ?//判斷是否有按鍵按下 ?
{ ?
delay_50us(100); ?
if(key_l!=0xf0) ?
{ ? ? ? ? ? ? ? ? //若有按鍵按下,則切換高低4位判斷鍵值 ?
key_l=P1&0xf0; ? //11100000 ?獲取第一次鍵值 ?
key_l=key_l"0x0f;//11101111 ? ??
P1=key_l; ? ? ? ?//反過來再讀一次,由于人手按下按鍵的時間雖然短暫,但是 ?
key_h=P1; ? ? ? ?//對于單片機來說,已經足夠長,因此可以正反讀取兩次值 ?
key_h=key_h&0x0f;//00001110 ?
key_l=key_l&0xf0;//11100000 ?
key=key_h+key_l; //11101110 ?
} ?
} ?
switch (key) ?
{ ?
case 0xee:P2=smg_d[0];break; ?
case 0xde:P2=smg_d[1];break; ?
case 0xbe:P2=smg_d[2];break; ?
case 0x7e:P2=smg_d[3];break; ?
case 0xed:P2=smg_d[4];break; ?
case 0xdd:P2=smg_d[5];break; ?
case 0xbd:P2=smg_d[6];break; ?
case 0x7d:P2=smg_d[7];break; ?
case 0xeb:P2=smg_d[8];break; ?
case 0xdb:P2=smg_d[9];break; ?
case 0xbb:P2=smg_d[10];break; ?
case 0x7b:P2=smg_d[11];break; ?
case 0xe7:P2=smg_d[12];break; ?
case 0xd7:P2=smg_d[13];break; ?
case 0xb7:P2=smg_d[14];break; ?
case 0x77:P2=smg_d[15];break; ?
評論
查看更多