打印

键盘扫描遇到的问题

[复制链接]
2025|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxa_online|  楼主 | 2007-6-8 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序编好了 在protuer中仿真后输出的结果是
1 5 9 13
1 5 9 13
1 5 9 13
1 5 9 13

设计结果应该是
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16



请个位大侠帮帮看看!!!!



#include <AT89X51.H>
#define uchar unsigned char
#define uint  unsigned int
void dlms(void);
uchar kbscan(void);


void main(void)

  uchar j;
  while (1)
  {  j=kbscan();
     dlms(); 
     switch (j)
     {
  case 0x11: P1= 1; break;
  case 0x12: P1 = 2; break;
  case 0x14: P1 = 3; break;
  case 0x18: P1= 4; break;
  case 0x21: P1= 5;     break;
  case 0x22: P1= 6;     break;
  case 0x24: P1 = 7; break;
  case 0x28: P1= 8; break;
  case 0x41: P1= 9;    break;
  case 0x42: P1= 10;break;
  case 0x44: P1= 11;break;
  case 0x48: P1= 12;break;
  case 0x81: P1= 13;break;
  case 0x82: P1= 14;break;
  case 0x84: P1= 15;break;
  case 0x88: P1= 16; break;
  default   :  P1=0;
     }
  }
}


void dlms(void)
{ uchar i;
  for(i=200;i>0;i--){}
}


uchar kbscan(void)
{uchar  s,r;
 P0=0xf0;
 if ((P0&0xf0)!=0xf0)
    {dlms();
      if ((P0&0xf0)!=0xf0)
         {s=0xfe;
            while ((s&0x10)!=0)
                 { P0=s;
                   if ((P0&0xf0)!=0xf0)
                     {r=(P0&0xf0)|0x0f;
                      return ((~s)+(~r));
                      }
                   else 
                   s=(s<<1)|0x01;
                  }
         }
   }
   return(0);
}

相关帖子

沙发
zhaoyu2005| | 2007-6-9 08:32 | 只看该作者

kbscan()错了,至于怎么错的

建议你画一个对的流程图,然后根据流程图找问题,可以提示你一点:P0=0xf0;
if ((P0&0xf0)!=0xf0)
你这样的话if语句内的值永远是真,所以就往下执行了,后面的也是。
你还是去看看别人的矩阵键盘怎么扫描的吧,这样看你好像连矩阵键盘的扫描原理还不清楚

使用特权

评论回复
板凳
hxa_online|  楼主 | 2007-6-11 08:54 | 只看该作者

谢谢 2楼的指点

在 while 语句中
我的P0=S=0xfe;
判断在那行有键按下
怎么样的话不是在对应的行的话
在在 while 语句中的
if不做用

使用特权

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

本版积分规则

3

主题

9

帖子

0

粉丝