打印

按键程式问题

[复制链接]
1160|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liken163|  楼主 | 2015-1-17 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教个按键程式:
void key()
{
uchar code,count;
P0=0x0f;  //P0口设为0F
if(P0&0x0f!=0x0f)//判断是否有按键按下
{delay_us(100);//去抖动
if(P0&0x0f!=0x0f)//判断是否有按键按下
{  code=P0^0x0f;//确认具体键值
  count++;  //每按下1次按键,此值加1
  if(count==5)//COUNT=5时,COUNT重新计算
  { count=0;
}
if(P0&0x0f!=0x0f)//等待按键松开
{;
}
return(count);//返回按键按下的次数
     }
  }
}
为何在调用此程式时,返回值永远都是1?

相关帖子

沙发
Jack315| | 2015-1-17 23:20 | 只看该作者
因为每次调用key()函数,语句 count++; 只执行了一次。

使用特权

评论回复
板凳
liken163|  楼主 | 2015-1-17 23:40 | 只看该作者
无按键按下,返回值也是1,
调用key()后,count值应该是保留下来,直到再次有按键按下,COUNT会增加1
例如:第一次按下按键,COUNT变为1,第2次按下按键,COUNT为2,第3次按下按键,COUNT为3,

使用特权

评论回复
地板
ningling_21| | 2015-1-18 07:17 | 只看该作者
liken163 发表于 2015-1-17 23:40
无按键按下,返回值也是1,
调用key()后,count值应该是保留下来,直到再次有按键按下,COUNT会增加1
例如: ...

类似这些  if(P0&0x0f!=0x0f)//

需改为:  if((P0&0x0f)!=0x0f)//

使用特权

评论回复
5
Jack315| | 2015-1-18 08:19 | 只看该作者
liken163 发表于 2015-1-17 23:40
无按键按下,返回值也是1,
调用key()后,count值应该是保留下来,直到再次有按键按下,COUNT会增加1
例如: ...

把 count 变量申明为 static 试试……

使用特权

评论回复
6
liken163|  楼主 | 2015-1-18 09:08 | 只看该作者
ningling_21 发表于 2015-1-18 07:17
类似这些  if(P0&0x0f!=0x0f)//

需改为:  if((P0&0x0f)!=0x0f)//

还是不行。返回值不变

使用特权

评论回复
7
xjjspace| | 2015-1-18 11:38 | 只看该作者
static uchar count=0;

使用特权

评论回复
8
ningling_21| | 2015-1-18 19:42 | 只看该作者
liken163 发表于 2015-1-18 09:08
还是不行。返回值不变

code=P0^0x0f;//确认具体键值

确认键值的原理是什么?

使用特权

评论回复
9
liken163|  楼主 | 2015-1-18 22:49 | 只看该作者
把P0口的值取反,例如为P0.0按下,P0实际值为00001110,异或后变为00000001,所以值为1,

使用特权

评论回复
10
liken163|  楼主 | 2015-1-19 19:44 | 只看该作者
xjjspace 发表于 2015-1-18 11:38
static uchar count=0;

試了,還是不行。加了以後,不用按按鍵,就直接把主函數跑完了。
完整程式如下:

#define  uchar   unsigned char
#define   uint unsigned int
static uchar recode=0;


uchar keyscan1()
{
        uchar scode;
    int t=0;
        P0=0x0f;

        if((P0&0x0f)!=0x0f)
        {
                delayus(100);
                if((P0&0x0f)!=0x0f)
           {
            scode=P0^0X0F;
       recode++;
                       
      if(recode==5)
      {
                 recode=0;
          }
         if((P0&0x0f)!=0x0f)
                 
          ;
                  
return(recode);
}
}
  }


//****************************************************
void  main()
{
   int z;

        initi_lcd();
        delayms(10);

                while(1)
        {
        z=keyscan1();

     switch(z)

                        {
    case 1:   
                display_all();
        break;
   case 2:
                display_pic1();
                        delayms(3000);


                        display_pic2();
                        delayms(3000);

   break;
       case 3:
                                   display_pic3();
                        delayms(3000);

                        display_pic4();
                        delayms(3000);

        break;
             case 4:
                 display_pic7();
                        delayms(3000);

                        display_pic8();
                        delayms(3000);
               
        break;
}
}
}

使用特权

评论回复
11
liken163|  楼主 | 2015-1-19 23:18 | 只看该作者
liken163 发表于 2015-1-19 19:44
試了,還是不行。加了以後,不用按按鍵,就直接把主函數跑完了。
完整程式如下:


匠人帮忙看看

使用特权

评论回复
12
ningling_21| | 2015-1-20 09:27 | 只看该作者
本帖最后由 ningling_21 于 2015-1-20 09:35 编辑
liken163 发表于 2015-1-19 19:44
試了,還是不行。加了以後,不用按按鍵,就直接把主函數跑完了。
完整程式如下:

等待按键释放 不是 if((P0&0x0f)!=0x0f)


uchar  key(void )
{
  uchar scode;
  int t=0;
  P0=0x0f;

  if((P0&0x0f)!=0x0f)
  {
       delay_ms(100);
       if((P0&0x0f)!=0x0f)
       {
                scode=P0^0X0F;
                          recode++;
                          //-----------------------------------------------                  
                          if(recode==5)
                          {
                recode=0;
                          }
                          while((P0&0x0f)!=0x0f);  //等待按键释放

                        
                }
  }

  return(scode);
}

使用特权

评论回复
13
liken163|  楼主 | 2015-1-20 12:41 | 只看该作者
ningling_21 发表于 2015-1-20 09:27
等待按键释放 不是 if((P0&0x0f)!=0x0f)

各位大神,帮忙看看

使用特权

评论回复
14
leon19911224| | 2015-1-20 13:08 | 只看该作者
如果把counter定义为全局变量试试呢

使用特权

评论回复
15
liken163|  楼主 | 2015-1-23 16:36 | 只看该作者
谢谢各位的解答

使用特权

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

本版积分规则

5

主题

29

帖子

0

粉丝