qinjunquan 发表于 2009-6-1 12:59

单片机c编程~~~~请教下~~~唔该啦啦啦!!

本帖最后由 qinjunquan 于 2009-6-1 14:41 编辑

我的实验板是用P2口控制4*4的矩阵键盘的,横向为P2^7-P2^4,纵向为P2^4-P2^0,不知道为什么下载进去的程序按1、5、9、13键的时候没有显示,其它就都可以,为什么会这样的呢?我注释了其它三行的程序,只测试第一行键盘的时候按第一个按键按下去可以显示0,但是全部都写进去就不可以了????点解啊????
uchar keyscan()
{
   P2=0xf7;       //让P2^3为0,既P2=11110111为开始扫描第一行键盘做准备
   temp=P2;
   temp=temp&0xf0;//temp与1111 0000相与
   while(temp!=0xf0)       //让temp与11110000相与,如果第一行有键盘按下的话P2的高四位会有一个不为1,既进入while循环
    {
   delay(1);//延迟,消除抖动
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
   {
          temp=P2;    //把P2的值再次赋给temp
          switch(temp)   //通过判断temp的值来判定是哪个键被按下
         {
            case 0x77:num=1;    //temp=0111 0111(高四位的第一个0表示第一个键被按下),num值是作为返回值用的。
            break;
            case 0xb7:num=2;   //temp=1011 0111(高四位第二位是0表示第二个键盘被按下)
            break;
            case 0xd7:num=3;//下面同上
            break;
            case 0xe7:num=4;
            break;
            }
             while(temp!=0xf0)//松手检测,松手时temp=0xf0,跳出循环
            {
               temp=P2;
               temp=temp&0xf0;
            }
            }
    }
   P2=0xfb;   //给P2赋值1111 1011,开始检测第二行键盘,同上
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
   delay(1);
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
   {
      temp=P2;
   switch(temp)
      {
       case 0x7b:num=5;
      break;
       case 0xbb:num=6;
      break;
       case 0xdb:num=7;
      break;
       case 0xeb:num=8;
      break;
      }
   while(temp!=0xf0)
      {
       temp=P2;
       temp=temp&0xf0;
      }
   }
    }   

   P2=0xfd;
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
   delay(1);
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
   {
      temp=P2;
   switch(temp)
      {
       case 0x7d:num=9;
      break;
       case 0xbd:num=10;
      break;
       case 0xdd:num=11;
      break;
       case 0xed:num=12;
      break;
      }
   while(temp!=0xf0)
      {
       temp=P2;
       temp=temp&0xf0;
      }
   }
    }

   P2=0xfe;
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
   delay(1);
   temp=P2;
   temp=temp&0xf0;
   while(temp!=0xf0)
   {
      temp=P2;
   switch(temp)
      {
       case 0x7e:num=13;
      break;
       case 0xbe:num=14;
      break;
       case 0xde:num=15;
      break;
       case 0xee:num=16;
      break;
      }
   while(temp!=0xf0)
      {
       temp=P2;
       temp=temp&0xf0;
      }
   }
    }
return num;
}

zaijzhgh 发表于 2009-6-1 13:59

你的代码一点注释都没有。完全没有!!!我看了第一眼就不想再看第二眼了。。。

qinjunquan 发表于 2009-6-1 14:40

2# zaijzhgh
实在抱歉~~~~自己看懂了所以就没写注释了···呵呵~~~~不好意思啊~~~

efen 发表于 2009-6-2 00:54

奇怪了,那键盘P2^0-P2^3是纵向, P2^4-P2^7是横向
也就是
P2^71    2    3    4
P2^65    6    7    8
P2^59    101112
P2^41314 15 16
那扫描第一行时不是先将 横向 P2^7拉抵么...还是我理解有问题...
程序感觉没错啊..额..俺也是刚学 ..不太懂...

qinjunquan 发表于 2009-6-2 11:35

·      P2^7   P2^7   P2^7   P2^7
P2^3   1         2         3         4
P2^2   5         6         7         8
P2^1   9      10       11       12
P2^0   13      14       15       16
是这样的····

efen 发表于 2009-6-2 13:45

LZ把按键检测和廷时检测的 while 改成 if 试试
真奇怪,搞掂的话告诉一声...

qinjunquan 发表于 2009-6-2 15:23

6# efen
试过了~~还是不行啊~~~郁闷~~~~究竟哪里不行呢~~~~~

尚观小熊 发表于 2011-1-4 22:49

哇。。好复杂啊。。我才刚刚学习Linux的知识。。希望有用吧。表哥告诉我学次Linux知识和嵌入式开发以后比较好找工作。。并且他还推荐我去尚观学习这些课程,毕竟他们办学已经很久了,有条件让你高薪就业的。。地址是:广州市东风西路140号东方金融大厦610 大家觉得呢
页: [1]
查看完整版本: 单片机c编程~~~~请教下~~~唔该啦啦啦!!