新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī) 4*4 矩陣鍵盤應(yīng)用

單片機(jī) 4*4 矩陣鍵盤應(yīng)用

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
單片機(jī)按鍵使用過程中,當(dāng)鍵盤中按鍵數(shù)量較多時(shí) 為了減少端口的占用通常將按鍵排列成矩陣 形式如下圖所示,在矩陣式鍵盤中 每條水平線和垂直線在交叉處不直接連通而是通過一個(gè)按鍵加以連接,到底這樣做是出意何種目的呢? 大家看下面電路圖,單片機(jī)的整一個(gè)8位端口可以構(gòu)成 4*4=16 個(gè)矩陣式按鍵 ,相比獨(dú)立式按鍵接法多出了一倍,而且線數(shù)越多區(qū)別就越明顯,假如再多加一條線就可以構(gòu)成 20個(gè)按鍵的鍵盤,但是獨(dú)立式按鍵接法只能多出1個(gè)按鍵。由此可見,在需要的按鍵數(shù)量比較多時(shí),采用矩陣法來連接鍵盤是非常合理的,矩陣式結(jié)構(gòu)的鍵盤顯然比獨(dú)立式鍵盤復(fù)雜一些,單片機(jī)對(duì)其進(jìn)行識(shí)別也要復(fù)雜一些。確定矩陣式鍵盤上任何一個(gè)鍵被按下通常采用行掃描法。行掃描法又稱為逐行查詢法它是一種最常用的多按鍵識(shí)別方法。因此,我們就以行掃描法為例介紹矩陣式鍵盤的工作原理。

圖5-4(4*4矩陣式按鍵的接法)

本文引用地址:http://butianyuan.cn/article/201611/321822.htm

首先,不斷循環(huán)地給低四位獨(dú)立的低電平,然后判斷鍵盤中有無鍵按下。將低位中其中一列線(P1.0~P1.3中其中一列)置低電平然后檢測(cè)行線的狀態(tài)(高4位,即P1.4~P1.7,由于線與關(guān)系,只要與低電平列線接通,即跳變成低電平),只要有一行的電平為低就延時(shí)一段時(shí)間以消除抖動(dòng),然后再次判斷,假如依然為低電平,則表示鍵盤中真的有鍵被按下而且閉合的鍵位于低電平的4個(gè)按鍵之中任其一,若所有行線均為高電平則表示鍵盤中無鍵按下。再其次,判斷閉合鍵所在的具體位置。在確認(rèn)有鍵按下后 ,即可進(jìn)入確定具體閉合鍵的過程。其方法是: 依次將列線置為低電平,即在置某一根列線為低電平時(shí),其它列線為高電平。同時(shí)再逐行檢測(cè)各行線的電平狀態(tài) ;若某行為低 ,則該行線與置為低電平的列線交叉處的按鍵就是閉合的按鍵。下面圖5-5是4*4矩陣式按鍵接法的軟件算法操作流程。

下面程序按照上述算法流程去編寫的,其電路如圖5-6,只是在圖5-5的基礎(chǔ)上多加了P0端口的8只LED燈。從鍵盤中檢測(cè)到一個(gè)鍵值,然后將這個(gè)值寫到LED數(shù)碼管上顯示。

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar temp,num;

uchar code Dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff} ;

//0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,0ff

void delay(uchar ms)

{

int i;

while(ms--)

{

for(i=0;i<100;i++) ;

}

}

uchar keyscan()

{

P1=0xfe;

temp=P1;

while(temp!=0xfe)

{

temp=P1;

switch(temp)

{

case 0xee:num=1;

break;

case 0xde:num=2;

break;

case 0xbe:num=3;

break;

case 0x7e:num=4;

break;

}

delay(100);

}

P1=0xfd;

temp=P1;

while(temp!=0xfd)

{

temp=P1;

switch(temp)

{

case 0xed:num=5;

break;

case 0xdd:num=6;

break;

case 0xbd:num=7;

break;

case 0x7d:num=8;

break;

}

delay(100);

}

P1=0xfb;

temp=P1;

while(temp!=0xfb)

{

temp=P1;

switch(temp)

{

case 0xeb:num=9;

break;

case 0xdb:num=10;

break;

case 0xbb:num=11;

break;

case 0x7b:num=12;

break;

}

delay(100);

}

P1=0xf7;

temp=P1;

while(temp!=0xf7)

{

temp=P1;

switch(temp)

{

case 0xe7:num=13;

break;

case 0xd7:num=14;

break;

case 0xb7:num=15;

break;

case 0x77:num=16;

break;

}

delay(100);

}

return num;

}

void Display(uchar Wei_8,uchar Wei_7,uchar Wei_6,uchar Wei_5,uchar Wei_4,uchar Wei_3,uchar Wei_2,uchar Wei_1)

{

P2=0xfe;

P0=Dis_code[Wei_8];

delay(1);

P2=0xfd;

P0=Dis_code[Wei_7];

delay(1);

P2=0xfb;

P0=Dis_code[Wei_6];

delay(1);

P2=0xf7;

P0=Dis_code[Wei_5];

delay(1);

P2=0xef;

P0=Dis_code[Wei_4];

delay(1);

P2=0xdf;

P0=Dis_code[Wei_3];

delay(1);

P2=0xbf;

P0=Dis_code[Wei_2];

delay(1);

P2=0x7f;

P0=Dis_code[Wei_1];

delay(1);

}

void main()

{

while(1)

{

Display(keyscan(),16,16,16,16,16,16,16);

}

}



關(guān)鍵詞: 單片機(jī)4*4矩陣鍵

評(píng)論


技術(shù)專區(qū)

關(guān)閉