一、部隊掃描法
矩陣式鍵盤的構(gòu)造與作業(yè)原理:
在鍵盤中按鍵數(shù)量較多時,為了削減I/O口的占用,一般將按鍵擺放成矩陣方法,如圖1所示。在矩陣式鍵盤中,每條水平線和筆直線在穿插處不直接連通,而是通過一個按鍵加以聯(lián)接。這么,一個端口(如P1口)就能夠構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,并且線數(shù)越多,差異越顯著,比方再多加一條線就能夠構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需求的鍵數(shù)比照多時,選用矩陣法來做鍵盤是合理的。
矩陣式構(gòu)造的鍵盤顯著比直接法要雜亂一些,辨認(rèn)也要雜亂一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這么,當(dāng)按鍵沒有按下時,悉數(shù)的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這么,通過讀入輸入線的情況就可得知是不是有鍵按下了。詳細(xì)的辨認(rèn)及編程方法如下所述。
矩陣式鍵盤的按鍵辨認(rèn)方法
斷定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。
行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵辨認(rèn)方法,如上圖所示鍵盤,介紹進(jìn)程如下。
差異鍵盤中有無鍵按下 將悉數(shù)行線Y0-Y3置低電平,然后查看列線的情況。只需有一列的電平為低,則標(biāo)明鍵盤中有鍵被按下,并且閉合的鍵坐落低電平線與4根行線相穿插的4個按鍵傍邊。若悉數(shù)列線均為高電平,則鍵盤中無鍵按下。
差異閉合鍵地址的方位 在供認(rèn)有鍵按下后,即可進(jìn)入斷定詳細(xì)閉合鍵的進(jìn)程。其方法是:順次將行線置為低電平,即在置某根行線為低電往常,其它線為高電平。在斷定某根行線方位為低電平后,再逐行查看各列線的電平情況。若某列為低,則該列線與置為低電平的行線穿插處的按鍵即是閉合的按鍵。
下面給出一個詳細(xì)的比方:
8031單片機(jī)的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根列線構(gòu)成16個相交點(diǎn)。
查看其時是不是有鍵被按下。查看的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的情況,若P1.0-P1.3為全“1”,則無鍵閉合,不然有鍵閉合。
去掉鍵顫抖。當(dāng)查看到有鍵按下后,延時一段時刻再做下一步的查看差異。
若有鍵被按下,應(yīng)辨認(rèn)出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。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
二、部隊回轉(zhuǎn)法
了解部隊鍵盤掃描得從硬件開端學(xué)習(xí),咱們得知道部隊掃描是啥意思。在 單片機(jī)體系中為了拓寬同一個 I/O 口的鍵盤個數(shù),則選用了部隊式鍵盤接法,就 是穿插相接。所謂的“行”、“列”是咱們?nèi)藶橐?guī)矩的,假定試著把列當(dāng)作行,將行當(dāng)作列是相同的。
這兒咱們規(guī)矩 P1.0~P1.3為列,P1.7~P1.4 為行。 如圖所示:
1、51比方
舉一個比方吧。
榜首步:行線IO P1.7~P1.4置低電平,列線IO P1.0~P1.3置高電平
假定K1按下,那么P1.0=0 讀P1口 P1=00001110
第二步:行線IO P1.7~P1.4置高電平,列線IO P1.0~P1.3置低電平
假定K1按下,那么P1.7=0 讀P1口 P1=01110000
兩個字節(jié)相加,得到新數(shù)據(jù):01111110(榜首行 榜首列)
每按一個鍵咱們都得到紛歧樣的字節(jié),比對咱們的字節(jié)是啥就能夠知道鍵值是啥了。
/////////////////////////////////////////////////////////////////////
#include //包括頭文件,一般情況不需求改動,頭文件包括分外功用寄存器的界說
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函數(shù)聲明
------------------------------------------------*/
uchar keyscan(void);//鍵盤掃描
void delay(uint i); //演示程序
/*------------------------------------------------
主函數(shù)
------------------------------------------------*/
void main()
{
uchar key;
P2=0x00; //1數(shù)碼管亮 按相應(yīng)的按鍵,會閃現(xiàn)按鍵上的字符
while(1)
{
key=keyscan(); //調(diào)用鍵盤掃描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相應(yīng)的鍵閃現(xiàn)相對應(yīng)的碼值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
}
}
/*------------------------------------------------
鍵盤掃描程序
------------------------------------------------*/
一、部隊掃描法
矩陣式鍵盤的構(gòu)造與作業(yè)原理:
在鍵盤中按鍵數(shù)量較多時,為了削減I/O口的占用,一般將按鍵擺放成矩陣方法,如圖1所示。在矩陣式鍵盤中,每條水平線和筆直線在穿插處不直接連通,而是通過一個按鍵加以聯(lián)接。這么,一個端口(如P1口)就能夠構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,并且線數(shù)越多,差異越顯著,比方再多加一條線就能夠構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需求的鍵數(shù)比照多時,選用矩陣法來做鍵盤是合理的。
矩陣式構(gòu)造的鍵盤顯著比直接法要雜亂一些,辨認(rèn)也要雜亂一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這么,當(dāng)按鍵沒有按下時,悉數(shù)的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這么,通過讀入輸入線的情況就可得知是不是有鍵按下了。詳細(xì)的辨認(rèn)及編程方法如下所述。
矩陣式鍵盤的按鍵辨認(rèn)方法
斷定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。
行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵辨認(rèn)方法,如上圖所示鍵盤,介紹進(jìn)程如下。
差異鍵盤中有無鍵按下 將悉數(shù)行線Y0-Y3置低電平,然后查看列線的情況。只需有一列的電平為低,則標(biāo)明鍵盤中有鍵被按下,并且閉合的鍵坐落低電平線與4根行線相穿插的4個按鍵傍邊。若悉數(shù)列線均為高電平,則鍵盤中無鍵按下。
差異閉合鍵地址的方位 在供認(rèn)有鍵按下后,即可進(jìn)入斷定詳細(xì)閉合鍵的進(jìn)程。其方法是:順次將行線置為低電平,即在置某根行線為低電往常,其它線為高電平。在斷定某根行線方位為低電平后,再逐行查看各列線的電平情況。若某列為低,則該列線與置為低電平的行線穿插處的按鍵即是閉合的按鍵。
下面給出一個詳細(xì)的比方:
8031單片機(jī)的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根列線構(gòu)成16個相交點(diǎn)。
查看其時是不是有鍵被按下。查看的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的情況,若P1.0-P1.3為全“1”,則無鍵閉合,不然有鍵閉合。
去掉鍵顫抖。當(dāng)查看到有鍵按下后,延時一段時刻再做下一步的查看差異。
若有鍵被按下,應(yīng)辨認(rèn)出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。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
二、部隊回轉(zhuǎn)法
了解部隊鍵盤掃描得從硬件開端學(xué)習(xí),咱們得知道部隊掃描是啥意思。在 單片機(jī)體系中為了拓寬同一個 I/O 口的鍵盤個數(shù),則選用了部隊式鍵盤接法,就 是穿插相接。所謂的“行”、“列”是咱們?nèi)藶橐?guī)矩的,假定試著把列當(dāng)作行,將行當(dāng)作列是相同的。
這兒咱們規(guī)矩 P1.0~P1.3為列,P1.7~P1.4 為行。 如圖所示:
1、51比方
舉一個比方吧。
榜首步:行線IO P1.7~P1.4置低電平,列線IO P1.0~P1.3置高電平
假定K1按下,那么P1.0=0 讀P1口 P1=00001110
第二步:行線IO P1.7~P1.4置高電平,列線IO P1.0~P1.3置低電平
假定K1按下,那么P1.7=0 讀P1口 P1=01110000
兩個字節(jié)相加,得到新數(shù)據(jù):01111110(榜首行 榜首列)
每按一個鍵咱們都得到紛歧樣的字節(jié),比對咱們的字節(jié)是啥就能夠知道鍵值是啥了。
/////////////////////////////////////////////////////////////////////
#include //包括頭文件,一般情況不需求改動,頭文件包括分外功用寄存器的界說
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函數(shù)聲明
------------------------------------------------*/
uchar keyscan(void);//鍵盤掃描
void delay(uint i); //演示程序
/*------------------------------------------------
主函數(shù)
------------------------------------------------*/
void main()
{
uchar key;
P2=0x00; //1數(shù)碼管亮 按相應(yīng)的按鍵,會閃現(xiàn)按鍵上的字符
while(1)
{
key=keyscan(); //調(diào)用鍵盤掃描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相應(yīng)的鍵閃現(xiàn)相對應(yīng)的碼值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
}
}
/*------------------------------------------------
鍵盤掃描程序
------------------------------------------------*/
uchar keyscan(void) //鍵盤掃描函數(shù),運(yùn)用部隊回轉(zhuǎn)掃描法
{
uchar cord_h,cord_l;//部隊值基地變量
P3=0x0f; //行線輸出全為0
cord_h=P3&0x0f; //讀入列線值
if(cord_h!=0x0f) //先查看有無按鍵按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出其時列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l);//鍵盤終究組合碼值
}
}return(0xff); //回來該值
}
/*------------------------------------------------
延時程序
------------------------------------------------*/
void delay(uint i) //延時函數(shù)
{
while(i--);
} cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出其時列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l);//鍵盤終究組合碼值
}
}return(0xff); //回來該值
}
/*------------------------------------------------
延時程序
------------------------------------------------*/
void delay(uint i) //延時函數(shù)
{
while(i--);
}
評論
查看更多