Потребовалась динамическая индикация на разных портах одновременно. Написал код, но цифры сливаются. Вывожу 123, так вот первый разряд 1 светит ярко,но на нем же проступает 2 и 3 тусклее.
Помогите советом. Камень Мега 8, среда Avr Studio 4.
Код: Выделить всё
//#define F_CPU 8000000UL // Тактовая частота микроконтроллера 8 МГц
// Подключаю стандартные библиотеки
#include <avr/io.h> // Ножки ввода-вывода
#include <util/delay.h> // Задержки
#include <avr/interrupt.h> // Прерывания
volatile unsigned int segcounter = 0;
//создаем глобальные переменные для хранения разрядов выводимого числа
volatile char R1=0;
volatile char R2=0;
volatile char R3=0;
//======динамическая индикация============
void segment (char N)
{
switch (N)
{
case 0:
PORTD|=(1<<5)|(1<<6);
PORTB|=(1<<0)|(1<<2)|(1<<3)|(1<<4);
break; // число 0
case 1:
PORTD|=(1<<5);
PORTB|=(1<<4);
break; // число 1
case 2:
PORTD|=(1<<5)|(1<<6);
PORTB|=(1<<1)|(1<<2)|(1<<3);
break; // число 2
case 3:
PORTD|=(1<<5)|(1<<6);
PORTB|=(1<<1)|(1<<3)|(1<<4);
break; // число 3
case 4:
PORTD|=(1<<5);
PORTB|=(1<<0)|(1<<1)|(1<<4);
break; // число 4
case 5:
PORTD|=(1<<6);
PORTB|=(1<<0)|(1<<1)|(1<<3)|(1<<4);
break; // число 5
case 6:
PORTD|=(1<<6)|(1<<7);
PORTB|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4);
break; // число 6
case 7:
PORTD|=(1<<5)|(1<<6);
PORTB|=(1<<4);
break; // число 7
case 8:
PORTD|=(1<<6)|(1<<7)|(1<<5);
PORTB|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4);
break; // число 8
case 9:
PORTD|=(1<<6)|(1<<7)|(1<<5);
PORTB|=(1<<0)|(1<<1)|(1<<3)|(1<<4);
break; // число 9
case 10:
PORTB|=(1<<1);
break; // знак минус
case 11:
PORTD|=(1<<6)|(1<<5);
PORTB|=(1<<0)|(1<<1);
break; // знак градуса
}
}
void print_led (int chislo)
{
R1=chislo%10; // 1ый разряд
R2=(chislo%100)/10; // 2ой разряд
R3=(chislo%1000)/100; // 3ий разряд
}
//======динамическая индикация конец======
// Прерывание по переполнению T2, динамическая индикация
ISR (TIMER2_OVF_vect)
{
PORTC &=~((1<<2)|(1<<4)|(1<<5));//гасим все разряды
PORTB &=~((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)); // Гасим все сегменты
PORTD &=~((1<<5)|(1<<6)|(1<<7)); // Гасим все сегменты
if(segcounter==0) PORTC|=(1<<5);
if(segcounter==1) PORTC|=(1<<2);
if(segcounter==2) PORTC|=(1<<4);
switch (segcounter)
{
case 0: segment(R1); break; // Выводим первый разряд
case 1: segment(R2); break; // Выводим второй разряд
case 2: segment(R3); break; // Выводим третий разряд
}
segcounter++;
if(segcounter>2) segcounter=0;
}
// Главная программа
int main (void)
{
DDRB=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4);
DDRD=(1<<5)|(1<<6)|(1<<7);
DDRC=(1<<2)|(1<<4)|(1<<5);
// Настройка Таймера 2
TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2
TCCR2 |= (1 << CS22)|(1 << CS20); // Предделитель на 128
asm volatile ("sei"); // Глобально разрешаю прерывания
while(1)
{
R1=1;
R2=1;
R3=1;
}
}



