0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于單片機的矩陣鍵盤檢測案例

CHANBAEK ? 來源:郎哥編程課堂 ? 作者:郎宏林 ? 2023-10-31 14:35 ? 次閱讀

單片機需要連接多個按鍵,每個按鍵與單片機的I/O端口單獨連接的方式就不太適用了,因為單片機的I/O端口是單片機系統(tǒng)與外界設(shè)備交互的重要資源,如果采用按鍵與I/O端口獨立連接的方式,就會占用過多的I/O端口資源,導(dǎo)致單片機與其它外部設(shè)備無法連接。在這種情況下,可以使用矩陣鍵盤,實現(xiàn)多個按鍵與單片機的連接,而且不浪費單片機的I/O端口資源。

矩陣鍵盤是一種很好地節(jié)約I/O端口資源的技術(shù)方法,矩陣鍵盤將多個按鍵排列成矩陣形式。例如:將16個按鍵排成4行4列,每行將按鍵的一端連接在一起構(gòu)成行線,每列將按鍵的另一端連接在一起構(gòu)成列線,這樣一共有4行4列8根線,將這8根線連接到單片機的8個I/O端口上,通過檢測程序掃描矩陣鍵盤就可以檢測16個按鍵。通過這種連接方式,可以實現(xiàn)3行3列9個鍵,5行5列25個鍵,6行6列36個鍵等多個按鍵的檢測。

圖片

上圖為設(shè)計的4 X 4矩陣鍵盤,每行4個按鍵,每列4個按鍵,可以檢測16個按鍵。每列按鍵的右端連接在一起,分別連接P3.4 ~ P3.7,每行按鍵的左端連接在一起,分別連接P3.0~P3.3,這樣可以使用8個I/O端口檢測16個按鍵。

雖然矩陣鍵盤充分利用了I/O端口資源,但增加了檢測程序的復(fù)雜性。因為獨立按鍵有一端固定為低電平,編寫單片機鍵盤檢測程序比較方便,而矩陣鍵盤兩端都與I/O端口相連,因此檢測程序需要向I/O端口人為送出低電平。具體檢測方法:先送一行低電平,其余各行為高電平,現(xiàn)在已經(jīng)確定了行數(shù)(送入低電平的行),然后循環(huán)檢測與該行相交的各列是否有低電平,若檢測到某列有低電平,說明與該行相交的某列按鍵被按下,即確定了當(dāng)前按下的按鍵屬于哪一行哪一列。同理,使用同樣的方法輪流送各行一次低電平,再輪流檢測各列是否有低電平,即可完成所有按鍵的檢測。當(dāng)然也可以先送各列為低電平,然后再循環(huán)檢測各行是否有低電平。

矩陣鍵盤應(yīng)用案例:應(yīng)用16個獨立按鍵構(gòu)成4行4列的矩陣鍵盤,行線接P3.0 ~ P3.3,列線接P3.4~P3.7。按鍵排列順序為:1行1列為第1個按鍵,1行2列為第2個按鍵,……,2行1列為第5個按鍵,2行2列為第6個按鍵,……,4行4列為第16個按鍵。要求用戶按下按鍵1后,數(shù)碼管顯示數(shù)字1,按下按鍵2后,數(shù)碼管顯示數(shù)字2,……,依次顯示3,4,5,6,7,8,9,A,B,C,D,E,F。

下圖是矩陣鍵盤案例電路設(shè)計圖:

圖片

數(shù)碼管采用7SEG-MPX1-CA,為共陽極數(shù)碼管,獨立按鍵采用SPST Push Button,請同學(xué)們參考上圖使用proteus繪制電路設(shè)計圖。

單片機內(nèi)運行的完整C程序如下:

