[求助] 矩阵键盘

hz_university   2011-6-24 17:01 楼主

这是我写的矩阵键盘的一个子程序,不知道哪里错了。

请各位帮一下忙。

void keyscan()
{
 uchar h,l,temp;
 
 DDRD=0xf0; 
 PORTD=0x0f;  
 h=PIND&0x0f;//行
  
 if(h!=0x0f)
 {
  delay(100);
  if(h!=0x0f)
  {  
      
   DDRD=0x0f;
   PORTD=0xf0;   
   l=PIND&0xf0; //列
   
   temp=l+h;
   switch(temp)
   {
    case 0x7e:key=0;break;//0 按下相应的键显示相对应的码值
  case 0x7d:key=1;break;//1
  case 0x7b:key=2;break;//2
  case 0x77:key=3;break;//3
  case 0xbe:key=4;break;//4
  case 0xbd:key=5;break;//5
  case 0xbb:key=6;break;//6
  case 0xb7:key=7;break;//7
  case 0xde:key=8;break;//8
  case 0xdd:key=9;break;//9
  case 0xdb:key=10;break;//a
  case 0xd7:key=11;break;//b
  case 0xee:key=12;break;//c
  case 0xed:key=13;break;//d
  case 0xeb:key=14;break;//e
  case 0xe7:key=15;break;//f
    
   }
  }
 }
 
}

回复评论 (6)

行+列这样会重复吧?

你这样1行2列和2行1列的扫描值值一样的
点赞  2011-6-25 00:56

回复 沙发 ydw621 的帖子

刚刚算了一下,好像不会呀。1行2列和2行1列的值会倒转过来,比如1行2列的值是1011,1110。那么2行1列的值就是0111,1101。
在51单片机里,都可以用这种行列翻转法去扫描的。
不知为什么用在这里不行,我看人家写的程序都是先测有没按键按下,有的话就一列一列地去扫描。
点赞  2011-6-25 18:43
I+h是可以吗?
点赞  2011-7-11 20:09
错误现象是什么?
点赞  2011-7-12 09:42
uchar col[4]={0xef,0xdf,0xbf,0x7f};
uchar row[4]={0x07,0x0b,0x0d,0x0e};
uchar Get_keynum()
{
          uchar i,j,temp,keynum;
          for(i=0;i<4;i++)
          {
                   PORTB=col;
                DDRB=0xf0;
                if(PINB!=col)
                {
                         delayms(10);
                        if(PINB!=col)
                        {
                                 temp=PINB&0x0f;
                                for(j=0;j<4;j++)
                                if(temp==row[j])
                                {
                                         keynum=j+4*i;
                                        while(PINB!=col);   //松手检测
                                        return(keynum);
                                }
                        }
                }
          }
          return 0xff;
}
点赞  2011-7-17 11:16
看一下这个程序!
点赞  2011-7-17 11:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复