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