工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2875|回复: 7

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

[复制链接]
发表于 2009-6-1 12:59 | 显示全部楼层 |阅读模式
本帖最后由 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;
}
发表于 2009-6-1 13:59 | 显示全部楼层
你的代码一点注释都没有。完全没有!!!我看了第一眼就不想再看第二眼了。。。
回复

使用道具 举报

 楼主| 发表于 2009-6-1 14:40 | 显示全部楼层
2# zaijzhgh
实在抱歉~~~~自己看懂了所以就没写注释了···呵呵~~~~不好意思啊~~~
回复

使用道具 举报

发表于 2009-6-2 00:54 | 显示全部楼层
奇怪了,那键盘P2^0-P2^3是纵向, P2^4-P2^7是横向
也就是
P2^7  1    2    3    4
P2^6  5    6    7    8
P2^5  9    10  11  12
P2^4  13  14 15 16
那扫描第一行时不是先将 横向 P2^7拉抵么...还是我理解有问题...
程序感觉没错啊..额..俺也是刚学 ..不太懂...
回复

使用道具 举报

 楼主| 发表于 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
是这样的····
回复

使用道具 举报

发表于 2009-6-2 13:45 | 显示全部楼层
LZ把按键检测和廷时检测的 while 改成 if 试试
真奇怪,搞掂的话告诉一声...
回复

使用道具 举报

 楼主| 发表于 2009-6-2 15:23 | 显示全部楼层
6# efen
试过了~~还是不行啊~~~郁闷~~~~究竟哪里不行呢~~~~~
回复

使用道具 举报

发表于 2011-1-4 22:49 | 显示全部楼层
哇。。好复杂啊。。我才刚刚学习Linux的知识。。希望有用吧。表哥告诉我学次Linux知识和嵌入式开发以后比较好找工作。。并且他还推荐我去尚观学习这些课程,毕竟他们办学已经很久了,有条件让你高薪就业的。。地址是:广州市东风西路140号东方金融大厦610 大家觉得呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-4-29 06:54

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表