找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5568|回复: 9
打印 上一主题 下一主题
收起左侧

把一个按键设置为长按和短按执行不同的功能单片机程序 求助

[复制链接]
跳转到指定楼层
楼主
ID:393569 发表于 2018-9-4 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助下,我想把一个按键设置为长按和短按执行不同的程序

按键.png (26.34 KB, 下载次数: 46)

我想把按键设置成长按和短按具体要怎么改

我想把按键设置成长按和短按具体要怎么改
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:393569 发表于 2018-9-4 16:13 | 只看该作者
由没有谁帮忙指导下,用状态机会不会比较方便
回复

使用道具 举报

板凳
ID:80847 发表于 2018-9-4 17:10 | 只看该作者
延时太长,用定时器吧,计数。
回复

使用道具 举报

地板
ID:213173 发表于 2018-9-4 17:24 | 只看该作者
回复

使用道具 举报

5#
ID:164602 发表于 2018-9-5 08:13 | 只看该作者
这是我的一个程序:四键八功能,即一键双功能的按键程序。
你可以参考一下:
                if (Agoto==1)
                {
                        n=0;
                        while(Agoto)
                        {
                                n++;
                                Delay10ms(1);
                                if (n>200)
                                {
                                        break;
                                }
                        }
                        if (n>30)
                        {
                                PWMD();
                        }
                        else
                        {
                                PU();
                        }
                }
回复

使用道具 举报

6#
ID:174087 发表于 2018-9-5 09:27 | 只看该作者
状态机亲测好用
回复

使用道具 举报

7#
ID:393846 发表于 2018-9-5 10:21 | 只看该作者
建议使用switch语句,虽然占用空间,但是逻辑会很清晰
回复

使用道具 举报

8#
ID:393846 发表于 2018-9-5 10:23 | 只看该作者
建议使用switch,这样逻辑很清晰
回复

使用道具 举报

9#
ID:384109 发表于 2018-9-5 10:48 | 只看该作者
用定时器判断按键时间的长短,如果用延时的方法的话,只能用短延时,并且不停的检测按键是否释放,同时记录短延时的次数,通过计算短延时的次数来区分短按键和长按键
回复

使用道具 举报

10#
ID:342239 发表于 2018-9-5 15:25 | 只看该作者
用状态机写比较方便,而且不会阻塞CPU/***************************************************************************
* 名    称:Key_ScanIO();
* 功    能:扫描IO口并判断按键事件(前台程序)
* 入口参数:无
* 出口参数:无,键值压入缓冲队列
* 说     明:该函数需要每隔1/16~1/128S调用一次。最好放在定时中断中执行
***************************************************************************/
void Key_ScanIO()
{
  P_KEY1=N_KEY1;       //将当前KEY1状态保存到前一次状态变量中
  N_KEY1=KEY1_IN;      //将KEY1状态保存到当前变量中
  P_KEY2=N_KEY2;
  N_KEY2=KEY2_IN;
  P_KEY3=N_KEY3;
  N_KEY3=KEY3_IN;
  if((P_KEY1!=0)&&(N_KEY1==0)) KEY1_State=PUSH_KEY;  //如果两次状态不一样,说明K1被按下了
  if((P_KEY2!=0)&&(N_KEY2==0)) Key_InBuff(0x02);
  if((P_KEY3!=0)&&(N_KEY3==0)) Key_InBuff(0x04);
}
/***************************************************************************
* 名    称:Key1_Judge();
* 功    能:判断KEY1 长按、短按
* 入口参数:无
* 出口参数:无,键值压入缓冲队列
* 说     明:该函数需要每隔1/16~1/128S调用一次。最好放在定时中断中执行
***************************************************************************/
void Key1_Judge()
{
  if(KEY1_State==PUSH_KEY)  Key1TimeS++;
   else                     Key1TimeS=0;
   switch(KEY1_State)
   {
    case NOKEY:   
      {
        if(KEY1_IN==0)  KEY1_State=PUSH_KEY;
        break;
      }
   case PUSH_KEY:
     {
        if(KEY1_IN!=0)
        {
          Key_InBuff(0x01);
          KEY1_State=NOKEY;
        }
        else if(Key1TimeS>32*2)
        {
          Key_InBuff(LONG_KEY1);
          KEY1_State=LONG_PUSH;
        }
     }
   case LONG_PUSH:
     {
        if(KEY1_IN!=0)
        {
          KEY1_State=NOKEY;
          Key1TimeS=0;
        }
        break;
     }
   }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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