• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

新手求助51单片机中 矩阵键盘 的问题

艾笠调查团 2016-04-21 浏览量:1509

P3=一个数后

如果我按下某个矩阵键后P3是不是也会改变?

如下面这个程序中 加粗的字体


#include 
#define uint unsigned int   
#define uchar unsigned char
sbit du=P2^6;  sbit we=P2^7;
uchar code leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义
 
                         };
void delay(uint z)
{ uint x;  
     for(z=z;z>0;z--)
    for(x=114;x>0;x--);
}
uchar KeyScan()
{ uint crod_l,crod_h;
     P3=0xf0;
     if((P3&0xf0)!=0xf0)         //经过测试跟if以及上面那个赋值有关 
{  delay(5);     
if((P3&0xf0)!=0xf0)  
{ crod_l=P3&0xf0;
   P3=crod_l | 0x0f;          //为何不能去掉...?
crod_h=P3&0x0f;
while((P3&0x0f)!=0x0f);              //为何while((P3&0x0f)!=0x0f);   不行 
   return(crod_l+crod_h); //与while((P3&0xf0)!=0xf0);
}
}
 

void KeyPro()
{ switch(KeyScan())
     { case 0xee: P0 = leddata[0]; break;
case 0xde: P0 = leddata[1]; break;
case 0xbe: P0 = leddata[2]; break;
case 0x7e: P0 = leddata[3]; break;

case 0xed: P0 = leddata[4]; break;
case 0xdd: P0 = leddata[5]; break;
case 0xbd: P0 = leddata[6]; break;
case 0x7d: P0 = leddata[7]; break;

case 0xeb: P0 = leddata[8]; break;
case 0xdb: P0 = leddata[9]; break;
case 0xbb: P0 = leddata[10]; break;
case 0x7b: P0 = leddata[11]; break;

case 0xe7: P0 = leddata[12]; break;
case 0xd7: P0 = leddata[13]; break;
case 0xb7: P0 = leddata[14]; break;
case 0x77: P0 = leddata[15]; break;
}
}
void main()
{  
     we=1;
     P0=0;
we=0;
du=1;
P0=leddata[22];
while(1)
  KeyPro();

}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 矩阵键盘的动态扫描不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就是S1,S2,S3,S4四个按键的状态。在PA口输入0XFE。

        0XFE变成二进制是1111 1110,为了方便使用,记得每四个数之间加一个空格。1111 1110这个数据放到PA口上,假设这个时候S1被按下了,会出现什么情况?因为PA0是低电平,S1被按下之后S1导通,导致PA4的电平从1降到0,于是PA端口的数据就变成了1110 1110,换算成16进制就是0XEE。于是我们知道S1被按下了。

        假设是S3被按下,会出现什么情况?没错,PA6的电平被拉低,PA的端口数据变成了1011 1110,也就是0XBE。这样,我们就知道了,每一行的每一个按键被按下的时候,都会有一个对应的独一无二的值。这就是矩阵键盘的扫描原理!


    楼主在看下自己的代码理解一下~~

    • 发布于 2016-04-21
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:9
  • uchar KeyScan()
    { uint crod_l,crod_h;
         P3=0xf0;
         if((P3&0xf0)!=0xf0)         //经过测试跟if以及上面那个赋值有关 
    {  delay(5);     
    if((P3&0xf0)!=0xf0)  
    { crod_l=P3&0xf0;
       P3=crod_l | 0x0f;          //为何不能去掉...?
    crod_h=P3&0x0f;
    while((P3&0x0f)!=0x0f);              //为何while((P3&0x0f)!=0x0f);   不行 
       return(crod_l+crod_h); //与while((P3&0xf0)!=0xf0);
    }
    }
     

    }

    这是一个矩阵键盘的识别按下哪个键盘的程序,你好好看看资料,这是一个4X4的键盘,先是高位送高电平,低位送低电平判断是哪一列,然后高位低电平,低位高电平判断出哪一行,这样就出来是哪一个键按下了,最后是等待键盘松开。

    • 发布于2016-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这个KeyScan函数是不是没写完整?给你一个矩阵扫描的函数,你试试吧……


    • 发布于2016-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 首先,确定你这个是矩阵键盘?看了下程序怎么都像是1*8的键盘而已...

    2、回答下你的问题吧:是的,按键按下去了P3就会变

    uchar KeyScan()
    {

    uint crod_l,crod_h;
    P3=0xf0;
    if((P3&0xf0)!=0xf0)         //经过测试跟if以及上面那个赋值有关
    {

    delay(5);
    if((P3&0xf0)!=0xf0)
    {

    crod_l=P3&0xf0;           //读取高四位的数据
    P3=crod_l | 0x0f; //crod_l 的高四位的数据保留,低四位全部置1 //为何不能去掉...?
    crod_h=P3&0x0f;         //读取低四位的数据
    while((P3&0x0f)!=0x0f); //为何while((P3&0x0f)!=0x0f);   不行

    //这句语句表达的是“当P3的低四位还有按键的时候,就循环,没按键就跳出” ,看起来没什么问题,不过我们编程很少会用while循环直接              //去判断,就怕卡死在里面,这里建议你delay 200~300毫秒,直接在下面return就行了,因为人按按键的速度一般是在100~300毫秒左右
    return(crod_l+crod_h); //与while((P3&0xf0)!=0xf0);
    }
    }
    }


    解答全都写在程序里了哟~

    • 发布于2016-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这是逐行扫描,你看上边的程序是先高位送高电平,低位送低电平,就知道哪一行了,再反过来就知道那一列了,不比你逐行扫描快?
    • 发布于2016-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • while((P3&0x0f)!=0x0f);这句话应该是等待键盘松开吧?
    • 发布于2016-04-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 是呀,等待按键松开,不过我个人认为没有必要写这个东东在这里,不想用太多while,怕死循环在里面了
    • 发布于2016-04-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

新手求助51单片机中 矩阵键盘 的问题