conteo de botón pulsador [cerrado]

0

Estoy tratando de tener un botón iterar una tira de LED a través de binario. Cada vez que se presione, se incrementará +1 o -1 dependiendo del botón. Sin embargo, Mi código no parece almacenar la variable en el bucle do-while. Los LED que se encienden son aleatorios en cada pulsación de botón.

#include <avr/io.h>
#define F_CPU 16000000UL

void main(void) {
  //declare DDRx
  DDRD = 0b11111100;  //set PD2-PD7 to output
  DDRB = 0b00000011; //set PB0-PB1 to output and rest to input
  PORTB = 0b00001100; // set internal pullups in PB2 and PB3 turn PB0 and PB1 off
  PORTD = 0b00000000; //turn off PORTD
  //declare num counter
 int num = 0;

  do {

    if ((PINB & 0b0000100) == 0) { //check if PB2 is pressed
      num++;  //add 1 to n i.e. n = 1 on first loop
      PORTD &= 0b0000011; //clear bits 7 - 2
      PORTD |= (num << 2);  //shift bits

      PORTB &= 0b11111100; //clear bits 1 - 0
      PORTB |= (num >> 6);  //shit bits
    } else if ((PINB & 0b0001000) == 0) { //check if PB3 is pressed
      num--; //minus 1 to n
      PORTD &= 0b00000011; //clear bits
      PORTD |= (num << 2); //shift bits

      PORTB &= 0b11111100;
      PORTB |= (num >> 6);
    }
  } while(1);
  return 0;
}
    

1 respuesta

5

Debe tener en cuenta que, tal como está escrito, su código girará alrededor del bucle while docenas, si no es así en cientos de veces, al ver uno u otro de los interruptores pulsados. Dado que su instrucción IF solo comprueba el nivel '0' de la entrada del conmutador, se detectará mientras la entrada esté activa.

Por lo tanto, necesitarás cambiar un poco tu estrategia de codificación. Cada vez que gira alrededor del bucle WHILE, debe buscar 1 - > 0 transición de la entrada del interruptor. Esto se puede hacer manteniendo el valor de entrada del tránsito anterior del bucle en una variable de historial. La lógica de detección se convierte en:     Si el bit anterior == 1 y el bit actual == 0 entonces detectan activo.

Debería familiarizarse con el cambio de interruptor. Lo más probable es que también deba implementar el filtrado de cambio de conmutación en el software a menos que haya tomado medidas en la parte de hardware del diseño para garantizar que no lleguen señales de rebote al pin de la MCU.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas