c - 变量被重置。不知道为什么

标签 c microcontroller avr

我有变量(选项),我将其显示在液晶显示屏上以查看值。当我按下按钮时,它应该将值更改为 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(),但我们假设 menuXmenuY 已在那里正确初始化(否则它们将是随机的) )。我们可以看到,至少 menuChoice 在与声明它的位置不同的源代码文件中使用......对于其他全局变量也可能是这种情况(这就是为什么它们被声明为全局变量) )。

我建议声明这些变量 volatile ,以便编译器得到一个提示,这些变量可能会在实际编译单元之外更改,因此在优化时要更加小心,例如

volatile uint8_t menuX, menuY;
volatile uint8_t menuChoice, menu, option;

或者尝试完全关闭编译器优化 (-O0)

Further info

关于c - 变量被重置。不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427463/

相关文章:

c - AVR GCC,使用 Timer0 生成音调不起作用

c - 通过分隔符将字符串拆分为两个字符串

用于微 Controller 的 Objective-C?

c - XBee发送和接收数据不一致。嵌入式C

microcontroller - PIC32MX 无法更改选择的 TRIS 位

arduino - 在 Arduino 中使用 Google 'Protocol Buffers'

c - 对数刻度步长

c - 如何通过UDP套接字进行广播?

c - 按位运算的输出说明

c - 如何在c中创建信号量?