SBT_Jack

Make change by code!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 矩阵键盘

Posted on 2020-08-30 17:56  SBT_Jack  阅读(279)  评论(0)    收藏  举报

1、硬件连接图

 2、实现原理

(1)如上图所示,P1.0,P1.1,P1.2,P1.3引脚分别可以检测是哪一行按下按键,电平设置如下:

第1行检测:[P1.0,P1.1,P1.2,P1.3]  =  [0,1,1,1];

第2行检测:[P1.0,P1.1,P1.2,P1.3]  =  [1,0,1,1];

第3行检测:[P1.0,P1.1,P1.2,P1.3]  =  [1,1,0,1];

第4行检测:[P1.0,P1.1,P1.2,P1.3]  =  [1,1,1,0]; 

(2)对应列扫描

通过将P1.0,P1.1,P1.2,P1.3引脚分别设为低电平,再去检测P1.4,P1.5,P16,P1.6引脚的电平则可判断4x4键盘矩阵中究竟是哪一个按键被按下

第1行扫码:若没有按下则 P1 = 0xfe, 若有按键按下则可能P1 = 0xee(1行1列按下),P1 = 0xde(1行2列按下),P1 = 0xbe(1行3列按下),P1 = 0x7e(1行4列按下)

第2行扫码:若没有按下则 P1 = 0xfd, 若有按键按下则可能P1 = 0xed(2行1列按下),P1 = 0xdd(2行2列按下),P1 = 0xbd(2行3列按下),P1 = 0x7d(2行4列按下)

第3行扫码:若没有按下则 P1 = 0xfb, 若有按键按下则可能P1 = 0xeb(3行1列按下),P1 = 0xdb(3行2列按下),P1 = 0xbb(3行3列按下),P1 = 0x7b(3行4列按下)

第4行扫码:若没有按下则 P1 = 0xf7, 若有按键按下则可能P1 = 0xe7(4行1列按下),P1 = 0xd7(4行2列按下),P1 = 0xb7(4行3列按下),P1 = 0x77(4行4列按下)

3、代码实现

  1 unsigned char display(void)
  2 {
  3     unsigned char tmp;
  4     unsigned char num;
  5 
  6     /* 第1行键盘扫描 */
  7     P3 = 0xfe;
  8     tmp = P3;            // 读取端口P3
  9     while(tmp != 0xfe)
 10     {
 11         delay_ms(5);    //延时去抖
 12         tmp = P3;        // 读取端口P3
 13         while(tmp != 0xfe)
 14         {
 15             switch (tmp)
 16             {
 17                 case 0xee:
 18                     num = 0;
 19                     break;
 20                 case 0xde:
 21                     num = 1;
 22                     break;
 23                 case 0xbe:
 24                     num = 2;
 25                     break;
 26                 case 0x7e:
 27                     num = 3;
 28                     break;
 29             }
 30             tmp = P3;        // 松手检测,松开手tmp=0xfe
 31         }
 32     }
 33     /* 第2行键盘扫描 */    
 34     P3 = 0xfd;
 35     tmp = P3;            // 读取端口P3        
 36     while(tmp != 0xfd)
 37     {
 38         delay_ms(5);    //延时去抖    
 39         tmp = P3;        // 读取端口P3
 40         while(tmp != 0xfd)
 41         {
 42             switch (tmp)
 43             {
 44                 case 0xee:
 45                     num = 4;
 46                     break;
 47                 case 0xde:
 48                     num = 5;
 49                     break;
 50                 case 0xbe:
 51                     num = 6;
 52                     break;
 53                 case 0x7e:
 54                     num = 7;
 55                     break;
 56             }
 57             tmp = P3;        // 松手检测,松开手tmp=0xfe
 58         }
 59 
 60     }
 61     /* 第3行键盘扫描 */
 62     P3 = 0xfb;
 63     tmp = P3;            // 读取端口P3    
 64     while(tmp != 0xfb)
 65     {
 66         delay_ms(5);    //延时去抖
 67         tmp = P3;        // 读取端口P3
 68         while(tmp != 0xfb)
 69         {
 70             switch (tmp)
 71             {
 72                 case 0xeb:
 73                     num = 8;
 74                     break;
 75                 case 0xdb:
 76                     num = 9;
 77                     break;
 78                 case 0xbb:
 79                     num = 10;
 80                     break;
 81                 case 0x7b:
 82                     num = 11;
 83                     break;
 84             }
 85             tmp = P3;        // 松手检测,松开手tmp=0xfe
 86         }
 87 
 88     }
 89     /* 第4行键盘扫描 */    
 90     P3 = 0xf7;
 91     tmp = P3;            // 读取端口P3
 92     while(tmp != 0xf7)
 93     {
 94         delay_ms(5);    //延时去抖
 95         tmp = P3;        // 读取端口P3
 96         while(tmp != 0xf7)
 97         {
 98             switch (tmp)
 99             {
100                 case 0xe7:
101                     num = 12;
102                     break;
103                 case 0xd7:
104                     num = 13;
105                     break;
106                 case 0xb7:
107                     num = 14;
108                     break;
109                 case 0x77:
110                     num = 15;
111                     break;
112             }
113             tmp = P3;        // 松手检测,松开手tmp=0xfe
114         }
115     }
116     return num;
117 }