新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 14. 4×4矩陣式鍵盤識別技術

        14. 4×4矩陣式鍵盤識別技術

        作者: 時間:2016-11-18 來源:網絡 收藏
        1.實驗任務
        如圖4.14.2所示,用AT89S51的并行口P1接4×4矩陣鍵盤,以P1.0-P1.3作輸入線,以P1.4-P1.7作輸出線;在數碼管上顯示每個按鍵的“0-F”序號。對應的按鍵的序號排列如圖4.14.1所示
        0

        4

        8

        C

        1

        5

        9

        D

        2

        6

        A

        E

        3

        7

        B

        F


        圖4.14.1
        2.硬件電路原理



        圖4.14.2
        3.系統板上硬件連線
        (1.把“單片機系統“區域中的P3.0-P3.7端口用8芯排線連接到“4X4行列式鍵盤”區域中的C1-C4R1-R4端口上;
        (2.把“單片機系統”區域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態數碼顯示模塊”區域中的任一個a-h端口上;要求:P0.0/AD0對應著a,P0.1/AD1對應著b,……,P0.7/AD7對應著h。
        4.程序設計內容
        (1.4×4矩陣鍵盤識別處理
        (2.每個按鍵有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。每個按鍵的狀態同樣需變成數字量“0”和“1”,開關的一端(列線)通過電阻接VCC,而接地是通過程序輸出數字“0”實現的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態接地,另一個并行口輸入按鍵狀態,由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。
        5.程序框圖

        P3=FFH,P3.0=0
        有鍵按下嗎?

        延時10ms

        真得有鍵按下嗎?

        根據當前狀態識別按鍵


        P3=FFH,P3.1=0
        有鍵按下嗎?

        延時10ms

        真得有鍵按下嗎?

        根據當前狀態識別按鍵


        P3=FFH,P3.2=0
        有鍵按下嗎?

        延時10ms

        真得有鍵按下嗎?

        根據當前狀態識別按鍵


        P3=FFH,P3.3=0
        有鍵按下嗎?

        延時10ms

        真得有鍵按下嗎?

        根據當前狀態識別按鍵

        圖4.14.3
        6.匯編源程序
        KEYBUFEQU30H
        ORG00H
        START:MOVKEYBUF,#2
        WAIT:
        MOVP3,#0FFH
        CLRP3.4
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY1
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY1
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK1
        MOVKEYBUF,#0
        LJMPDK1
        NK1:CJNEA,#0DH,NK2
        MOVKEYBUF,#1
        LJMPDK1
        NK2:CJNEA,#0BH,NK3
        MOVKEYBUF,#2
        LJMPDK1
        NK3:CJNEA,#07H,NK4
        MOVKEYBUF,#3
        LJMPDK1
        NK4:NOP
        DK1:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A

        DK1A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK1A
        NOKEY1:
        MOVP3,#0FFH
        CLRP3.5
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY2
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY2
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK5
        MOVKEYBUF,#4
        LJMPDK2
        NK5:CJNEA,#0DH,NK6
        MOVKEYBUF,#5
        LJMPDK2
        NK6:CJNEA,#0BH,NK7
        MOVKEYBUF,#6
        LJMPDK2
        NK7:CJNEA,#07H,NK8
        MOVKEYBUF,#7
        LJMPDK2
        NK8:NOP
        DK2:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A

        DK2A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK2A
        NOKEY2:
        MOVP3,#0FFH
        CLRP3.6
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY3
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY3
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK9
        MOVKEYBUF,#8
        LJMPDK3
        NK9:CJNEA,#0DH,NK10
        MOVKEYBUF,#9
        LJMPDK3
        NK10:CJNEA,#0BH,NK11
        MOVKEYBUF,#10
        LJMPDK3
        NK11:CJNEA,#07H,NK12
        MOVKEYBUF,#11
        LJMPDK3
        NK12:NOP
        DK3:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A

        DK3A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK3A
        NOKEY3:
        MOVP3,#0FFH
        CLRP3.7
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY4
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY4
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK13
        MOVKEYBUF,#12
        LJMPDK4
        NK13:CJNEA,#0DH,NK14
        MOVKEYBUF,#13
        LJMPDK4
        NK14:CJNEA,#0BH,NK15
        MOVKEYBUF,#14
        LJMPDK4
        NK15:CJNEA,#07H,NK16
        MOVKEYBUF,#15
        LJMPDK4
        NK16:NOP
        DK4:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A

        DK4A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK4A
        NOKEY4:
        LJMPWAIT
        DELY10MS:
        MOVR6,#10
        D1:MOVR7,#248
        DJNZR7,$
        DJNZR6,D1
        RET
        TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
        DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
        END
        7.C語言源程序
        #include
        unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
        unsignedchartemp;
        unsignedcharkey;
        unsignedchari,j;


        voidmain(void)
        {
        while(1)
        {
        P3=0xff;
        P3_4=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=7;
        break;
        case0x0d:
        key=8;
        break;
        case0x0b:
        key=9;
        break;
        case0x07:
        key=10;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        }
        }

        P3=0xff;
        P3_5=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=4;
        break;
        case0x0d:
        key=5;
        break;
        case0x0b:
        key=6;
        break;
        case0x07:
        key=11;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        }
        }

        P3=0xff;
        P3_6=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=1;
        break;
        case0x0d:
        key=2;
        break;
        case0x0b:
        key=3;
        break;
        case0x07:
        key=12;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        }
        }

        P3=0xff;
        P3_7=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=0;
        break;
        case0x0d:
        key=13;
        break;
        case0x0b:
        key=14;
        break;
        case0x07:
        key=15;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        }
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 姜堰市| 民权县| 安庆市| 潞西市| 侯马市| 杭州市| 库尔勒市| 浮梁县| 阿拉尔市| 元朗区| 营口市| 盐源县| 大兴区| 饶平县| 阜平县| 舒兰市| 丽水市| 冷水江市| 曲周县| 汝州市| 增城市| 武冈市| 孟连| 长宁县| 乐东| 神木县| 东兰县| 济宁市| 石狮市| 尚志市| 阿拉善盟| 泸定县| 五大连池市| 湄潭县| 伊川县| 贺兰县| 武夷山市| 临泽县| 达拉特旗| 盐池县| 吕梁市|