#include <avr/io.h>
#include <util/delay.h>

#define S0 0b01111011
#define S1 0b00000011
#define S2 0b01101110
#define S3 0b01001111
#define S4 0b00010111
#define S5 0b01011101
#define S6 0b01111101
#define S7 0b00001011
#define S8 0b01111111
#define S9 0b01011111
#define Sa 0b00111111
#define Sb 0b01110101
#define Sc 0b01111000
#define Sd 0b01100111
#define Se 0b01111100
#define Sf 0b00111100

volatile uint8_t segs[16] = {S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,Sa,Sb,Sc,Sd,Se,Sf};
volatile uint8_t ind = 0;
volatile uint8_t dim = 0;

void show() {
	uint8_t i = ind;
	uint8_t j = dim;
	for(uint8_t l=0;l<20;l++) {
		for(uint8_t k=0;k<j;k++) {
			PORTB = segs[i];
			_delay_us(1);
		}
		for(uint8_t k=0;k<255-j;k++) {
			PORTB = 0;
			_delay_us(1);
		}
	}
}

void dimup() {
	
	for(uint8_t j=0;j<250;j++) {
		dim = j;
		show();
	}
}

void dimdown() {
	for(uint8_t i=250;i>0;i--) {
		dim = i;
		show();
	}
}


int main(void) {
	DDRB = 0b01111111;
	//dim = 1;
	while(1){
		for(uint8_t i=0;i<16;i++) {
			ind = i;
			dimup();
			dimdown();
			//show();
			//_delay_ms(500);
		}
		
	}
}