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;    
  }  
}

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用51单片机控制4x4矩阵按键,你需要了解以下几个步骤: 1. 连接硬件:将4x4矩阵按键连接到51单片机的I/O口,需要使用8个I/O口进行连接,其中4个I/O口连接行,4个I/O口连接列。 2. 初始化:初始化I/O口为输入模式,将所有行I/O口设置为高电平状态,所有列I/O口设置为低电平状态。 3. 扫描:在扫描过程中,首先将所有行I/O口置为低电平状态,然后依次扫描每一列,如果某个按键被按下,则相应的行I/O口与列I/O口会连接,这时候该行I/O口会被拉低,我们可以通过检测行I/O口的状态来判断是否有按键按下。 4. 处理:对于每一个被按下的按键,我们需要进行相应的处理,例如发送数据或者执行某个操作等。 以下是一个简单的代码示例: ```c #include <reg51.h> #define KEY_PORT P1 void main() { unsigned char key_code[] = {0xee, 0xde, 0xbe, 0x7e}; unsigned char row, col, i, j; while(1) { for(col = 0; col < 4; col++) { KEY_PORT = 0x0f ^ (1 << col); for(row = 0; row < 4; row++) { if(!(KEY_PORT & (1 << (row + 4)))) { // 处理按键事件 // 发送按键码 key_code[row * 4 + col] } } } } } ``` 在这个示例中,我们使用P1口作为输入输出口,将第0-3位用作输出控制列,将第4-7位用作输入检测行。在扫描过程中,我们依次将每一列输出低电平,然后检测每一行的输入状态,如果检测到某一行的输入为低电平,则说明该行与当前列连接的按键被按下,我们可以根据按键的位置来确定按键码,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值