打印

大佬们,麻烦帮个忙,关于矩阵键盘的,很急

[复制链接]
669|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzcook|  楼主 | 2018-11-22 12:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3x5矩阵键盘,
引脚定义为下
sbit X1 = P2^7;
sbit X2 = P2^6;
sbit X3 = P2^5;

sbit Y1 = P1^1;
sbit Y2 = P1^2;
sbit Y3 = P1^3;
sbit Y4 = P1^4;
sbit Y5 = P1^5;
跪求大佬们,帮个忙写个按键扫描函数。真的很急。
网上找个有点看不懂(初学单片机的)
拜托了!
自己写的扫描函数,用到单片机上,总是有点小问题,找了很久也找不到哪里出错了。
拜托各位帮个忙!

相关帖子

沙发
yzcook|  楼主 | 2018-11-22 12:40 | 只看该作者
这个是自己写的函数。总是有点小问题。拜托各位帮个忙,好人一生平安
unsigned char get_key()
{
        unsigned char ucKey = 0;
                 Y1=Y2=Y3=Y4=Y5=1;
                 X1=X2=X3=0;
                delay(10);
   if (!(Y1 && Y2 && Y3 && Y4 && Y5 ))
        {
                 Y1=Y2=Y3=Y4=Y5=1;
                 X1=X2=X3=0;
                 delay(10);
                                         _nop_(); _nop_();       
     if (!(Y1 && Y2 && Y3 && Y4 && Y5 ))
     {       

//                                        LockScanf = 1;                               
                                       
                                Y1=Y2=Y3=Y4=Y5=1;
                                        X1=X2=X3=1;
                                        X1 = 0;
                                        if (Y1 == 0)      ucKey = 1;
                                  else if (Y2 == 0) ucKey = 2;
                                        else if (Y3 == 0) ucKey = 3;
                                        else if (Y4 == 0) ucKey = 4;
                                        else if (Y5 == 0) ucKey = 5;
                                        else
                                        {
                                                 ;
                                        }
                                        X1 = 1;

                                        X2 = 0;
                                        if (Y1 == 0)      ucKey = 6;
                                        else if (Y2 == 0) ucKey = 7;
                                        else if (Y3 == 0) ucKey = 8;
                                        else if (Y4 == 0) ucKey = 9;
                                        else if (Y5 == 0) ucKey = 10;
                                        else
                                        {
                                                 ;
                                        }
                                        X2 = 1;

                                        X3 = 0;
                                        if (Y1 == 0)      ucKey = 11;
                                        else if (Y2 == 0) ucKey = 12;
                                        else if (Y3 == 0) ucKey = 13;
                                        else if (Y4 == 0) ucKey = 14;
                                        else if (Y5 == 0) ucKey = 15;
                                        else
                                        {
                                                 ;
                                        }
                                        X3 = 1;
                }
         else
         {
                 ucKey = 0;
         }
  }
        else
  {       
          ucKey = 0;
        }
        return ucKey;
}

使用特权

评论回复
板凳
y18370990546| | 2018-11-22 13:48 | 只看该作者
本帖最后由 y18370990546 于 2018-11-22 15:09 编辑

  行列3*5,行输出,列输入,键按下返回键值
unsigned char key_scan()
{
for(unsigned char line =0;line<3;line++)  
    {
        switch(line)         //行线输出
        {
            case 0:X1=0;X2=1;X3=1;break;
            case 1:X1=1;X2=0;X3=1;break;
            case 2:X1=1;X2=1;X3=0;break;
        }
      if(!(Y1 && Y2 && Y3 && Y4 && Y5))   //判断列线
      {
        __delay_ms(20);
            if(!(Y1 && Y2 && Y3 && Y4 && Y5))
            {
                if(Y1==0)
                   { while(!(Y1 && Y2 && Y3 && Y4 && Y5)); return line+1; }   //返回第一列,1,2,3
                if(Y2==0)
                   { while(!(Y1 && Y2 && Y3 && Y4 && Y5)); return line+4; }  //返回第二列, 4,5,6,
                if(Y3==0)
                   { while(!(Y1 && Y2 && Y3 && Y4 && Y5)); return line+7; }  //依次类推
                if(Y4==0)
                   { while(!(Y1 && Y2 && Y3 && Y4 && Y5)); return line+10;}
                if(Y5==0)
                   { while(!(Y1 && Y2 && Y3 && Y4 && Y5)); return line+13;}
            }
          else  return 0;
      }  
    else  return 0;   
   }
}

使用特权

评论回复
地板
yzcook|  楼主 | 2018-11-22 14:03 | 只看该作者
y18370990546 发表于 2018-11-22 13:48
行列3*5,行输出,列输入,键按下返回键值
unsigned char key_scan()
{

你好,按照你写的代码,我加上去后,键盘没有按下,一直在出值,请问这事什么原因呢

使用特权

评论回复
评论
y18370990546 2018-11-22 15:03 回复TA
加一条,else return 0 ,键盘没按下,返回0,判断键盘按下,则为1至15 
5
diy1997| | 2018-11-22 19:39 | 只看该作者
uchar key=0;

P2 &= 0x1f;//P2^5~P2^7设低电平




P1 |= 0x3e;//P1^1~P1^5设高电平







if ((P1 & 0x3e)!=0x3e)//如果有键按下
{
        delay();//

        if ((P1 & 0x3e)!=0x3e)//确定有键按下
        {
                key =(P1>>1)&0x1f;//获取行

                P2 |= 0xe0;//P2^5~P2^7设高电平







                P1 &= 0xc1;//P1^1~P1^5设低电平










                key |=P2 &0xe0;//获取列合成键值




        }
                       
}


根据得到的键值用 switch(key).

使用特权

评论回复
6
laujc| | 2018-11-23 11:58 | 只看该作者
没有电路图吗?

使用特权

评论回复
7
李不走寻常路| | 2018-11-23 13:42 | 只看该作者
http://www.dumenmen.com/thread-1653-1-1.html
推荐你看下鸿哥的单片机程序框架的帖子里面有矩阵按键的程序,很好用

使用特权

评论回复
8
yzcook|  楼主 | 2018-11-23 15:43 | 只看该作者
diy1997 发表于 2018-11-22 19:39
uchar key=0;

P2 &= 0x1f;//P2^5~P2^7设低电平

能不能问下这个key值有哪些= = 我在百度上找的 跟这个类似 我就是看不懂这里= = (刚学单片机 勿喷)

使用特权

评论回复
9
diy1997| | 2018-11-23 18:37 | 只看该作者
P2^5~P2^7设低电平,P1^1~P1^5设高电平。
如果这时,p2.5  和p1.1线上的按键按下,
p1口状态:#xx11110x,经过处理,key =(P1>>1)&0x1f;

key得到行的状态:#00011110

P2^5~P2^7设高电平,P1^1~P1^5设低电平,

p2口状态:#110xxxxx,经过处理:P2 &0xe0; 得到列的状态:#11000000

合并:key |=P2 &0xe0; 最终得到键值:#11011110










使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

84

帖子

0

粉丝