C程序按下按钮长时间按下时会连续计数

时间:2015-03-04 00:16:54

标签: c button push atmel

仅从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
}

2 个答案:

答案 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()函数退出。  建议放置记住的状态变量  在文件全局地址空间中。)