此函数将处于循环中。按下按钮时,需要检查条件是否为真,然后更改相同的条件。 (开/关按钮)。
我很难弄清楚如何使用一个变量,每次都可以全局更改,直到下一个按钮按下为止。
我是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 () ;
}
}
答案 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 () ;
}
}