打印

匠人,菜鸟求助,按键怎么控制2种状态的反转???

[复制链接]
2953|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzk|  楼主 | 2010-6-19 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wangzk 于 2010-6-19 17:08 编辑

按键怎么控制2种状态的反转???
如题:

///P3_4外接按键,低电平有效
void main ()
{
  while(1)
  {
   if (P3_4==0)//检测开关是否按下,
   {
       ///开关按下,操作状态
   }
   else
    {
      ///开关没按下,开机状态
    }
}
}
////疑问:
开机时,P3_4未按下,整个系统处于 “开机状态”。
P3_4按下时,系统处于 “操作状态”。但当按键弹起时,系统又返回“开机状态”
怎么  才能使 P3_4按下又弹起时,系统能够处于“操作状态”。

相关帖子

沙发
HWM| | 2010-6-19 14:31 | 只看该作者
增加内部状态,用键的状态变化(如由未按下到按下)来改变内部状态。

使用特权

评论回复
板凳
wangzk|  楼主 | 2010-6-19 14:47 | 只看该作者
本帖最后由 wangzk 于 2010-6-19 15:32 编辑

貌似 上升沿 下降沿?ls的能再明白些吗? 试试 2# HWM

使用特权

评论回复
地板
wangzk|  楼主 | 2010-6-19 16:37 | 只看该作者
又被难住了 :L  悲哀 偶真是太菜了~~~

使用特权

评论回复
5
wangzk|  楼主 | 2010-6-19 16:50 | 只看该作者

是这样?还不行!?琢磨不出来啊!

本帖最后由 wangzk 于 2010-6-19 17:05 编辑

void main ()
{
  SP=0x5f;
  req=0;
  busy=1;
  while(1)
  {
  if  ( P3_4==1)
  {
   flag1=1;///按键未按下,置位
  }
  if (P3_4==0)
  {
    delay(5);///按键按下延时
    if(P3_4==1)   ////按键弹起
    flag1=0;  /////按下又弹起标志清零
  }
    if (flag1==1)
   {
     
      ///开关没按下,开机状态
   }
     else
   {
     ///开关按下,操作状态     
   }
}
}

使用特权

评论回复
6
wangzk|  楼主 | 2010-6-20 08:41 | 只看该作者
沉下去了  顶起来  期待更详细的解释!:)

使用特权

评论回复
7
black.lu| | 2010-6-20 10:09 | 只看该作者
不知道我理解的对不对,你的意思好像是,当没有按键按下的时候,系统是开机状态,而当有一个按键信号过来
端口被拉低时,系统就进入操作状态。如果单纯是这样,程序处理比较简单,但是我感觉关键是你退出操作状态
进入开机状态时,是由什么信号触发?如果是判断信号始终为高就进入开机状态,显然不合理,除非你的按键是
自锁开关,轻触开关不可能一直按着吧。
//====按键判断====
if(P3_4==0)
{
        if(!fag1)
        {
                flag1=1;        //首次判断
        }
        else
        {
                if(flag_delay)        //在中断10ms中断中置位,(实时性没要求可以直接硬延时)
                {
                        flag_delay=0;
                        flag_on=1;        //按键有效,打开操作标志
                }
        }
}
else
{
        flag1=0;        //这里只清首次判断
}
if(flag_on)
{
        //开机操作
        //操作结束可以清标志
}
else
{
        //开机状态
}

使用特权

评论回复
8
程序匠人| | 2010-6-20 12:14 | 只看该作者
建议你看看匠人的《按键漫谈》

你的问题是把按键当开关处理了,需知二者的区别是:
开关:电平触发信号
按键:边沿触发信号

请先体会一下以上二者的不同

然后,再提醒一下,不管是处理开关,还是按键,都要消抖。

使用特权

评论回复
9
一棵小草| | 2010-6-20 13:36 | 只看该作者
按键怎么控制2种状态的反转???
如题:

