CODE
#ifndef F_CPU
#define F_CPU 8000000L
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_A (1<<0) //PORTC
#define LED_B (1<<0) //PORTD
#define LED_C (1<<5) //PORTC
#define LED_D (1<<3) //PORTC
#define LED_E (1<<2) //PORTC
#define LED_F (1<<1) //PORTC
#define LED_G (1<<5) //PORTD
#define LED_DP (1<<4) //PORTC
#define ANOD_1 (1<<1) //PORTD
#define ANOD_2 (1<<2) //PORTD
#define ANOD_3 (1<<3) //PORTD
#define ANOD_4 (1<<4) //PORTD
uint8_t digit_buffer[4];
uint8_t digit[] =
{
ANOD_1,
ANOD_2,
ANOD_3,
ANOD_4
};
void show_sig (int8_t sig)
{
switch (sig)
{
case (0):
PORTD &= ~(LED_B);
PORTC &= ~(LED_A|LED_C|LED_D|LED_E|LED_F);
break;
case (1):
PORTD &= ~(LED_B);
PORTC &= ~(LED_C);
break;
case (2):
PORTD &= ~(LED_B|LED_G);
PORTC &= ~(LED_A|LED_E|LED_D);
break;
case (3):
PORTD &= ~(LED_B|LED_G);
PORTC &= ~(LED_A|LED_C|LED_D);
break;
case (4):
PORTD &= ~(LED_B|LED_G);
PORTC &= ~(LED_F|LED_C);
break;
case (5):
PORTD &= ~(LED_G);
PORTC &= ~(LED_A|LED_F|LED_C|LED_D);
break;
case (6):
PORTD &= ~(LED_G);
PORTC &= ~(LED_A|LED_F|LED_E|LED_D|LED_C);
break;
case (7):
PORTD &= ~(LED_B);
PORTC &= ~(LED_A|LED_C);
break;
case (8):
PORTD &= ~(LED_B|LED_G);
PORTC &= ~(LED_A|LED_C|LED_D|LED_E|LED_F);
break;
case (9):
PORTD &= ~(LED_B|LED_G);
PORTC &= ~(LED_F|LED_A|LED_C|LED_D);
break;
case (-1):
PORTC &= ~(LED_DP);
default :
break;
}
}
void clear_digits(void)
{
PORTD &= ~(ANOD_1|ANOD_2|ANOD_3|ANOD_4);
PORTC |= (LED_A|LED_C|LED_D|LED_E|LED_F|LED_DP);
PORTD |= (LED_B|LED_G);
}
void show_time(void)
{
static uint8_t seconds = 0;
static uint8_t minutes = 0;
/*if (++seconds == 60)
{
seconds = 0;
disp.digitValue[2] = 0;
disp.digitValue[3] = 0;*/
if (++minutes == 60)
{
minutes = 0;
digit_buffer[0] = 0;
digit_buffer[1] = 0;
} else
{
if (minutes < 10)
{
digit_buffer[0] = 0;
digit_buffer[1] = minutes;
} else
{
digit_buffer[0] = minutes / 10;
digit_buffer[1] = minutes % 10;
}
}
/*} else
{
if (seconds < 10)
{
disp.digitValue[2] = 0;
disp.digitValue[3] = seconds;
} else
{
disp.digitValue[2] = seconds / 10;
disp.digitValue[3] = seconds % 10;
}
}*/
}
ISR(TIMER2_OVF_vect)
{
static volatile uint8_t i = 0;
//PORTD &= ~(ANOD_1|ANOD_2|ANOD_3|ANOD_4); //Выключаем разряды
clear_digits();
show_sig(digit_buffer[i]);
PORTD |= digit[i]; //Включаем разряды по-очереди
i++;
if (i > sizeof(digit)) i = 0;
return;
}
ISR(TIMER1_OVF_vect)
{
TCNT1 = 0x85EE;
show_time();
}
int main(void)
{
DDRC = 0x3F;
DDRD = 0x3F;
/////////////////////////////////////////////////////////
TCCR1A = 0x00;
TCCR1B = (1<<CS12); //div/256
TIMSK |= (1<<TOIE1); //enable overflow interrupt
TCNT1 = 0x85EE; //start from 34286
/////////////////////////////////////////////////////////
TCCR2 = (1<<CS21); //div/8
TIMSK |= (1<<TOIE2); //enable overflow interrupt
/////////////////////////////////////////////////////////
asm("sei");
while(1);
}