×
单片机 > 单片机程序设计 > 详情

14. 4×4矩阵式键盘识别技术

发布时间:2020-06-05 发布时间:
|
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-C4 R1-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. 汇编源程序 
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  
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;              
                } 
            } 
        } 
    } 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向