我对这个编程非常陌生,试图通过使用连接到PIC的按钮来增加,减去和设置警报。问题是在while循环之后计数未保存并且正在重置。 - button1 = ADD,button2 = MINUS,按钮1 + 2 + 3 = ALARM - 无法弄清楚为什么整体计数被重置为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
}
}
}
答案 0 :(得分:1)
您有以下错误:
您永远不会在任何地方初始化flags
。当然,标准要求静态存储持续时间变量初始化为零。但是在嵌入式系统中,有一个非常常见的非标准扩展,它从启动代码中删除了“零输出”部分。创建项目时,您经常会选择“最小启动”或“标准C”。因此,在使用它们之前,请始终在运行时手动初始化所有变量。强大的嵌入式代码不会对.data
和.bss
段中的变量的默认值做出任何假设。
您尚未实施任何去抖动。请查看一些有关如何阅读嵌入式系统中的按钮的初学者教程,以避免机电信号反弹的问题。信号反弹导致代码flags[0] = 0;
被执行。
每当有人按下按钮时,只要按下按钮,增加计数器的条件就会保持为真。微控制器足够快,可以在缓慢的人按下按钮的过程中运行该代码数千次。相反,您应该只在按钮从非活动状态变为活动状态时增加计数器。显然,执行此操作的代码需要在去抖后找到。