我有变量(选项),我将其显示在液晶显示屏上以查看值。当我按下按钮时,它应该将值更改为 1。但它以其他方式工作。 (选项)只有当我按住按钮时才为1,但是当我释放此按钮时,变量为0。我在所有文件(选项)中搜索,但它只在一个文件中,并且带有此变量的所有代码行都显示在这个中一段代码(在 fun (menuRun()) 中)。
在menu.c中
void menuRun(char * Uline, char * Lline, uint8_t * x, uint8_t * y)
{
uint8_t button;
uint16_t value;
char buffer[20];
button = whichButton(buffer);
value = getValue();
if (menuX==0) /* <---- this is false when i am testing*/
{
cursorOn();
if (menuY==0)
{
strncpy(bufferUline,"*",strlen("*"));
strncpy(bufferLline," ",strlen(" "));
} else
{
strncpy(bufferLline,"*",strlen("*"));
strncpy(bufferUline," ",strlen(" "));
}
if (button == 1)
{
menuX = 1;
cursorOff();
}else if (button == 3)
{
menuY=0;
strncpy(bufferUline,"*",strlen("*"));
strncpy(bufferLline," ",strlen(" "));
}else if (button == 4)
{
menuY=1;
strncpy(bufferLline,"*",strlen("*"));
strncpy(bufferUline," ",strlen(" "));
}
} else /* <---- this is true when i am testing*/
{
if (menuY & 1) /* <---- this is false when i am testing*/
{
if (option & 1)
{
x=6;
strcpy(bufferLline," 0000 ");
}else
{
}
}else /* <---- this is true when i am testing*/
{
/* This doesnt matter for now*/
if (option&1)
{
strcpy(bufferUline," Nowy kod ");
//strcpy(bufferLline," xxxx ");
}else
{
strcpy(bufferUline," Nowa pora dnia ");
//strcpy(bufferLline," xx:xx-xx:xx ");
}
if (button == 2)
{
menuX=0;
menuY=0;
}
else if (button == 3)
{
/*Here I change variable option, when button pressed*/
option=1;
}else if (button == 4)
{
//option=0;
}
}
}
//strcpy(bufferLline,itoa(option,buffer,10));
//strncpy(bufferLline+5,itoa(menu,buffer,10),strlen(itoa(menu,buffer,10)));
/* Here I copy value of variable "option" into bufferLline, which is display on lcd*/
strncpy(bufferLline,itoa(option,buffer,10),strlen(itoa(option,buffer,10)));
*x=menuX;
*y=menuY;
strcpy(Uline,bufferUline);
strcpy(Lline,bufferLline);
}
在menu.h中
uint8_t menuX, menuY;
uint8_t menuChoice, menu, option;
在main.c中
int main(void)
{
init();
char buffer[11];
correctCode = eeprom_read_word(&correctCodeEem);
correctCode = 1234;
counterClick=0;
menuChoice=1;
uint8_t x,y;
while(1)
{
if (led & 1)
{
menuRun(upperLine,lowerLine,&x,&y);
led=0;
}
if (lcd & 1)
{
//char upperBuffer[16], lowerBuffer[16];
//strcpy(upperBuffer,upperLine);
//strcpy(lowerBuffer,lowerLine);
lcdDisplay(upperLine,lowerLine);
lcdGoTo(x,y);
lcd=0;
}
}
}
LED 和 LCD 的标志由定时器设置,效果良好。
我不知道为什么(选项)被重置。当我按下按钮一次时,它应该将(选项)设置为 1。
最佳答案
我们不知道函数 init()
,但我们假设 menuX
、menuY
已在那里正确初始化(否则它们将是随机的) )。我们可以看到,至少 menuChoice
在与声明它的位置不同的源代码文件中使用......对于其他全局变量也可能是这种情况(这就是为什么它们被声明为全局变量) )。
我建议声明这些变量 volatile
,以便编译器得到一个提示,这些变量可能会在实际编译单元之外更改,因此在优化时要更加小心,例如
volatile uint8_t menuX, menuY;
volatile uint8_t menuChoice, menu, option;
或者尝试完全关闭编译器优化 (-O0
)
关于c - 变量被重置。不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427463/