Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
                        
                        3年前关闭。
                                                                                            
                
        
我对这种编程非常陌生,试图通过使用连接到PIC的按钮来设置proteus上的项目以添加,减去和设置警报。问题是while循环后计数未保存并正在重置。
 -button1 =添加,button2 =减号,button 1 + 2 + 3 =报警
 -无法弄清楚为什么总计数被重置为0
 -任何帮助都将是惊人的

#include <main.h>
#ZERO_RAM

int a = 0;
int state;
char data = 'y';
short int flags[3];
char uart_rd;

void main()
{
    setup_wdt(WDT_1MS); //~1.0 ms reset

    port_a_pullups(0xFF); // Defining PORTA as pullup Resistors

    printf("program start" nr); //<------keeps resetting value to 0 HERE

    while (TRUE) // infinite loop
    {
        if (!input(PIN_A1)) // add button
        {
            if (!flags[0])
            {
                flags[0] = 1;
                a++; // add one to overall count
                printf("ADDED, Total= %dnr", a); // prints count
            }
        }
        else
        {
            flags[0] = 0;
        }
        if (!input(PIN_A2)) // minus button
        {
            if (!flags[1])
            {
                flags[1] = 1;
                a--; // take away 1 from count
                printf("MINUS, Total= %dnr", a); // print count
            }
        }
        else
        {
            flags[1] = 0;
        }
        if ((!input(PIN_A1)) && (!input(PIN_A2)) && (!input(PIN_A3))) // all buttons     equal alarm
        {
            printf("ALARM HAS BEEN SETnr"); // if all buttons are held constant alarm
            // is printed through Terminal
        }
        else
        {
            flags[2] = 0;
            output_high(PIN_A0); // led goes high
            delay_ms(500); // flashing LED every cycle
            output_low(PIN_A0); // led goes low
            printf("Overall Count= %dnr", a); // printf overall count
        }
    }
}

最佳答案

您有以下错误:


您永远不会在任何地方初始化flags。当然,标准要求将静态存储持续时间变量初始化为零。但是在嵌入式系统中,有一个非常常见的非标准扩展,它从启动代码中删除了“零输出”部分。创建项目时,通常会获得“最小启动”或“标准C”选项。因此,始终在运行时手动初始化所​​有变量,然后再使用它们。健壮的嵌入式代码不对.data.bss段中的变量默认值做任何假设。
您尚未实施任何反跳操作。请查看一些有关如何读取嵌入式系统中按钮的初学者教程,以避免机电信号弹跳的问题。信号反弹导致代码flags[0] = 0;被执行。
每当有人按下按钮时,只要按下按钮,您增加计数器的条件就保持为真。在一个缓慢的人按住按钮的时间内,微控制器足够快,可以运行该代码数千次。相反,仅应在按钮从非活动状态变为活动状态时增加计数器。显然,执行此操作的代码需要在反跳之后找到。

关于c - 在while循环中重置值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36425533/

10-15 16:47