msp430單片機矩陣式4*4鍵盤接口技術(shù)及程序設(shè)計 V5v
上圖中,列線通過電阻接正
電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鈕沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。
矩陣式鍵盤的按鈕識別辦法
——“行掃描法”。
行掃描法
行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鈕識別辦法。
判斷鍵盤中有無鍵按下
將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鈕之中。若所有列線均為高電平,則鍵盤中無鍵按下。
判斷閉合鍵所在的位置
在確認(rèn)有鍵按下后,即可進入確定具體閉合鍵的過程。其辦法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。
例如:圖仍如上所示。430單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個
上拉電阻到正電源
5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個相交點。
檢測當(dāng)前是否有鍵被按下。檢測的辦法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,不然有鍵閉合。
去除鍵
抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷(以防是干擾)。
若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。辦法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.7
1
1
1
0
P1.6
1
1
0
1
P1.5
1
0
1
1
P1.4
0
1
1
1
在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,不然有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值
鍵盤掃描程序如下:
#include
charkey;
manage_key1()
{}
.................
.................
manage_key16()
{}
voiddelays()
{
intv=500;
while(v!=0)v--;
}
voidkeyscan()
{
charsccode,recode;
P1DIR=0X0f;
P1OUT=0X00;//置所有行為低電平,行掃描,列線輸入(此時)
if((P1IN&0X0F)!=0X0F)//判斷是否有有鍵按下(讀取列的真實狀態(tài),若第4列有鍵按下則P1的值會變成01110000),有往下執(zhí)行
{
delays();
if((P1IN&0x0f)!=0x0f)//再次判斷列中是否是干擾信號,不是則向下執(zhí)行
{
sccode=0xef;//逐行掃描初值(即先掃描第1行)
while((sccode&0x01)!=0)//行掃描完成(4行已全部掃描完)sccode為11101111停止while程序
{
P1OUT=sccode;//輸出行掃描碼
if((P1IN&0x0F)!=0X0F)//本行有鍵按下(即P1(真實的狀態(tài))的高四位不全為1)
{
recode=(P1IN&0x0F)|0xf0;//列(列處于低四位,高四位補1)
key=(sccode&recode);//行和列
}
//所掃描行沒有鍵按下,則掃描下一行,直到4行都掃描,此時sccode為11101111退出while程序
else
{
sccode=(sccode<<1)|0x10;;//行掃描碼左移一位
}
}
}
//無鍵按下,返回0
}
}
voidmain()
{
keyscan();
delays();
switch(key)
{
case0xee:manage_key1();break;//11101110
case0xde:manage_key2();break;//11011110
case0xbe:manage_key3();break;//10111110
case0x7e:manage_key4();break;//01111110
case0xed:manage_key5();break;//11101101
case0xdd:manage_key6();break;//11011101
case0xbd:manage_key7();break;//10111101
case0x7d:manage_key8();break;//01111101
case0xeb:manage_key9();break;//11101011
case0xdb:manage_key10();break;//11011011
case0xbb:manage_key11();break;//10111011
case0x7b:manage_key12();break;//01111011
case0xe7:manage_key13();break;//11100111
case0xd7:manage_key14();break;//11010111
case0xb7:manage_key15();break;//10110111
case0x77:manage_key16();break;//01110111
default:break;
}
}
評論