新聞中心

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

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

        作者: 時間:2011-02-27 來源:網絡 收藏

        (1. 把“系統“區域中的P3.0P3.7端口用8芯排線連接到“4X4行列式鍵盤”區域中的C1C4 R1R4端口上;

        (2. 把“系統”區域中的P0.0/AD0P0.7/AD7端口用8芯排線連接到“四路靜態數碼顯示模塊”區域中的任一個ah端口上;要求:P0.0/AD0對應著a,P0.1/AD1對應著b,……P0.7/AD7對應著h。

        4. 程序設計內容

        (1. 4×4矩陣鍵盤識別處理

        (2. 每個按鍵有它的行值和列值 ,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。每個按鍵的狀態同樣需變成數字量“0”和“1”,開關的一端(列線)通過電阻接VCC,而接地是通過程序輸出數字“0”實現的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態接地,另一個并行口輸入按鍵狀態,由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。

        5.程序框圖

        6.匯編源程序

        KEYBUF EQU 30H

        ORG 00H

        START: MOV KEYBUF,#2

        WAIT:

        MOV P3,#0FFH

        CLR P3.4

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY1

        LCALL DELY10MS

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY1

        MOV A,P3

        ANL A,#0FH

        CJNE A,#0EH,NK1

        MOV KEYBUF,#0

        LJMP DK1

        NK1: CJNE A,#0DH,NK2

        MOV KEYBUF,#1

        LJMP DK1

        NK2: CJNE A,#0BH,NK3

        MOV KEYBUF,#2

        LJMP DK1

        NK3: CJNE A,#07H,NK4

        MOV KEYBUF,#3

        LJMP DK1

        NK4: NOP

        DK1:

        MOV A,KEYBUF

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        DK1A: MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JNZ DK1A

        NOKEY1:

        MOV P3,#0FFH

        CLR P3.5

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY2

        LCALL DELY10MS

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY2

        MOV A,P3

        ANL A,#0FH

        CJNE A,#0EH,NK5

        MOV KEYBUF,#4

        LJMP DK2

        NK5: CJNE A,#0DH,NK6

        MOV KEYBUF,#5

        LJMP DK2

        NK6: CJNE A,#0BH,NK7

        MOV KEYBUF,#6

        LJMP DK2

        NK7: CJNE A,#07H,NK8

        MOV KEYBUF,#7

        LJMP DK2

        NK8: NOP

        DK2:

        MOV A,KEYBUF

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        DK2A: MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JNZ DK2A

        NOKEY2:

        MOV P3,#0FFH

        CLR P3.6

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY3

        LCALL DELY10MS

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY3

        MOV A,P3

        ANL A,#0FH

        CJNE A,#0EH,NK9

        MOV KEYBUF,#8

        LJMP DK3

        NK9: CJNE A,#0DH,NK10

        MOV KEYBUF,#9

        LJMP DK3

        NK10: CJNE A,#0BH,NK11

        MOV KEYBUF,#10

        LJMP DK3

        NK11: CJNE A,#07H,NK12

        MOV KEYBUF,#11

        LJMP DK3

        NK12: NOP

        DK3:

        MOV A,KEYBUF

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        DK3A: MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JNZ DK3A

        NOKEY3:

        MOV P3,#0FFH

        CLR P3.7

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY4

        LCALL DELY10MS

        MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JZ NOKEY4

        MOV A,P3

        ANL A,#0FH

        CJNE A,#0EH,NK13

        MOV KEYBUF,#12

        LJMP DK4

        NK13: CJNE A,#0DH,NK14

        MOV KEYBUF,#13

        LJMP DK4

        NK14: CJNE A,#0BH,NK15

        MOV KEYBUF,#14

        LJMP DK4

        NK15: CJNE A,#07H,NK16

        MOV KEYBUF,#15

        LJMP DK4

        NK16: NOP

        DK4:

        MOV A,KEYBUF

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P0,A

        DK4A: MOV A,P3

        ANL A,#0FH

        XRL A,#0FH

        JNZ DK4A

        NOKEY4:

        LJMP WAIT

        DELY10MS:

        MOV R6,#10

        D1: MOV R7,#248

        DJNZ R7,$

        DJNZ R6,D1

        RET

        TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

        DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

        END

        7.C語言源程序

        #include AT89X51.H>

        unsigned char code table[]={0x3f,0x06,0x5b,0x4f,

        0x66,0x6d,0x7d,0x07,

        0x7f,0x6f,0x77,0x7c,

        0x39,0x5e,0x79,0x71};

        unsigned char temp;

        unsigned char key;

        unsigned char i,j;

        void main(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)

        {

        case 0x0e:

        key=7;

        break;

        case 0x0d:

        key=8;

        break;

        case 0x0b:

        key=9;

        break;

        case 0x07:

        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)

        {

        case 0x0e:

        key=4;

        break;

        case 0x0d:

        key=5;

        break;

        case 0x0b:

        key=6;

        break;

        case 0x07:

        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)

        {

        case 0x0e:

        key=1;

        break;

        case 0x0d:

        key=2;

        break;

        case 0x0b:

        key=3;

        break;

        case 0x07:

        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)

        {

        case 0x0e:

        key=0;

        break;

        case 0x0d:

        key=13;

        break;

        case 0x0b:

        key=14;

        break;

        case 0x07:

        key=15;

        break;

        }

        temp=P3;

        P1_0=~P1_0;

        P0=table[key];

        temp=temp 0x0f;

        while(temp!=0x0f)

        {

        temp=P3;

        temp=temp 0x0f;

        }

        }

        }

        }

        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 健康| 南宫市| 施秉县| 甘泉县| 琼中| 古蔺县| 镇赉县| 确山县| 广安市| 镇原县| 灵山县| 东城区| 繁峙县| 陈巴尔虎旗| 永昌县| 房产| 罗甸县| 上杭县| 云霄县| 五大连池市| 平塘县| 黔江区| 黑山县| 靖宇县| 霍林郭勒市| 嫩江县| 恭城| 巫溪县| 云梦县| 科尔| 大关县| 桐柏县| 临泉县| 城市| 兴国县| 景宁| 常德市| 启东市| 沈丘县| 眉山市| 北宁市|