搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 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;
        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-5-24 06:39:37 | 显示全部楼层
你写的这个程序,有很多看不明白的地方,比如:
定时时器10sm扫一次

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

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

出0入0汤圆

发表于 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~~~~~
{
知按处理
}
}

出0入0汤圆

发表于 2010-5-25 07:16:47 | 显示全部楼层
小声说一句,不会是keytemp变量设置成char了吧

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2010-5-25 11:58:29 | 显示全部楼层
唉,不用状态机了,用其它方法做好了。

出0入0汤圆

 楼主| 发表于 2010-5-25 11:59:36 | 显示全部楼层
上面程序没错,可以实现长按,短按
呵,我大意了,调完后忘清标志位了

出0入0汤圆

发表于 2011-8-4 11:10:48 | 显示全部楼层
顶一个,最近在研究这个

出0入0汤圆

发表于 2011-10-8 03:23:59 | 显示全部楼层
楼主能把你的程序完整的贴出来吗?让大家学习一下嘛

出0入0汤圆

发表于 2011-10-8 09:20:49 | 显示全部楼层
我也写过这个代码,主要是用定时器中断检测一下按键是否还按下,其实很简单的。2楼用延时的方法会影响其他中断的响应。

出0入0汤圆

发表于 2011-10-8 12:13:41 | 显示全部楼层
我也在学习这个

出0入0汤圆

发表于 2011-10-8 12:15:09 | 显示全部楼层
没回复成功?

出0入0汤圆

发表于 2011-10-8 15:42:38 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-9-3 08:19:21 | 显示全部楼层
最近也在学习这个呢!!思路很有用的。谢谢了。

出0入0汤圆

发表于 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
        { //這理放你要執行動作
        }
}

出0入0汤圆

发表于 2012-10-22 20:26:19 | 显示全部楼层
学习了
……………………………………………………………………………………

出0入0汤圆

发表于 2013-8-17 14:53:04 | 显示全部楼层
我测试了下你的代码 能实现长按 但不能实现短按
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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