Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000L
#define start_timer 34285//1 секунда
#define time150 150//2,5 минуты
#define time300 300
#define time450 450
#define time600 600
#define time750 750
#define set150B 7
#define set300B 6
#define set450B 5
#define set600B 4
#define set750B 3
#define startB 2
#define stopB 1
#define inTransistorBaseB 0x01
#define diode1D 0x20
#define diode2A 0x02
#define diode3A 0x01
#define diode4D 0x01
#define diode5D 0x02
#define diode6D 0x04
#define diode7D 0x08
#define diode8D 0x10
int diodeTime[5][8]={
{150,80,50,40,30,20,10,0},
{300,200,150,100,60,30,10,0},
{450,250,150,100,60,30,10,0},
{600,300,150,100,60,30,10,0},
{750,350,150,100,60,30,10,0}
};
int diode_time_id=0;
int timer=0;
int flag=0;
int flag_start=0;
int pinmask_diode[8]={diode1D,diode2A,diode3A,diode4D,diode5D,diode6D,diode7D,diode8D};
void interr() //функция инициализации прерываний
{
TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10); //xtall/256
TIMSK |= (1<<TOIE1);
TCNT1 = start_timer;
}
// главная функция
int main(void)
{
// Конфигурируем порты на вход/выход
//Порт Б DDRB 00000001
DDRB=0x01;
PINB=0x00;
PORTB=0x00;
//Порт D, выход -0,1,2,3,4, 5 = 00111111
DDRD=0x3f;
PIND=0x00;
PORTD=0x00;
//Порт A, выход 00000111
DDRA=0x07;
PINA=0x00;
PORTA=0x00;
interr();
cli();
while(1)
{
if(timer==0 && flag_start==0){
if(PINB & 1<< set150B) {
timer=time150;
diode_time_id=0;}
if(PINB & 1<< set300B){
timer=time300;
diode_time_id=1;}
if(PINB & 1<< set450B){
timer=time450;
diode_time_id=2;
}
if(PINB & 1<< set600B) {
timer=time600;
diode_time_id=3;}
if(PINB & 1<< set750B){
timer=time750;
diode_time_id=4;}
}
if(PINB & 1<< startB)
{
flag_start=1;
sei();
}
if(flag_start==0)
timer=0;
while(flag_start==1){
sei();
if(timer<=diodeTime[diode_time_id][0])
PORTD|=pinmask_diode[0];
for(int i=1;i<3;i++)
if(timer<=diodeTime[diode_time_id][i])
PORTA|=pinmask_diode[i];
for(int i=3;i<8;i++)
if(timer<diodeTime[diode_time_id][i])
PORTD|=pinmask_diode[i];
if(timer<1)
PORTB |= inTransistorBaseB;
if(PINB & 1<< stopB)
{
cli();
flag_start=0;
PORTB &=~ inTransistorBaseB;
PORTA&=~0x07;
PORTD&=~0x3f;
//timer=0;
}
}
}
return 0;
}
ISR( TIMER1_OVF_vect )
{
TCNT1 = start_timer;
timer--;
}