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;
}