Почему счетчик увеличивается перед уменьшением?

P1DIR |= 0x01;                          // Set P1.0 (GREEN LED) to output direction
P4DIR |= 0x40;                          // Set P4.6 (RED LED) to output direction
P1OUT |= 0x01;                          // Set GREEN LED on
P4OUT |= 0x40;                          // Set RED LED on

P1REN |= 0x02;                          // enable P1.1 (Pushbutton S2)
P1DIR &= ~0x02;                         // enable read port P1.1 (Pushbutton S2)

P4REN |= 0x20;                          // enable P4.5 (Pushbutton S1)
P4DIR &= ~0x20;                         // enable read port P4.5 (PushButton S1)

volatile unsigned int i;
unsigned int counter = 0;

while(1)
{

    if((P4IN & BIT5)== 0)   // is the pushbutton S2 pressed? (P1.1)
    {
        printf("c= %d\r\n",counter);
        P4OUT ^= 0x40;      // toggle RED LED
        i = 10000;
        do i--;
        while(i != 0);
        counter++;
    }

    if((P1IN & 0x02)==0)
    {
        printf("c= %d\r\n",counter);
        counter--;
    }

    if((P1IN & 0x02)==0)
    {
        P1OUT |= 0x01;      // turn on GREEN LED when pushbutton is pressed
        P4OUT ^= 0x40;      // toggle RED LED
        i = 10000;
        do i--;
        while(i != 0);
    }

    else
    {
        P1OUT &= ~0x01;     // Turns off GREEN LED

        P4OUT ^= 0x40;      // toggle RED LED
        i = 10000;
        do i--;
        while(i != 0);
    }
}
return 0;

}

Привет, мой текущий код здесь позволяет мне нажать кнопку S1 и вывести оператор на консоль, увеличивая его каждый раз, когда я нажимаю ее. Это также позволяет мне уменьшать его каждый раз, когда я нажимаю кнопку S2. Однако моя проблема заключается в том, что когда я начинаю увеличивать и хочу уменьшить значение, оно будет увеличиваться еще раз, прежде чем уменьшаться (также происходит и наоборот, если я попытаюсь увеличить после уменьшения, оно еще раз уменьшится перед увеличением). Я хотел бы знать, почему это так, и что я могу сделать, чтобы программа этого не делала и сразу уменьшалась / увеличивалась. Спасибо


person Alejandro Herrera    schedule 13.08.2014    source источник


Ответы (1)


Вы печатаете значение счетчика до того, как оно будет обновлено, поэтому вы видите значение до нажатия кнопки. Попробуйте обновить счетчик, а затем распечатать результат:

if((P4IN & BIT5)== 0)   // is the pushbutton S2 pressed? (P1.1)
{
    counter++;
    printf("c= %d\r\n",counter);
    P4OUT ^= 0x40;      // toggle RED LED
    i = 10000;
    do i--;
    while(i != 0);
}

if((P1IN & 0x02)==0)
{
    counter--;
    printf("c= %d\r\n",counter);
}
person Eduard Sanz    schedule 13.08.2014