zhuyi2576 发表于 2010-5-23 01:53:38

写的一个按键长短按的程序,但却实现不了,大家帮我看下

这样写有问题吗?我实在不知道哪的问题,就是运行不了


sbit        KEY_SET       = P1^3;
sbit        KEY_UP       = P1^2;
sbit        KEY_DOWN = P1^0;

/*********************************************
;文件名:keyscan();
;功能:按键扫描函数
;输入:无
;输出:;调用:无
;*********************************************/       
uchar keyscan(void)
{
        if(KEY_SET==0||KEY_UP==0||KEY_DOWN==0) //有任一键按下,进入按键检测
        {
                keystar=1;                         //进入计时器,开始计时
                if((KEY_SET==0)&&keytemp>=20)        set_down=1;//设置键按下20ms
                if((KEY_UP==0)&&keytemp>=20)         up_down=1;
                if((KEY_DOWN==0)&&keytemp>=20)        down_down=1;

                if((KEY_SET==0)&&keytemp>=2000)                         //2S 设置键被长按
                {
                       set_down=0;       
                       set_down_long=1;       
                }       
                if((KEY_UP==0)&&keytemp>=2000)
                {
                        up_down=0;       
                        up_down_long=1;       
               }
                if((KEY_SET==0)&&keytemp>=2000) //2S
                {
                       down_down=0;       
                       down_down_long=1;       
                }
        }
        else        //松手等待按键抬起
        {
                if((KEY_SET==1)&&(set_down==1))
                {
                        set_down=0;
                        set_shot_flag=1;        //一个完整的按键操作完成

                }
                if((KEY_SET==1)&&(set_down_long==1))
                {                       
                        set_down_long=0;
                        set_long_flag=1;        //一个完整的长按键操作完成
       
                }
                if((KEY_UP==1)&&(up_down==1))
                {
                        up_down=0;
                        up_shot_flag=1;
                }
           if((KEY_UP==1)&&(up_down_long==1))
                {
                        up_down_long=0;
                        up_long_flag=1;
                }
                if((KEY_DOWN==1)&&(down_down==1))
                {
                        down_down=0;
                        down_shot_flag=1;
                }
           if((KEY_DOWN==1)&&(down_down_long==1))
                {
                        down_down_long=0;
                        down_long_flag=1;

                }
                keystar=0;
        }
//return key_flag;
}


定时时器10sm扫一次

        if (keystar)
        {
                keytemp++;
                if (keytemp>=30000) keytemp=30000; //3S
        }
        else
        {
                keytemp=0;
        }

dujiyo 发表于 2010-5-24 06:39:37

你写的这个程序,有很多看不明白的地方,比如:
定时时器10sm扫一次

if (keystar)
{
keytemp++;
if (keytemp>=30000) keytemp=30000; //3S
}
else
{
keytemp=0;
}

可以把全部的程序发上来看看才能了解你所写的是什么?????

jrcsh 发表于 2010-5-24 10:14:41

长短按的程序的检测原理 不就是按的时间 长点和 短点

m=100
for(n=0;m<n;n++)
{
if(key==0)
{
m++
de(10)//10ms
}
}
if(m>102)
{
if(m>700)//按的时间大于2秒

长按处理

e~~~~~
{
知按处理
}
}

dcss 发表于 2010-5-25 07:16:47

小声说一句,不会是keytemp变量设置成char了吧

dcss 发表于 2010-5-25 07:21:27

对了,刚刚看到一个问题,好像第一楼的写法,程序怎么都会先进入短按键的处理子程序,应该判断,在满足短按键处理条件的时候,增加两个条件就是 1 那个时候按键已经被松开了 2 按键时长小于某个值比如200ms,否则就应该继续等待.建议楼主贴出全部代码,否则真的不好判断

zhuyi2576 发表于 2010-5-25 11:58:29

唉,不用状态机了,用其它方法做好了。

zhuyi2576 发表于 2010-5-25 11:59:36

上面程序没错,可以实现长按,短按
呵,我大意了,调完后忘清标志位了

jacky82512 发表于 2011-8-4 11:10:48

顶一个,最近在研究这个

Ilove51andAVR 发表于 2011-10-8 03:23:59

楼主能把你的程序完整的贴出来吗?让大家学习一下嘛

fusakayuk 发表于 2011-10-8 09:20:49

我也写过这个代码,主要是用定时器中断检测一下按键是否还按下,其实很简单的。2楼用延时的方法会影响其他中断的响应。

zcstkhk 发表于 2011-10-8 12:13:41

我也在学习这个

zcstkhk 发表于 2011-10-8 12:15:09

没回复成功?

w1000 发表于 2011-10-8 15:42:38

MARK

liuzhengyaAVR 发表于 2012-9-3 08:19:21

最近也在学习这个呢!!思路很有用的。谢谢了。

jxchen 发表于 2012-9-24 11:16:18

uchar keyscan(void)
{
      if(KEY_SET==0||KEY_UP==0||KEY_DOWN==0) //有任一键按下,进入按键检测
   你這段程式碼,你這樣寫當三個條件要滿足,才會當成有按鍵被按
   這段就有問題了,請修改參考如下
      if(KEY_SET==0)
          {   //這理放你要執行動作         }
         else
         if(KEY_UP==0)
      {   //這理放你要執行動作       }
         else
       if(KEY_DOWN==0)
      {   //這理放你要執行動作       }
      else
      { //這理放你要執行動作
      }
}

国防大学 发表于 2012-10-22 20:26:19

学习了
……………………………………………………………………………………

liaogang1314 发表于 2013-8-17 14:53:04

我测试了下你的代码 能实现长按 但不能实现短按
页: [1]
查看完整版本: 写的一个按键长短按的程序,但却实现不了,大家帮我看下