什么是矩陣鍵盤?4*4鍵盤的原理軟件設(shè)計(jì)分析
一、什么是矩陣鍵盤
矩陣鍵盤是單片機(jī)外部設(shè)備中所使用的排布類似于矩陣的鍵盤組,由于電路設(shè)計(jì)時(shí)需要更多的外部輸入,單獨(dú)的控制一個按鍵需要浪費(fèi)很多的IO資源,所以就有了矩陣鍵盤,常用的矩陣鍵盤有4*4和8*8,其中用的最多的是4*4。
網(wǎng)上搜了兩張實(shí)物圖,大家可以看看
看上圖就知道,4*4鍵盤還是很多地方用到的吧^_^
二、矩陣鍵盤的原理
矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點(diǎn)上,設(shè)置一個按鍵。這樣鍵盤中按鍵的個數(shù)是4&TImes;4個。這種行列式鍵盤結(jié)構(gòu)能夠有效地提高單片機(jī)系統(tǒng)中I/O口的利用率。由于單片機(jī)IO端口具有線與的功能,因此當(dāng)任意一個按鍵按下時(shí),行和列都有一根線被線與,通過運(yùn)算就可以得出按鍵的坐標(biāo)從而判斷按鍵鍵值。
原理如同矩陣數(shù)列的行列式
三、驅(qū)動電路圖
按4*4矩陣搭建的按鍵矩陣還是比較簡單的,也有的人為了保證電路的穩(wěn)定性,加上二極管保護(hù)和上拉電阻,但是一般要求不太高的電路就不需要加了,向下面設(shè)置的電路那樣就可以
四、軟件程序設(shè)計(jì)
根據(jù)4*4鍵盤的原理軟件設(shè)計(jì)程序如下:
//***************************************************
//函數(shù)功能:
//單片機(jī)驅(qū)動4*4鍵盤,讀入鍵盤值并使用數(shù)碼管靜態(tài)
//顯示按鍵鍵值,若沒有數(shù)碼管用8421碼顯示LED燈也可以的
//讀入原理:先令單片機(jī)端口輸出11110000讀一次,然后
//再令單片機(jī)輸出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};
//************************************************
//延時(shí)函數(shù),在12MHz的晶振頻率下
//大約50us的延時(shí)
//************************************************
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; //反過來再讀一次,由于人手按下按鍵的時(shí)間雖然短暫,但是
key_h=P1; //對于單片機(jī)來說,已經(jīng)足夠長,因此可以正反讀取兩次值
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;