///P3_4外接按键,低电平有效
void main ()
{
  while(1)
  {
   if (P3_4==0)//检测开关是否按下,
   {
       ///开关按下,操作状态
   }
   else
    {
      ///开 ...
wangzk 发表于 2010-6-19 14:23


LZ貌似没有把问题想清楚吧。不然的话,你描述的问题也应该清楚了。
按照你的标题,如果用开关来做的话应该很简单的。但,如果你要求按键的话,也不难,但是问题要说清楚。

你所列出的程序当中,确实是(一直)按键就是操作状态,松开键就是开机状态。
你的目的是想按下键什么都不做,松开键就能够处于操作状态。这个也不难实现啊。但是,这个目的和你列出的程序就矛盾了,因为你列出的程序是松开键就开机状态的。要实现你的目的,就得打破你列出的主循环,不过,你好像还没说怎么返回开机状态吧?

flag_op = 0;
flag_poweron = 0;
flag_keyup = 0;
flag_keydown =0;

void main ()
{
      while(1)
      {
              if (P3_4==0)     //发觉按键怎么不消抖的?
              {
                      flag_keydown=1;
                      flag_keyup    =0;
              }
              else
              {
                      flag_keyup = 1;
              }
              if(flag_keydown ==1)
              {
                      if(flag_keyup ==1)
                      {
                              flag_poweron = 1;
                              flag_op =1;
                              flag_keydown =0;
                              flag_keyup =0;
                      }
              }
              if(flag_poweron ==0)
              {
                     //开机状态
              }
              if(flag_op == 1)
              {
                     //操作状态
              }
      }
}
至于在什么条件下返回开机状态就看你了,返回应该不难,设置一下标志位好了。

使用特权

评论回复
10
流行音乐| | 2010-6-20 15:09 | 只看该作者
楼上的代码是在按键弹起的时候切换状态。代码没错,就是算法比较绕弯。

使用特权

评论回复
11
一棵小草| | 2010-6-20 17:33 | 只看该作者
楼上的代码是在按键弹起的时候切换状态。代码没错,就是算法比较绕弯。
流行音乐 发表于 2010-6-20 15:09


不知道你说绕弯是什么?我自己感觉没什么绕弯的,而且理解不难。

其实,我的思路跟七楼的很相似,差不多可以说相同的。只是比七楼的多2个位变量而已。多了个按键位变量,主要是我想让看程序有更好的理解,还有是看起来像状态机。至于状态切换的地方多了个位变量,那是为了方便扩展,如果以后还要加几个状态呢?

使用特权

评论回复
12
fangzhang304| | 2010-6-20 17:58 | 只看该作者
你不妨添加一个子程序,当按键按下时调用子程序,我也不知道行不行。你试试

使用特权

评论回复
13
hotpower| | 2010-6-21 01:36 | 只看该作者
这难道是传说中的“支柱会员”吗???晕,肯定是戏弄匠人的~~~

使用特权

评论回复
14
wangzk|  楼主 | 2010-6-21 08:07 | 只看该作者

hot大叔口下留情,俺是菜鸟。也没戏弄匠人的意思!

本帖最后由 wangzk 于 2010-6-21 08:09 编辑

:L

使用特权

评论回复
15
datouyuan| | 2010-6-21 16:46 | 只看该作者

////疑问:
开机时,P3_4未按下,整个系统处于 “开机状态”。
P3_4按下时,系统处于 “操作状态”。但当按键弹起时,系统又返回“开机状态”
怎么  才能使 P3_4按下又弹起时,系统能够处于“操作状态”。


楼主:
看了这么久,没明白你的意思。

可不可以这样理解:
有一个按键,它的作用如下:
未按时,    “开机状态”
按下时,    “操作状态”
抬起时,    “操作状态”
然后不管怎么操作,都一直出于“操作状态”。

可以加个标志Flag,是0时是“操作状态”,不是0时是“开机状态”
///P3_4外接按键,低电平有效
void main ()
{
  Flag=1;
  while(1)
  {
   if (Flag==0)//检测开关是否按下,
   {
       ///操作状态
   }
   else
    {
      ///开机状态
    }
   if (P3_4==0)//检测开关是否按下,
   {
       Flag=0;///开关按下,
   }
   else
    {
      ///开关没按下
    }

}
}

假如你想要每次按这个键,这2种状态会互相切换,也非常简单。

上面的程序只是我按照你的改的,在实际应用当中,你还是要听听“8楼”的建议。

使用特权

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

本版积分规则

个人签名:[url=http://huiqianxi.taobao.com]http://huiqianxi.

91

主题

680

帖子

0

粉丝