Глава 5
208
case 6: PORTD = a|f|g|c|d|e; break; \
case 7: PORTD = a|b|c; break; \
case 8: PORTD = a|b|c|d|e|f|g; break; \
case 9: PORTD = a|b|c|d|f|g; break; \
default: PORTD = 0x00;}
volatile uint8_t digits[4],
indikator = 0;
ISR(TIMER0_OVF_vect) {
PORTA = 0xff; // гасим все индикаторы
si_digit(digits[indikator]); // выводим цифру
PORTA = ~(1 << indikator); // подсвечиваем нужный индикатор
indikator++;
if (indikator == 4) indikator = 0;
}
int main(void) {
// инициализация порта D
DDRD = 0xff;
PORTD = 0x00; // все сегменты погашены
// инициализация порта A
DDRA = 0xff;
PORTA = 0xff; // все индикаторы погашены
// инициализация таймера-счетчика 0
TCNT0 = 0;
TIMSK = (1 << TOIE0); // разрешение прерывания по переполнению T/C0
TCCR0 = (1 << CS02) | (1 << CS00); //
предделитель на 1024
// общее разрешение прерываний
sei();
// выставляем нужные цифры для индикаторов
digits[0] = 1;
digits[1] = 2;
digits[2] = 3;
digits[3] = 4;
while(1);
return(1);
}
Собираем в Proteus схему, изображенную на рис. ПР4.2. Указываем в
модели микроконтроллера нужный файл из проекта AVRStudio и тактовую
частоту. Запускаем моделирование. Скриншот семисегментных индикаторов
с выведенными по заданию цифрами приведен на рис. ПР4.3.