Программа, которая есть: При запуске отображается цифра 6, при нажатии кнопок значение увеличивается и уменьшается на 1 (от 6ти до 1го). Не работает одновременное нажатие кнопок, алгоритм обратного отсчета прописан (если к примеру установлена цифра 5 то через пять секунд загориться светодиод). На неоптимизированность программы внимания не обращать. Нужно прописать в коде так, чтобы при одновременном нажатии двух кнопок запустился алгоритм обратного отсчета. Кнопки управляют прерываниями INT0 и INT1.
Спойлер
Код: Выделить всё
#define F_CPU 1000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
unsigned char s=6; //Переменная цифры
#define FALSHE 0
#define TRUE 1
volatile _Bool d=FALSHE;
//Программа индикации цифры 6
void ind_6 (unsigned int a)
{
PORTC &= ~_BV(PC0);
PORTC &= ~_BV(PC1);
PORTC |= _BV(PC2);
PORTC &= ~_BV(PC3);
PORTC &= ~_BV(PC4);
PORTB &= ~_BV(PB6);
PORTB &= ~_BV(PB7);
}
//Программа индикации цифры 5
void ind_5 (unsigned int a)
{
PORTC &= ~_BV(PC0);
PORTC &= ~_BV(PC1);
PORTC |= _BV(PC2);
PORTC &= ~_BV(PC3);
PORTC &= ~_BV(PC4);
PORTB &= ~_BV(PB6);
PORTB |= _BV(PB7);
}
//Программа индикации цифры 4
void ind_4 (unsigned int a)
{
PORTC &= ~_BV(PC0);
PORTC &= ~_BV(PC1);
PORTC &= ~_BV(PC2);
PORTC |= _BV(PC3);
PORTC &= ~_BV(PC4);
PORTB |= _BV(PB6);
PORTB |= _BV(PB7);
}
//Программа индикации цифры 3
void ind_3 (unsigned int a)
{
PORTC &= ~_BV(PC0);
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC &= ~_BV(PC3);
PORTC &= ~_BV(PC4);
PORTB &= ~_BV(PB6);
PORTB |= _BV(PB7);
}
//Программа индикации цифры 2
void ind_2 (unsigned int a)
{
PORTC &= ~_BV(PC0);
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC &= ~_BV(PC3);
PORTC |= _BV(PC4);
PORTB &= ~_BV(PB6);
PORTB &= ~_BV(PB7);
}
//Программа индикации цифры 1
void ind_1 (unsigned int a)
{
PORTC |= _BV(PC0);
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC |= _BV(PC3);
PORTC &= ~_BV(PC4);
PORTB |= _BV(PB6);
PORTB |= _BV(PB7);
}
//Программа индикации цифры 0
void ind_0 (unsigned int a)
{
PORTC |= _BV(PC0);
PORTC &= ~_BV(PC1);
PORTC &= ~_BV(PC2);
PORTC &= ~_BV(PC3);
PORTC &= ~_BV(PC4);
PORTB &= ~_BV(PB6);
PORTB &= ~_BV(PB7);
}
//Программа задержки
void pause (unsigned int a)
{
unsigned int i; //декларация переменной для программы задержки
for (i=a;i>0;i--); //Основной цикл программы задержки
}
void start (unsigned int a)
{
EIMSK=0b00000000; //запрещаем прерывание int0 и int1 - кнопка
cli();//запрещение прерываний на время обработки прерывания
while(s=6){ ind_6(s); _delay_ms(1000); ind_5(s); _delay_ms(1000); ind_4(s); _delay_ms(1000); ind_3(s); _delay_ms(1000); ind_2(s); _delay_ms(1000); ind_1(s); _delay_ms(1000); ind_0(s); PORTD &= ~_BV(PD0); PORTD |= _BV(PD0); _delay_ms(250); PORTD &= ~_BV(PD1); PORTD |= _BV(PD1); PORTD &= ~_BV(PD4);
PORTD |= _BV(PD4);}
while(s=5){ ind_5(s); _delay_ms(1000); ind_4(s); _delay_ms(1000); ind_3(s); _delay_ms(1000); ind_2(s); _delay_ms(1000); ind_1(s); _delay_ms(1000); ind_0(s); PORTD &= ~_BV(PD0); PORTD |= _BV(PD0); _delay_ms(250); PORTD &= ~_BV(PD1); PORTD |= _BV(PD1); }
while(s=4){ ind_4(s); _delay_ms(1000); ind_3(s); _delay_ms(1000); ind_2(s); _delay_ms(1000); ind_1(s); _delay_ms(1000); ind_0(s); PORTD &= ~_BV(PD0); PORTD |= _BV(PD0); _delay_ms(250); PORTD &= ~_BV(PD1); PORTD |= _BV(PD1); }
while(s=3){ ind_3(s); _delay_ms(1000); ind_2(s); _delay_ms(1000); ind_1(s); _delay_ms(1000); ind_0(s); PORTD &= ~_BV(PD0); PORTD |= _BV(PD0); _delay_ms(250); PORTD &= ~_BV(PD1); PORTD |= _BV(PD1); }
while(s=2){ ind_2(s); _delay_ms(1000); ind_1(s); _delay_ms(1000); ind_0(s); PORTD &= ~_BV(PD0); PORTD |= _BV(PD0); _delay_ms(250); PORTD &= ~_BV(PD1); PORTD |= _BV(PD1); }
while(s=1){ ind_1(s); _delay_ms(1000); ind_0(s); PORTD &= ~_BV(PD0); PORTD |= _BV(PD0); _delay_ms(250); PORTD &= ~_BV(PD1); PORTD |= _BV(PD1); }
sei();//разрешение прерываний
}
ISR(INT1_vect) {
_delay_ms(150);
cli();//запрещение прерываний на время обработки прерывания
s=s-1;
sei();//разрешение прерываний
if (INT0 == FALSHE)
{
}
else
{ start(s);
}
}
ISR(INT0_vect) {
_delay_ms(150);
cli();//запрещение прерываний на время обработки прерывания
s=s+1;
sei();//разрешение прерываний
if (INT1 == TRUE)
{
}
else
{ start(s);
}
}
int main(void)
{
DDRC=0x3f;
PORTC=0x00;
DDRD=0x0C;
PORTD=0xff;
DDRB=0xC0;
PORTB=0x00;
EICRA = (1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (1<<ISC00);// настройка срабатывания прерываний
PCICR |= (1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);// разрешение прерываний с портов...
PCMSK2=0b10000000; //разрешаем прерывание pcint23
EIMSK=0b11000011; //разрешаем прерывание int0 и int1 - кнопка
MCUCR=0b00001111;// int by rising front - для кнопки 1 и 2
sei(); //Глобальное разрешение прерываний
while(1)
{
if (s > 6)
{
s--;
}
else
{
}
if (s == 0)
{
s++;
}
else
{
}
cli(); //запрещение прерываний
if (s == 6) //Если переменная равна 6
{
ind_6(s); //Выводим на индикатор цифру
}
else
{
if (s == 5) //Если переменная равна 5
{
ind_5(s); //Выводим на индикатор цифру
}
else
{
if (s == 4) //Если переменная равна 4
{
ind_4(s); //Выводим на индикатор цифру
}
else
{
if (s == 3) //Если переменная равна 3
{
ind_3(s); //Выводим на индикатор цифру
}
else
{
if (s == 2) //Если переменная равна 2
{
ind_2(s); //Выводим на индикатор цифру
}
else
{
if (s == 1) //Если переменная равна 1
{
ind_1(s); //Выводим на индикатор цифру
}
else
{
}
}
}
}
}
}
sei(); //Разрешить прерывания
pause(1000); //Пауза
}
}


