Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define DIGITS_ARRAY_SIZE 10
#define LED_AMOUNT 3
unsigned int digits[DIGITS_ARRAY_SIZE] = {0x3, 0x9F, 0x25, 0xD, 0x99, 0x49, 0x41, 0x1F, 0x1, 0x9};
unsigned int GPeriod = 0;
unsigned int CurrentDigit = 1;
unsigned int Counter = 0;
int datarray[3];
void InitAll()
{
DDRB = 0xFF;
DDRD = 0xFF;
PORTB = 0x0;
/* Timer */
TCNT0 = 0x0;
TCCR0B |= (1<<CS02);//|(1<<CS00);
TIMSK0 |= (1 << TOIE0);
sei();
}
void UpdateLED() {
switch(CurrentDigit) {
case 0:
PORTB = (1 << CurrentDigit);
PORTD = digits[datarray[CurrentDigit]];
break;
case 1:
PORTB = (1 << CurrentDigit);
PORTD = digits[datarray[CurrentDigit]];
break;
case 2:
PORTB = (1 << CurrentDigit);
PORTD = digits[datarray[CurrentDigit]];
break;
}
}
void ConvertToBCD(unsigned int num)
{
unsigned int temp ;
signed char i ;
for (i=2; i>=0; i--) {
datarray[i] = 0;
}
for (i=2; num>0; i--) {
temp = num / 10 ;
datarray[i] = num-(10*temp);
num = temp ;
}
}
ISR(TIMER0_OVF_vect) {
if (CurrentDigit == 2)
CurrentDigit = 0;
else
CurrentDigit++;
if(GPeriod == 10) {
if(Counter == 999)
Counter = 0;
else
Counter++;
ConvertToBCD(Counter);
GPeriod=0;
} else
GPeriod++;
}
int main() {
InitAll();
//ConvertToBCD(459);
while(1) {
UpdateLED();
}
return 0;
}


