单片机学习小组
直播中

杨海清

7年用户 1737经验值
私信 关注

4x4矩阵按键的扫描步骤是怎样的?

4x4矩阵按键的扫描步骤是怎样的?

回帖(1)

李建

2022-1-21 11:49:14
一.简介

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

更多回帖

发帖
×
20
完善资料,
赚取积分