更改在C中循环的回调函数中的全局变量

时间:2015-10-21 03:15:24

标签: c for-loop global-variables

此函数将处于循环中。按下按钮时,需要检查条件是否为真,然后更改相同的条件。 (开/关按钮)。

我很难弄清楚如何使用一个变量,每次都可以全局更改,直到下一个按钮按下为止。

我是C中的菜鸟,所以如果这很简单,我就不会感到惊讶,我只是没有看到它。

修改

对不起之前是如此模糊:

以下仅返回false的值:

#define RELAY  1
#define BUTTON 0

//starts in off position
bool isOn = false ;

void waitButton (void)
{
  fflush (stdout) ;
  //Button is Pressed
  if (digitalRead(BUTTON) == 1)
  {
    printf ("Button pushed\n") ;
    //if it's off, turn it on
    if (isOn = false)
    {
      digitalWrite (RELAY, LOW) ;
      static bool isOn = true ;
      printf("Turned off\n") ;
    }
    //if it's on turn it off
    if (isOn = true)
    {
      digitalWrite (RELAY, HIGH) ;
      static bool isOn = false ;
      printf("Turned On\n") ;
    }
    //delay for release of button so it does not trigger twice in a row
    delay(3000) ;
  } else 
  //Button is not pressed keep going through loop
  {

    printf("Waiting for Button\n") ;
    delay(200) ;
  }

}

int main (void)
{
  setup() ;
  for (;;)
  {
    funcA () ;
  }
}

5 个答案:

答案 0 :(得分:0)

我认为您可以将变量condition2用作全局变量,并在函数funcA中更改它。

bool condition2 = true;
funcA()
{
 // your code
}

或者您可以在condition2中将static声明为funcA变量。然后状态可以保存在循环中。如果您不熟悉static关键字,请参阅wiki page了解详细信息。

funcA()
{
 static bool condition2 = true;
 // your code
}

希望它有所帮助。

答案 1 :(得分:0)

它是嵌入式系统吗?是的,如果要在任何时候按下按钮,最好的方法是通过中断。调用延迟例程可能会导致错过关键事件。

如果它只是您正在编写的C控制台程序,那么我仍然建议您不要延迟在代码中完成的方式。

如果我已正确理解您的用例,您需要一个变量,在每次按键时更改其状态,并将其记忆到下一次按键事件。

unsigned int gU32KeyState = CLEAR; //SET and CLEAR can be macros, defined to 1 and 0 respectively.

/* 
 * gU32KeyState shall be updated function or ISR that get the key event.
 * On a simple note, you can toggle gU32KeyState by simply EX-ORing it with 1:
 * as in -- gU32KeyState ^= 1;
 * Additionally, extern the variable if it is supposed to be used with some other source file too: 
 * as in -- extern unsigned int gU32KeyState;
 */

void funcA(void)
{
  //button pressed?
  if(SET == gU32KeyState)
  {
    if(TRUE == condition2)
    {
      //change condition2 to false
      condition2 = FALSE; //TRUE and FALSE can be macros, defined to 1 and 0 respectively.
    }
    else
    {
      //change condition2 to true
      condition2 = TRUE;
    }
    delay(500) ; //Can't quite comprehend why a delay is needed
  }
  else
  {
    delay(500) ; //Can't quite comprehend why a delay is needed
  }
}

我不知道condition2是什么。为了使逻辑可理解,我简单地将其视为您偏好的数据类型的另一个变量。此外,假设如果按下该键,则设置变量,只要未再次按下该按钮,if中的第一个funcA()条件将被评估为真。但是,当第一个if被评估为真时,condition2将继续切换。这需要再考虑一下吗?

显然,我提供的代码片段无法立即编译。

答案 2 :(得分:0)

以下代码运行。你的代码几乎足以运行。 你的工作还没有完成,但是它会运行并为你提供一个起点。

#include <stdlib.h>
#include <stdio.h>

// you said global variables , here they are
int button1 = 0;
int button2 = 0;
int condition1 = 0;
int condition2 = 0;
// end global variables

#define TRUE 1
#define FALSE 0

int setup(  )
{
  // whatever setup you need
}

funcA(  )
{
  if ( button1 )
  {
    printf( "\nYou pressed button1" );
    // add code here to do something
  }
  if ( button2 )
  {
    if ( condition2 == TRUE )   // double = sign is very important here
    {
      condition2 = FALSE;   // change condition2 to false
      printf( "\nYou pressed button2 and condition2 is now 0" );
    }
    else
    {
      condition2 = TRUE;    //change condition2 to true
      printf( "\nYou pressed button2 and condition2 is now 1" );
    }
//    delay(500) ;
  }
}

int main( void )
{
  int i = 0;
  setup(  );

  for ( i; i < 100; i++ )   // lets loop 100 times for now
  {
    button1 = 1;
    button2 = 0;
    funcA(  );
    button1 = 0;
    button2 = 1;
    funcA(  );
  }
}

答案 3 :(得分:0)

我无法理解你的问题所以我猜测, 使用  如果(条件2 ==真) 代替 if(condition2 = true),看看它是否正常工作

答案 4 :(得分:0)

想出来

语法错误。

int ISON = 0 ;

waitButton ()
{
  fflush (stdout) ;
  if (digitalRead(BUTTON) == 1)
  {
    printf ("Button pushed\n") ;
    if (ISON == 1)
    {
      digitalWrite (RELAY, LOW) ;
      ISON = 0 ;
      printf("Turned off\n") ;
    }
    else
    {
      digitalWrite (RELAY, HIGH) ;
      ISON = 1 ;
      printf("Turned On\n") ;
    }
    delay(3000) ;
  } else {
    printf("Waiting for Button\n") ;
    delay(200) ;
  }
}

int main (void)
{
  setup () ;
  for (;;)
  {
    waitButton   () ;
  }
}