// Programowanie mikrokontrolerow 2015/2016, Wydzial Fizyki UW // Rozwiazanie zadania Zegar // Sekwencyjna obsluga wyswietlacza multipleksowanego // // Wymagane polaczenia w ukladzie ZL15AVR: // PC0 - 7SEG A // PC1 - 7SEG B // ... // PC5 - 7SEG F // PC6 - 7SEG G // PC7 - 7SEG . // PD0 - 7SEG 0 // PD1 - 7SEG 1 // PD2 - 7SEG 2 // PD3 - 7SEG 3 // // Autorzy: Pawel Klimczewski, Bartlomiej Zglinicki #include #include #include void configure_pins() { DDRC = 0xff; // Wyprowadzenia PC7..PC0 konfiguruje jako wyjscia. DDRD = 0x0f; // Wyprowadzenia PD3..PD0 konfiguruje jako wyjscia. } uint8_t digits[ 10 ] = { 63, 6, 91, 79, 102, 109, 125, 7, 127, 111 }; uint8_t seg[ 4 ] = { 1 << PD3, 1 << PD2, 1 << PD1, 1 << PD0 }; uint8_t buf[ 4 ] = { 0, 0, 0, 0 }; // Funkcja zwiekszajaca wskazanie zegara o jedna sekunde void zwieksz() { buf[ 3 ]++; if ( buf[ 3 ] == 10 ) { buf[ 3 ] = 0; buf[ 2 ]++; if ( buf[ 2 ] == 6 ) { buf[ 2 ] = 0; buf[ 1 ]++; if(buf[1] == 10) { buf[1] = 0; if(++buf[0] == 6) { buf[0] = 0; } } } } } int main() { configure_pins(); uint8_t i, j = 0; while ( true ) { // Wylaczam wszystkie wyświetlacze PORTD |= 1 << PD3 | 1 << PD2 | 1 << PD1 | 1 << PD0; // Wyswietlam i-ta cyfre PORTC = ~digits[ buf[ i ] ]; // Wlaczam i-ty wyswietlacz PORTD &= ~seg[ i ]; // Zmieniam wyswietlacz na nastepny ++i; if ( i == 4 ) i = 0; // Oczekiwanie przed zmiana wyswietlacza _delay_ms(5); j++; // "Tykniecie" zegara if ( j == 200 ) { j = 0; zwieksz(); } } }