新聞中心

msp430矩陣式4*4鍵盤(pán)

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
msp430單片機(jī)矩陣式4*4鍵盤(pán)接口技術(shù)及程序設(shè)計(jì)
V5v



上圖中,列線通過(guò)電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鈕沒(méi)有按下時(shí),所有的輸出端都是高電平,代表無(wú)鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過(guò)讀入輸入線的狀態(tài)就可得知是否有鍵按下了。
矩陣式鍵盤(pán)的按鈕識(shí)別辦法——“行掃描法”。
行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鈕識(shí)別辦法。
判斷鍵盤(pán)中有無(wú)鍵按下將全部行線Y0-Y3置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤(pán)中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鈕之中。若所有列線均為高電平,則鍵盤(pán)中無(wú)鍵按下。
判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過(guò)程。其辦法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。
例如:圖仍如上所示。430單片機(jī)的P1口用作鍵盤(pán)I/O口,鍵盤(pán)的列線接到P1口的低4位,鍵盤(pán)的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個(gè)上拉電阻到正電源5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個(gè)相交點(diǎn)。
檢測(cè)當(dāng)前是否有鍵被按下。檢測(cè)的辦法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無(wú)鍵閉合,不然有鍵閉合。
去除鍵抖動(dòng)。當(dāng)檢測(cè)到有鍵按下后,延時(shí)一段時(shí)間再做下一步的檢測(cè)判斷(以防是干擾)。
若有鍵被按下,應(yīng)識(shí)別出是哪一個(gè)鍵閉合。辦法是對(duì)鍵盤(pán)的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.71110P1.61101P1.51011P1.40111
在每組行輸出時(shí)讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒(méi)有鍵閉合,不然有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值

鍵盤(pán)掃描程序如下:
#include
charkey;
manage_key1()
{}
.................
.................
manage_key16()
{}
voiddelays()
{
intv=500;
while(v!=0)v--;
}
voidkeyscan()
{
charsccode,recode;
P1DIR=0X0f;

P1OUT=0X00;//置所有行為低電平,行掃描,列線輸入(此時(shí))
if((P1IN&0X0F)!=0X0F)//判斷是否有有鍵按下(讀取列的真實(shí)狀態(tài),若第4列有鍵按下則P1的值會(huì)變成01110000),有往下執(zhí)行
{
delays();
if((P1IN&0x0f)!=0x0f)//再次判斷列中是否是干擾信號(hào),不是則向下執(zhí)行
{
sccode=0xef;//逐行掃描初值(即先掃描第1行)
while((sccode&0x01)!=0)//行掃描完成(4行已全部掃描完)sccode為11101111停止while程序
{
P1OUT=sccode;//輸出行掃描碼
if((P1IN&0x0F)!=0X0F)//本行有鍵按下(即P1(真實(shí)的狀態(tài))的高四位不全為1)
{
recode=(P1IN&0x0F)|0xf0;//列(列處于低四位,高四位補(bǔ)1)
key=(sccode&recode);//行和列
}
//所掃描行沒(méi)有鍵按下,則掃描下一行,直到4行都掃描,此時(shí)sccode為11101111退出while程序
else
{
sccode=(sccode<<1)|0x10;;//行掃描碼左移一位
}
}
}
//無(wú)鍵按下,返回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;
}
}



關(guān)鍵詞: msp430矩陣式4*4鍵

評(píng)論


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

關(guān)閉