3個(gè)IO口掃描16個(gè)按鍵
該 電路在程序處理時(shí),由處理器首先向I/O1~I(xiàn)/O3寫高電平,然后讀入。如果非全“1”,說明,K0~K6中有鍵按下,此時(shí)可根據(jù)讀入的端口狀態(tài)判斷鍵 的狀態(tài),如果讀入的結(jié)果為全“1”,則I/O1~I(xiàn)/O3輪流輸出低電平,再讀入,這樣就可根據(jù)另外兩根I/O線的狀態(tài)來判別是K7~K15中的哪一個(gè)鍵 被按下。重復(fù)調(diào)用鍵盤處理子程序可將讀取的鍵值與上次的值進(jìn)行比較,甚至兩次讀數(shù)相同為止,這樣即可消除按鍵抖動(dòng)所造成的誤讀。該電路選用的單片機(jī)為
AT89C2051
,用C51語言編寫的按鍵電路處理程序如下:
#include
#define uchar unsigned char
uchar getkey(void);
uchar keyvol;
void main(void)
{
keyvol=getkey(); /*調(diào)用鍵處理函數(shù),返回的數(shù)據(jù)等于16表示同有鍵按下,0至15對(duì)應(yīng)k0至K15*/
}
以下為鍵盤處理子程序:
uchar getkey(void)
{
uchar x
P1=P1|0x07; /*I/O1至I/O3寫“1”*/
x=P1&0x07; /*讀入I/O1至I/O3并屏蔽其它位*/
if(x==0x07) /*判斷K0至K6是否按下并轉(zhuǎn)換鍵值*/
{
P1=P1&0xfe; /*
I/O1寫“0”*/
x=P1&0x07;
x=x/2+7;
if(x= =10)
{
P1=P1|0x07;
P1=P1&0xfd; /*I/O2寫“0”*/
x=P1&0x07;
x=(x+1)/2+10; /*屏蔽I/O2并轉(zhuǎn)換K10至K12的鍵值*/
if(x = =13)
{
P1=P1|0x07;
P1=P1&0xfb; /*I/O3寫“0”*/
x=P1&0x07;
x=x+13; /*屏蔽I/O3并轉(zhuǎn)換K13至K15的鍵值*/
}
}
}
return x;
}
利用該鍵盤電路并根據(jù)邏輯組合原理可推斷開n條I/O線可組合的按鍵數(shù)N為:
N=(2n-1)+(2 n-1 -1)n
個(gè)人覺得自己寫程序的時(shí)候有個(gè)地方需要注意:當(dāng)IO口賦值011,按k0之后IO讀數(shù)為000,按k13讀數(shù)也為000,所以如果檢測到到k0到k6,這幾個(gè)都沒按才可以繼續(xù)檢測k7到k15.