gpt4 book ai didi

c - 在 while 循环中重置值

转载 作者:行者123 更新时间:2023-11-30 19:12:49 26 4
gpt4 key购买 nike

我对这个编程很陌生,试图在 proteus 上设置一个项目,通过使用连接到 PIC 的按钮来添加、减去和设置警报。问题是计数在 while 循环后没有保存并且正在重置。 - 按钮1=加,按钮2=减,按钮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; 被执行。

  • 每当有人按下按钮时,只要按下按钮,增加计数器的条件就保持不变。微 Controller 的速度足够快,可以在缓慢的人按下按钮的时间内运行该代码数千次。相反,您应该仅在按钮从非事件状态变为事件状态时增加计数器。显然,执行此操作的代码需要位于去抖动之后。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com