矩阵按键处理多个键值问题

2019-07-15 17:23发布

矩阵怎么处理在有键已按下的情况下,识别出后面按下去是什么键,有相关的解决方法或相关的程序,请提供借鉴一下,谢谢了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
905387498
1楼-- · 2019-07-15 21:09
大神们,帮帮忙呀,我都弄两天了还是不能解决
Jack315
2楼-- · 2019-07-16 01:37
用状态机……          
andy_wsj
3楼-- · 2019-07-16 04:07
假设一个4行4列的矩阵键盘,一共需要8条IO,假设使用的P0口的8个脚
那么定时去读取P0口的数据,那一个被按下去,就会有两个脚电平产生变化,然后分辨是那个按键就可以了
注意需要去抖
陈光辉
4楼-- · 2019-07-16 05:43
 精彩回答 2  元偷偷看……
陈光辉
5楼-- · 2019-07-16 10:13
比如是4*4矩阵按键,检测时可以通过单片机的I/O口送出低电平。检测时,先送出一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平,则我们就能确定是哪个按键被按下了。  你可以看一下下面的代码,希望对你帮助。


uint matrixkeyscan()
{
        uchar temp,key;

        P3=0xfe;        //第一行键盘
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:
                                                        key=0;
                                                        break;
                                case 0xde:
                                                        key=1;
                                                        break;
                                case 0xbe:
                                                        key=2;
                                                        break;
                                case 0x7e:
                                                        key=3;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }

                }                               
        }
       

        P3=0xfd;         //第二行键盘
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:
                                                        key=4;
                                                        break;
                                case 0xdd:
                                                        key=5;
                                                        break;
                                case 0xbd:
                                                        key=6;
                                                        break;
                                case 0x7d:
                                                        key=7;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }

                }                               
        }


        P3=0xfb;                              //第三行键盘   
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:
                                                        key=8;
                                                        break;
                                case 0xdb:
                                                        key=9;
                                                        break;
                                case 0xbb:
                                                        key=10;
                                                        break;
                                case 0x7b:
                                                        key=11;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }
               

                }                               
        }


        P3=0xf7;            //第四行键盘
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7:
                                                        key=12;
                                                        break;
                                case 0xd7:
                                                        key=13;
                                                        break;
                                case 0xb7:
                                                        key=14;
                                                        break;
                                case 0x77:
                                                        key=15;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }
               

                }                               
        }
        return key;
}

不懂的话,可以加我好友,大家一起讨论,我也是新手,希望大家能互相进步!
陈光辉
6楼-- · 2019-07-16 14:17
比如是4*4矩阵按键,检测时可以通过单片机的I/O口送出低电平。检测时,先送出一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平,则我们就能确定是哪个按键被按下了。  你可以看一下下面的代码,希望对你帮助。 代码的返回值就是哪个按键的值,可以用一个变量进行标记,记录按下的次数。


uint matrixkeyscan()
{
        uchar temp,key;

        P3=0xfe;        //第一行键盘
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:
                                                        key=0;
                                                        break;
                                case 0xde:
                                                        key=1;
                                                        break;
                                case 0xbe:
                                                        key=2;
                                                        break;
                                case 0x7e:
                                                        key=3;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }

                }                               
        }
       

        P3=0xfd;         //第二行键盘
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:
                                                        key=4;
                                                        break;
                                case 0xdd:
                                                        key=5;
                                                        break;
                                case 0xbd:
                                                        key=6;
                                                        break;
                                case 0x7d:
                                                        key=7;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }

                }                               
        }


        P3=0xfb;                              //第三行键盘   
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:
                                                        key=8;
                                                        break;
                                case 0xdb:
                                                        key=9;
                                                        break;
                                case 0xbb:
                                                        key=10;
                                                        break;
                                case 0x7b:
                                                        key=11;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }
               

                }                               
        }


        P3=0xf7;            //第四行键盘
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);    //消除按键抖动
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7:
                                                        key=12;
                                                        break;
                                case 0xd7:
                                                        key=13;
                                                        break;
                                case 0xb7:
                                                        key=14;
                                                        break;
                                case 0x77:
                                                        key=15;
                                                        break;                               

                        }
                        while(temp!=0xf0)  //条件满足时是1;等待按键释放;
                        {
                                temp=P3;         //这两句是增加程序的稳定性
                                temp=temp&0xf0;
                        }
               

                }                               
        }
        return key;
}

不懂的话,可以加我好友,大家一起讨论,我也是新手,希望大家能互相进步!

一周热门 更多>