#include
#include
unsigned char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8,0x3,0xc6,0x21,0x6,0xe};
unsigned char key[] = {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
unsigned char rowscan[] = {0xfe,0xfd,0xfb,0xf7};
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}
void show_keyvalue(int keynum)
{
              P0 = led[keynum];
         delay(100);
}
void marix_keyscan()
{
       unsigned int i,j;
       unsigned char temp;
       for( i = 0; i< 4; i++ )
       {
               P3 = rowscan[i];
               temp = P3;
               temp = temp & 0xf0;
               if( temp != 0xf0 )
               {
                        delay(10);
                       temp = P3;
                  temp = temp & 0xf0;
                       if( temp != 0xf0 )
                            {
                               temp = P3;
                                    for( j = 0; j < 16; j++ )
                                    {
                                           if( temp == key[j] )
                                                          break;
                                    }
                                    while(temp != 0xf0)
                                    {
                                            temp = P3;
                                            temp = temp & 0xf0;
                                    }
                                    show_keyvalue(j);
                            }
               }
    
       }
}
void main(void)
{
        while(1)
        {
                 marix_keyscan();
        }
 }

程序設(shè)計思路:

按矩陣鍵盤的行線和列線順序?qū)?6個按鍵進行編碼,編碼值是矩陣鍵盤某按鍵被按下后P3端口的值。例如:行1列1按鍵被按下后,P3端口的值為0xee,行2列1按鍵被按下后,P3端口的值為0xed。對所有按鍵進行編碼后,可以通過P3端口的值來確定哪個按鍵被按下。

掃描矩陣鍵盤需要對4條行線循環(huán)送出低電平,然后再判斷列線是否有低電平。在電路設(shè)計中矩陣鍵盤的4條行線接P3口的低4位P3.0 ~ P3.3,因此在行線循環(huán)中為P3口賦不同的值,即可完成對4條行線循環(huán)送出低電平的操作,1~4條行線送入低電平P3口的值分別為0xfe、0xfd、0xfb、0xf7。

矩陣鍵盤掃描程序需要一個循環(huán)結(jié)構(gòu),循環(huán)次數(shù)為矩陣鍵盤的行線數(shù)量,在循環(huán)體內(nèi)依次為4條行線送入低電平,然后讀取P3口的值,將P3口與0xf0進行與運算,若運算結(jié)果不為0xf0,說明有按鍵被按下(有列線為低電平),延遲10ms后再次檢測有按鍵是否被按下,若確認(rèn)有按鍵被按下,使用for循環(huán)遍歷已定義16個按鍵編碼值的數(shù)組,定位被按下按鍵的索引,最后調(diào)用數(shù)碼管顯示函數(shù)將按鍵索引對應(yīng)的字符顯示出來。

代碼說明:

數(shù)組led[]定義了數(shù)碼管顯示的字符編碼值,數(shù)組長度為16。數(shù)組key[]定義了16個按鍵的編碼值,數(shù)組長度為16。數(shù)組rowscan[]定義了4條行線送入低電平P3口的值,數(shù)組長度為4。

delay()函數(shù)為時間延遲函數(shù),show_keyvalue()為數(shù)碼管顯示字符的函數(shù),參數(shù)keynum為字符led數(shù)組元素的索引,該索引與key數(shù)組元素的索引對應(yīng)。marix_keyscan()為矩陣鍵盤掃描函數(shù),用于檢測按鍵是否被按下。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628292
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    915

    瀏覽量

    31856
  • 按鍵
    +關(guān)注

    關(guān)注

    4

    文章

    222

    瀏覽量

    57490
  • 矩陣鍵盤
    +關(guān)注

    關(guān)注

    7

    文章

    205

    瀏覽量

    31345
