Ja to zrobiłem tak na ATmega128 (wyciąłem zbędne dla tego tematu rzeczy):
----------przerwanie--------------------
SIGNAL(SIG_OUTPUT_COMPARE1A) //przerwanie co 3,84ms
{
switch (nrLED) // EVERY TIME IN INTERRUPT
{
case 1:
{
PORTB=_1; //pod PORTB podpięte są katody 7segm. a _1 to komórka pamięci w której jest to, co chcę wysłać na pierwszy wyświetlacz
//tutaj brakuje instrukcji przełączania anod
nrLED++; //inkrementuję zawartość nrLED, żeby przy następnym przerwaniu załadowało drugi wyświetlacz
break;
}
case 2:
{
PORTB=_2; //pod PORTB podpięte są katody 7segm. a _2 to komórka pamięci w której jest to, co chcę wysłać na drugi wyświetlacz
//tutaj brakuje instrukcji przełączania anod
nrLED++;
break;
}
case 3:
{
PORTB=_3; //pod PORTB podpięte są katody 7segm. a _3 to komórka pamięci w której jest to, co chcę wysłać na trzeci wyświetlacz
//tutaj brakuje instrukcji przełączania anod
nrLED++;
break;
}
case 4:
{
PORTB=_4; //pod PORTB podpięte są katody 7segm. a _4 to komórka pamięci w której jest to, co chcę wysłać na pierwszy wyświetlacz
//tutaj brakuje instrukcji przełączania anod
nrLED=1;
break;
}
default :
{
nrLED=1;
break;
}
}
}
----------koniec przerwania--------------------
----------main--------------------
{
while(1) //kręci w kółko cały main
{
if (!(PING & (1<<PG4))) //wejdź do klamry jeśli wcisnieto przycisk SET TIME
{
_1=0x01; //tu wpisuje na wyświetlacz 17:56
_1=0x07; //ale tylko dopóki trzymasz przycisk SET TIME
_3=0x05; //po zwolnieniu przycisku załaduje dane z hourM, hourL, minuteM, minuteL
_4=0x06;
Delay20ms();
while (!(PING & (1<<PG4))); //czeka aż puszczę
Delay20ms();
}
_1=hourM; //w hourM trzymam starszą godzinę pobraną z RTC
_2=hourL; //w hourM trzymam mlodsza godzinę pobraną z RTC
_3=minuteM; //w minuteM trzymam starszą minute pobraną z RTC
_4=minuteL; //w minuteM trzymam mlodsza minute pobraną z RTC
}
}
----------koniec main--------------------
To działa tak - przerwanie co 3,84ms multipleksuje 4 pojedyncze 7-segmentowe wyświetlacze. Nie jest wyłączane i służy tylko i wyłącznie do wrzucania na wyświetlacze danych ze zmiennych _1, _2, _3, _4. Cyfra oznacza numer wyświetlacza liczony od lewej strony.
While(1) powoduje kręceni się w kółko całego main - żeby program nam się nigdy nie "skończył".
I teraz tak - jak nie wciskasz przycisku SET TIME podłączonego do portu PG4, to na wyświetlacz ładowane są dane wcześniej odczytane z RTC PCF8583. Jest to kod:
_1=hourM;
_2=hourL;
_3=minuteM;
_4=minuteL;
a jeśli wciśniesz przycisk i będziesz go trzymał, to na wyświetlaczu pojawią się cyfry 1756
_1=0x01;
_1=0x07;
_3=0x05;
_4=0x06;
Reasumując: przerwanie non-stop wyrzuca cyfry na wyświetlacz (dba pełne multpleksowanie 4 wyświetlaczy) a w pętli głównej mówisz CO ma być wyświetlane.
Mogę podesłać Tobie cały kod ale ma 2811 linii. Sam nie wiem co zajmuje tyle miejsca ale działa i plik bin ma ok. 30kB (co jest niestety dużo jak na zegar). Najwięcej miejsca zajmuje właśnie obsługa przycisków. Trochę nacudowałem ale nie chce mi się tego optymalizować.
Zastosowałem 4 przyciski: SET, ALARM, UP, DOWN.
Zamieszczam 2 zdjęcia jakbyś chciał coś podpatrzeć.
Pozdrawiam, Janusz
