4x4矩阵按键

一.简介

4x4矩阵按键是单片机外部设备中所使用的排布类似于矩阵的按键组。显然矩阵按键的使用要比独立按键要复杂一些,编程也要复杂一些,但可以单片机IO资源。4x4矩阵按键即分为4组列线,4组行线,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

二.硬件连接图

51单片机的P1口用作按键I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位;把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。如图:

三.控制程序

1.矩阵按键程序扫描步骤

  • 检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。

  • 去除按键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。

  • 若有键被按下,应识别出是哪一个键闭合。方法是先获取矩阵按键的列状态,即P1的低四位状态,对应为0111,1011,1101,1110;再获取行状态,即P1的高四位状态。

  • 最后,将由此得到闭合键的行值和列值组成8位数,可通过对应的编码表将闭合键的行值和列值转换成所定义的键值。

 2.扫描程序

void key()   //按键程序
{
  static uchar key_new = 0, key_l;
  key_can = 20;                   //按键值还原
  P1 = 0x0f;
  if((P1 & 0x0f) != 0x0f)    //按键按下
  {
    delay_1ms(1);         //按键消抖动
    if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
    {            //确认是按键按下
      key_new = 0;
      key_l = (P1 | 0xf0);   //矩阵键盘的列状态
      P1 = key_l;              //扫描矩阵键盘的行状态
      switch(P1)
      {
        case 0xee:  key_can = 1;  break;  //得到按键值 
        case 0xde:  key_can = 4;  break;   //得到按键值 
        case 0xbe:  key_can = 7;  break;   //得到按键值 
        case 0x7e:  key_can = 10;  break;   //得到按键值 
  
        case 0xed:  key_can = 2;          break;  //得到按键值 
        case 0xdd:  key_can = 5;  break;   //得到按键值 
        case 0xbd:  key_can = 8;  break;   //得到按键值 
        case 0x7d:  key_can = 0;  break;   //得到按键值 
  
        case 0xeb:  key_can = 3;  break;  //得到按键值 
        case 0xdb:  key_can = 6;  break;   //得到按键值 
        case 0xbb:  key_can = 9;  break;   //得到按键值 
        case 0x7b:  key_can = 11;  break;   //得到按键值 
  
        case 0xe7:  key_can = 15;  break;  //得到按键值 
        case 0xd7:  key_can = 14;  break;  //得到按键值 
        case 0xb7:  key_can = 13;  break;   //得到按键值 
        case 0x77:  key_can = 12;  break;  //得到按键值  
      }  
    }          
  }
  else 
  {
    key_new = 1;    
  }  
}
发布了9 篇原创文章 · 获赞 4 · 访问量 225

猜你喜欢

转载自blog.csdn.net/weixin_44206126/article/details/104356130