微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 矩阵键盘检测问题

矩阵键盘检测问题

时间:10-02 整理:3721RD 点击:
    最近在编程序时,发现书本上写的矩阵键盘检测步骤是:先将某一行置0,其他行与列全部置1,然后扫描键盘端口值并与0xf0按位相与,当检测到按位与后的值与0xf0不同后,说明改行有键被按下,延时后再次检测,如果与之前一样,则读取与键盘相连的端口的值,用switch case语句对比,得出哪个键被按下了。用同样的方法再检测其他行。
    这个方法可行,但是我觉得太麻烦,直接扫描键盘,将读取后的值与switch case语句中的值比较就行了,为什么还要一行行检测呢?我试了我的方法,不行。但是我想不通为什么,请高手帮忙解释,谢谢了。

如果一个I/O口就接一个按键,的确可以直接检测I/O口,就知道哪个按键按下,但如果需要较多按键时,此法会浪费很多I/O口,不合适。
所以需要进行扫描的方式,即节约I/O口,又扩展建盘。
以4X4键盘为例,P3口八个I/o口分四条列线,四条行线,各线都有四个按键,一条线上的端口值变化,可由四个按键中的任意一个按下实现,故需要多行扫描的方式。
另外还有线反转法扫描键盘,你可以看看。    目前我知道的8个I/O口最多接的为36个按键。

请查看 反转扫描法。

谢谢了,不过用以下程序为什么不行呢?
void keyscan()
{
        //P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay10ms();
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {case 0xee:
                                key=1;
                                break;
                        case 0xde:
                                key=2;
                                break;
                        case 0xbe:
                                key=3;
                                break;
                        case 0x7e:
                                key=4;
                                break;
                        case 0xed:
                                key=5;
                                break;
                        case 0xdd:
                                key=6;
                                break;
                        case 0xbd:
                                key=7;
                                break;
                        case 0x7d:
                                key=8;
                                break;
                        case 0xeb:
                                key=9;
                                break;
                        case 0xdb:
                                key=10;
                                break;
                        case 0xbb:
                                key=11;
                                break;
                        case 0x7b:
                                key=12;
                                break;
                        case 0xe7:
                                key=13;
                                break;
                        case 0xd7:
                                key=14;
                                break;
                        case 0xb7:
                                key=15;
                                break;
                        case 0x77:
                                key=16;
                                break;
                        }
                }
                while(temp!=0xf0)
                {
                        temp=P3;
                        temp=temp&0xf0;
                }
                desplay(key);       
        }       
}

补充说明以下:为什么用以下程序不行呢?
void keyscan()
{
       
        temp=P3;//直接读取P3口的值
        temp=temp&0xf0;
        if(temp!=0xf0)/*
判断是否有按键按下,如果有键按下,P3.5~P3.7肯定有低电平,
所以temp不等于0xf0;*/
        {
                delay10ms();
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {case 0xee:
                                key=1;
                                break;
                        case 0xde:
                                key=2;
                                break;
                        case 0xbe:
                                key=3;
                                break;
                        case 0x7e:
                                key=4;
                                break;
                        case 0xed:
                                key=5;
                                break;
                        case 0xdd:
                                key=6;
                                break;
                        case 0xbd:
                                key=7;
                                break;
                        case 0x7d:
                                key=8;
                                break;
                        case 0xeb:
                                key=9;
                                break;
                        case 0xdb:
                                key=10;
                                break;
                        case 0xbb:
                                key=11;
                                break;
                        case 0x7b:
                                key=12;
                                break;
                        case 0xe7:
                                key=13;
                                break;
                        case 0xd7:
                                key=14;
                                break;
                        case 0xb7:
                                key=15;
                                break;
                        case 0x77:
                                key=16;
                                break;
                        }
                }
                while(temp!=0xf0)
                {
                        temp=P3;
                        temp=temp&0xf0;
                }
                desplay(key);       
        }       
}

我不知道这样说对不对,矩阵键盘没按下时相当悬空,如果你想使用矩阵键盘,那么你应该先置某一I/O为低电平,当你按下键盘时该按键才会被拉低,这样才能读出有效值来。而现在你没先置某I/O为低电平,你即使按下某一按键那该按键还是高低平,即你读出P3口的值都是高电平...

小编不理解矩阵键盘的原理啊!

谢谢诸位,搞定了,呵呵!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top