Семисегментный LED-индикатор. Эффекты анимации
Добавлено: Пт авг 21, 2020 20:00:54
Хотелось бы поэкспериментировать с этим индикатором в плане эффектов. Для начала решил написать вот такого вида, бегущий прочерк по часовой стрелке. Для отображения на индикаторе взял код (прерывание по Таймеру0) один из доступных в сети.
В общем всё взлетело, только код получился, как мне кажется очень кривой и громоздкий. И ещё появился один косяк. Яркость индикатора упала в два раза от оригинала ( таймера с которого я взял код обработки прерывания для динамической индикации). И не придумал, как можно обойтись одни таймером. И можно ли вообще одним только? Выслушаю все замечания и рекомендации.
Код: Выделить всё
- - - - -
| |
- - - - -Спойлер
Код: Выделить всё
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define CHISLO PORTD
#define RAZRIAD PORTB
unsigned int Razrad1 = 0, Razrad2 = 0, Razrad3 = 0, Razrad4 = 0;
unsigned char bc547 = 1;
ISR (TIMER0_OVF_vect)
{
asm("cli");
if (bc547 == 1) {RAZRIAD = 0b00001000; CHISLO = Razrad1;} //включаем 1-й разряд, остальные выключаем
if (bc547 == 2) {RAZRIAD = 0b00000100; CHISLO = Razrad2;} //включаем 2-й разряд, остальные выключаем
if (bc547 == 3) {RAZRIAD = 0b00000010; CHISLO = Razrad3;} //включаем 3-й разряд, остальные выключаем
if (bc547 == 4) {RAZRIAD = 0b00000001; CHISLO = Razrad4;} //включаем 4-й разряд, остальные выключаем
bc547++; // добавляем к переменной BC547 единицу
if (bc547 > 4) bc547 = 1; // отслеживаем переменную BC547, чтобы она не превысила значение 4
}
ISR(TIMER1_COMPA_vect)
{
static unsigned char Razrad;
Razrad++;
switch (Razrad)
{
case 1:
Razrad1 = 0b00110001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001111;
break;
case 2:
Razrad1 = 0b00101001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001111;
break;
case 3:
Razrad1 = 0b00011001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001111;
break;
case 4:
Razrad1 = 0b00111000;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001111;
break;
case 5:
Razrad1 = 0b00111001;
Razrad2 = 0b00001000;
Razrad3 = 0b00001001;
Razrad4 = 0b00001111;
break;
case 6:
Razrad1 = 0b00111001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001000;
Razrad4 = 0b00001111;
break;
case 7:
Razrad1 = 0b00111001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001110;
break;
case 8:
Razrad1 = 0b00111001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001101;
break;
case 9:
Razrad1 = 0b00111001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001011;
break;
case 10:
Razrad1 = 0b00111001;
Razrad2 = 0b00001001;
Razrad3 = 0b00001001;
Razrad4 = 0b00000111;
break;
case 11:
Razrad1 = 0b00111001;
Razrad2 = 0b00001001;
Razrad3 = 0b00000001;
Razrad4 = 0b00001111;
break;
case 12:
Razrad1 = 0b00111001;
Razrad2 = 0b00000001;
Razrad3 = 0b00001001;
Razrad4 = 0b00001111;
Razrad = 0;
break;
}
}
int main(void)
{
TCCR1B &= ~(1<<CS12);
TCCR1B |= (1<<CS11) | (1<<CS10); // деление частоты на 64 = 15625
TIMSK |= (1<<OCIE1A); // разрешаем прерывание при совпадении
OCR1AH = 0b00000110;
OCR1AL = 0b00001001; // регистр сравнения
TCNT1 = 0;
TCCR1B |= (1<<WGM12); // сброс при совпадении
TCCR0 |= (1<<1);
TCCR0 &= ~((1<<0) | (1<<2)); // f/8
TIMSK |= (1<<0);
TCNT0 = 0;
sei ();
while(1)
{
//TODO:: Please write your application code
}
}