#include #include #include volatile uint32_t lights = 0b11111111111111111111; volatile uint8_t phase_DDR[4]; volatile uint8_t phase = 0; volatile uint8_t port = 1; volatile uint8_t OCRvalue = 0; volatile uint16_t counter = 0; uint8_t map[] = { 0, 1, // A 1, 0, // B 0, 2, // C 2, 0, // D 0, 3, // E 3, 0, // F 0, 4, // G 4, 0, // H 1, 2, // I 2, 1, // J 1, 3, // K 3, 1, // L 1, 4, // M 4, 1, // N 2, 3, // O 3, 2, // P 2, 4, // Q 4, 2, // R 3, 4, // S 4, 3 // T }; void plexdata(void) { phase_DDR[0] = 0; phase_DDR[1] = 0; phase_DDR[2] = 0; phase_DDR[3] = 0; phase_DDR[4] = 0; uint8_t a; uint8_t b; a = 0; for(b=0; b<20; b++) { if(lights & (uint32_t) (1 << b)) { phase_DDR[map[a]] |= (1 << map[a+1]); } a += 2; } } int main(void) { TCCR1B = (1 << CS13) | (1 << CS12) | (1 << CS11) | (1 << CS10); //TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10); TIMSK = (1 << OCIE1A) | (1 << TOIE1); OCR1A = 0; ADMUX = (1 << ADLAR) | (1 << MUX2); ADCSR = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); plexdata(); sei(); uint8_t fade = 0; while(1) { ADCSR |= (1 << ADSC); loop_until_bit_is_set(ADCSR, ADIF); if(fade) { //OCRvalue--; if(OCRvalue == 0) { fade = 0; } } else { OCRvalue++; if(OCRvalue == 255) { fade = 1; } } _delay_ms(10); } } ISR(TIMER1_CMPA_vect) { PORTA = 0; } ISR(TIMER1_OVF1_vect) { if(OCRvalue > 0) { PORTA = port; DDRA = phase_DDR[phase] | port; } OCR1A = OCRvalue; sei(); if(phase < 4) { phase++; port <<= 1; } else { phase = 0; port = 1; } counter += ADCH; if(counter > 2560) { counter = 0; plexdata(); lights++; if(lights >= 0b10000000000000000000) { lights = 1; } } }