在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)鍵盤掃描方法兩種

            單片機(jī)鍵盤掃描方法兩種

            作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
            一、行列掃描法

            矩陣式鍵盤的結(jié)構(gòu)與工作原理:

            本文引用地址:http://www.biyoush.com/article/201611/315921.htm

            在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。

            矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識別及編程方法如下所述。

            矩陣式鍵盤的按鍵識別方法

            確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

            行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

            判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

            判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

            下面給出一個具體的例子:

            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根列線形成16個相交點(diǎn)。

            檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

            去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

            若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(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ī)系統(tǒng)中為了擴(kuò)大同一個 I/O 口的鍵盤個數(shù),則采用了行列式鍵盤接法,就 是交叉相接。所謂的“行”、“列”是我們?nèi)藶橐?guī)定的,如果試著把列看成行,將行看成列是一樣的。
            這里我們規(guī)定 P1.0~P1.3為列,P1.7~P1.4 為行。 如圖所示:

            1、51例子
            舉一個例子吧。
            第一步:行線IO P1.7~P1.4置低電平,列線IO P1.0~P1.3置高電平
            假設(shè)K1按下,那么P1.0=0 讀P1口 P1=00001110
            第二步:行線IO P1.7~P1.4置高電平,列線IO P1.0~P1.3置低電平
            假設(shè)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)的按鍵,會顯示按鍵上的字符
            while(1)
            {
            key=keyscan(); //調(diào)用鍵盤掃描,
            switch(key)
            {
            case 0x7e:P0=dofly[0];break;//0 按下相應(yīng)的鍵顯示相對應(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
            }
            }
            }
            /*------------------------------------------------
            鍵盤掃描程序
            ------------------------------------------------*/

            一、行列掃描法

            矩陣式鍵盤的結(jié)構(gòu)與工作原理:

            在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。

            矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識別及編程方法如下所述。

            矩陣式鍵盤的按鍵識別方法

            確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

            行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

            判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

            判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

            下面給出一個具體的例子:

            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根列線形成16個相交點(diǎn)。

            檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

            去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

            若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(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ī)系統(tǒng)中為了擴(kuò)大同一個 I/O 口的鍵盤個數(shù),則采用了行列式鍵盤接法,就 是交叉相接。所謂的“行”、“列”是我們?nèi)藶橐?guī)定的,如果試著把列看成行,將行看成列是一樣的。
            這里我們規(guī)定 P1.0~P1.3為列,P1.7~P1.4 為行。 如圖所示:

            1、51例子
            舉一個例子吧。
            第一步:行線IO P1.7~P1.4置低電平,列線IO P1.0~P1.3置高電平
            假設(shè)K1按下,那么P1.0=0 讀P1口 P1=00001110
            第二步:行線IO P1.7~P1.4置高電平,列線IO P1.0~P1.3置低電平
            假設(shè)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)的按鍵,會顯示按鍵上的字符
            while(1)
            {
            key=keyscan(); //調(diào)用鍵盤掃描,
            switch(key)
            {
            case 0x7e:P0=dofly[0];break;//0 按下相應(yīng)的鍵顯示相對應(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ù),使用行列反轉(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; //輸出當(dāng)前列線值
            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; //輸出當(dāng)前列線值
            cord_l=P3&0xf0; //讀入行線值
            return(cord_h+cord_l);//鍵盤最后組合碼值
            }
            }return(0xff); //返回該值
            }
            /*------------------------------------------------
            延時程序
            ------------------------------------------------*/
            void delay(uint i) //延時函數(shù)
            {
            while(i--);
            }


            關(guān)鍵詞: 單片機(jī)鍵盤掃

            評論


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

            關(guān)閉