关于矩阵键盘程序的问题

2019-07-16 02:28发布

在看郭天祥老师的视频的时候遇到了一个疑问,琢磨半天也没想明白,特来求教
视频:http://v.youku.com/v_show/id_XMjkxMTQ1ODky.html   现象发生时间是:110分10秒左右。
现象描述:按第一排第一个按键的时候,数码管显示0,按道理按第二个按键的时候应该显示1的,但是事实上按了没有反应,必须要重启下单片机,才能按第二个。

   P3=0xfe;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(5);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)               //郭老师貌似解释是跳不出这个循环吧,后来听一学生建议,就加了temp=P3 这句
     {
      temp=P3;                          //就是加了这句,就能在第一行正常工作了,说是加了这句就能跳出上面那个while循环了
     switch(temp)
      {
       case 0xee:num=1;
        break;
       case 0xde:num=2;
        break;
       case 0xbe:num=3;
        break;
       case 0x7e:num=4;
        break;
      }
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
     }
    }

我没明白的就是,为什么加了temp=P3这句,就能跳出小while循环呢?既然能跳出小的while循环,那和它条件一样的大while循环,应该也能跳出啊,最重要的是,为什么加了temp=P3就能跳出去,跳出去的条件是temp=0xf0,但是P3并不等于0xf0啊。
小弟在此实在是想不通了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
zhlndsq-484
1楼-- · 2019-07-16 02:39
 精彩回答 2  元偷偷看……
ltrtt
2楼-- · 2019-07-16 03:34
有大神能教下小弟吗。。。
星星ARM
3楼-- · 2019-07-16 05:20
本帖最后由 星星ARM 于 2013-2-17 19:18 编辑

这个是我自己写的或许能帮你理解,其实在自己没有注意的时候何不去求解一种简单的解决方法呢,是吧,只要能解决问题,只要是能实现4*4键盘就OK何必计较那么多。
#include<reg51.h>
unsigned char code table_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table_w[]={0,1,2,3,4,5,6,7};
void delay(unsigned char xms)
{
   unsigned char i,j;
   for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
void main()
{
   unsigned char key_l,key_h,key;
   while(1)
   {
   P3=0xf0;
   key_l=P3;
   key_l=key_l&0xf0;
   if(key_l!=0xf0)
   {
             delay(50);
          if(key_l!=0xf0)
          {
           key_l=P3&0xf0;          //1110 0000
           key_l=key_l|0x0f;  //1110 1111
           P3=key_l;
           key_h=P3;                  //1110 1110
           key_h=key_h&0x0f;  //0000 1110
           key_l=key_l&0xf0;  //1110 0000
           key=key_l+key_h;         
          }
   }
   switch (key)
   {
   case 0xee: P0=table_d[0]; break;
   case 0xde: P0=table_d[1]; break;
   case 0xbe: P0=table_d[2]; break;
   case 0x7e: P0=table_d[3]; break;
   case 0xed: P0=table_d[4]; break;
   case 0xdd: P0=table_d[5]; break;
   case 0xbd: P0=table_d[6]; break;
   case 0x7d: P0=table_d[7]; break;
   case 0xeb: P0=table_d[8]; break;
   case 0xdb: P0=table_d[9]; break;
   case 0xbb: P0=table_d[10]; break;
   case 0x7b: P0=table_d[11]; break;
   case 0xe7: P0=table_d[12]; break;
   case 0xd7: P0=table_d[13]; break;
   case 0xb7: P0=table_d[14]; break;
   case 0x77: P0=table_d[15]; break;
   }
}
}

很清楚了,程序一看就知道是什么意思了吧。。。。。
jiangxiaowenzsz
4楼-- · 2019-07-16 09:46
星星ARM
5楼-- · 2019-07-16 14:20
应该好理解吧。
ltrtt
6楼-- · 2019-07-16 18:04
 精彩回答 2  元偷偷看……

一周热门 更多>