#include <string.h>
#include <util/delay.h>
#ifndef _BV
#define _BV(bit) (1<<(bit))
#endif
#ifndef sbi
#define sbi(reg,bit) reg |= (_BV(bit))
#endif
#ifndef cbi
#define cbi(reg,bit) reg &= ~(_BV(bit))
#endif
#ifndef tbi
#define tbi(reg,bit) reg ^= (_BV(bit))
#endif
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))
uint8_t numOfLEDsOn = 0;
void LEDon() {
if (bit_is_clear(PINB, PB0) && numOfLEDsOn < 8) {
PORTD |= _BV(numOfLEDsOn++);
_delay_ms(200);
}
}
void LEDoff() {
if (bit_is_clear(PINB, PB1) && numOfLEDsOn > 0) {
PORTD &= ~_BV(--numOfLEDsOn);
_delay_ms(200);
}
}
void LEDsOn() {
if (bit_is_clear(PINB, PB2)) {
PORTD = 0xff;
numOfLEDsOn = 8;
_delay_ms(200);
}
}
void LEDsOff() {
if (bit_is_clear(PINB, PB3)) {
PORTD = 0x00;
numOfLEDsOn = 0;
_delay_ms(200);
}
}
int main() {
DDRD = 0xff;
DDRB &= ~(_BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3));
PORTB |= _BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3);
while(1) {
LEDon();
LEDoff();
LEDsOn();
LEDsOff();
}
}