仅从0到3计数。按下向下时加1,按下向上时减1。问题是当我持有它时,它会不断重要。即使我按住按钮很长时间,我也希望它只计数一次。如果有帮助,我正在使用ATMEL SAM3X微控制器。按钮是逻辑0。
#include "..\ASF\common\services\gpio\sam_gpio\sam_gpio.h"
#include "delay.h"
#include "sam3x_ek.h"
#include "Press_Counter.h"
signed int UP_DOWN;
signed int LEFT_RIGHT;
void Press_Counter()
{
unsigned int Button_State;
Button_State=1;
if(UP) //if UP is pressed
{
delay_ms(50);
if(Button_State==1)
{
UP_DOWN--; //decrement
if (UP_DOWN<0)
{
UP_DOWN=0; // To ensure that the minimum value is 0
}
}
Button_State=0;
}
else if(DOWN) //if DOWN is pressed
{
delay_ms(50);
if(Button_State==1)
{
UP_DOWN++; //increment
if (UP_DOWN>3)
{
UP_DOWN=3; // To ensure that the maximum value is 3
}
}
Button_State=0;
}
else
{
Button_State=1;
}
count_UP_DOWN=UP_DOWN; // Get the value of counter cause imma use it later
}
答案 0 :(得分:1)
当您释放按钮时,您必须更改程序的值,因为当您按下按钮时,您根本不想更改值。
所以你必须按照以下方式记住按钮的状态:
delay_ms(50);
If(Button_pressed==1){
if(previous_state==1){
//Do nothing
}
else {
UP_DOWN++;
previous_state = 1;
If(UP_DOWN > 3){
//Do your counter setting stuff here
}
}
else {
previous_state = 0
}
这应该有用;将其放在两个if-clause if(UP)
和if(DOWN)
中并进行相应调整。
希望这会有所帮助: - )
答案 1 :(得分:0)
仅修改按钮状态转换的计数
而不是每次代码检查按钮的状态时计数。
所以添加一个变量来记住按钮的最后状态。 (不要将此按钮放在本地堆栈上 因为先前的状态每次都会丢失/遗忘 press_counter()函数退出。 建议放置记住的状态变量 在文件全局地址空间中。)