收藏 人收藏

    評論

    相關(guān)推薦

    [下載]Pic單片機視頻教程

    第三講 PIC單片機獨立鍵盤檢測原理及實現(xiàn)。 53分 第四講 PIC單片機矩陣鍵盤
    發(fā)表于 03-26 16:39

    郭天祥十天學(xué)會PIC單片機和C語言視頻教程 強烈推薦 零基

    。內(nèi)容:PIC單片機獨立鍵盤檢測原理及實現(xiàn)。Lesson4:時間:45分。內(nèi)容:PIC單片機矩陣鍵盤
    發(fā)表于 12-19 09:00

    51單片機矩陣鍵盤檢測問題

    不知道哪里有問題,按鍵按下去數(shù)碼管都沒反應(yīng)#include#define uint unsigned int#define uchar unsigned charuchar num,temp;***it key1=P3^4;***it dula=P2^6;***it wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){dula=1;P0=0;dula=0;wela=1;P0=0xc0;wela=0;while(1){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0);{temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}dula=1;P0=table[num-1];dula=0;}}}}
    發(fā)表于 10-15 21:34

    【郭天祥】十天學(xué)會單片機【視頻目錄】

    :PIC單片機獨立鍵盤檢測原理及實現(xiàn)。 5、Lesson4:時間:45分。內(nèi)容:PIC單片機矩陣鍵盤
    發(fā)表于 06-27 21:48

    如何去實現(xiàn)PIC單片機矩陣鍵盤檢測

    uchar unsigned char#define uintunsigned int__CONFIG(0x3B31);const uchar table[]={0x3f,0x0...
    發(fā)表于 11-24 06:47

    怎樣去實現(xiàn)PIC單片機矩陣鍵盤檢測

    uchar unsigned char#define uintunsigned int__CONFIG(0x3B31);const uchar table[]={0x3f,0x0...
    發(fā)表于 11-24 06:21

    3.3V單片機系統(tǒng)中矩陣鍵盤檢測電路的改進

    本文提出了一種解決3.3V單片機系統(tǒng)中矩陣鍵盤檢測問題的方法
    發(fā)表于 03-24 15:35 ?1次下載

    單片機8x8矩陣鍵盤原理說明

    本文主要介紹了介紹基于51單片機矩陣鍵盤原理以及單片機8x8矩陣鍵盤原理說明,另外還詳細(xì)的附上
    的頭像 發(fā)表于 02-24 16:14 ?2.5w次閱讀
    <b class='flag-5'>單片機</b>8x8<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>原理說明

    單片機鍵盤檢測與應(yīng)用

    非編碼鍵盤通常又分為獨立鍵盤矩陣鍵盤兩大類。所謂獨立鍵盤是指按鍵在與單片機相連時,每一個按鍵都
    的頭像 發(fā)表于 09-18 16:34 ?5191次閱讀

    51單片機按鍵檢測--獨立按鍵與矩陣鍵盤

    按鍵,每個按鍵對應(yīng)一個IO口,通過循環(huán)或者中斷去檢測,這種方法常用于按鍵個數(shù)較少得時候。如果按鍵的個數(shù)較多,每個按鍵都分配一個IO口,會占用大量的資源,所以就有了矩陣鍵盤。矩陣
    發(fā)表于 11-12 11:06 ?15次下載
    51<b class='flag-5'>單片機</b>按鍵<b class='flag-5'>檢測</b>--獨立按鍵與<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>

    PIC單片機矩陣鍵盤檢測原理及實現(xiàn)

    PIC單片機矩陣鍵盤檢測原理及實現(xiàn)
    發(fā)表于 11-16 11:51 ?2次下載
    PIC<b class='flag-5'>單片機</b><b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b><b class='flag-5'>檢測</b>原理及實現(xiàn)

    PIC單片機矩陣鍵盤檢測原理及實現(xiàn)

    PIC單片機矩陣鍵盤檢測原理及實現(xiàn)
    發(fā)表于 11-16 12:51 ?7次下載
    PIC<b class='flag-5'>單片機</b><b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b><b class='flag-5'>檢測</b>原理及實現(xiàn)

    51單片機——矩陣鍵盤檢測

    4x4鍵盤檢測程序,按下鍵后相應(yīng)的代碼顯示在數(shù)碼管上#include&amp;lt;reg51.h&amp;gt;sbit dula=P2^6;sbit wela
    發(fā)表于 11-20 20:51 ?7次下載
    51<b class='flag-5'>單片機</b>——<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>的<b class='flag-5'>檢測</b>

    矩陣鍵盤-單片機入門課件

    矩陣鍵盤-單片機入門課件
    發(fā)表于 03-18 11:12 ?0次下載

    51單片機矩陣鍵盤掃描程序

    51單片機矩陣鍵盤掃描程序
    發(fā)表于 05-17 17:20 ?6次下載