Подключаем многоразрядный семисегментный индикатор к Atmega8515

Будем зажигать несколько разрядов (цифр) одновременно на семисегментном многоразрядном индикаторе, код простой – написан на языке Си в MpLab X 5.35 (скачать можно здесь ).

Схема подключения:

Здесь на выходы A0-А3 – подключены разряды 1,2,3 и 4 у семисегментного индикатора – на них при помощи npn транзистора (в качестве “управляемого минуса”, можно использовать любой npn транзистор – он используется в качестве ключа) будут подаваться минуса.

Выходы C0,C1,C2,C3,C4,C5,C6 – будут формировать цифры:
С0 – a
C1 – b
C2 – c
C3 – d
C4 – e
C5 – f
C6 – g

Таким образом цифры будут записаны следующим образом:
0 – PORTC = 0b00111111;
1 – PORTC = 0b00001100;
2 – PORTC = 0b01110110;
3 – PORTC = 0b00101110;
4 – PORTC = 0b01001101;
5 – PORTC = 0b01011011;
6 – PORTC = 0b01111101;
7 – PORTC = 0b00001110;
8 – PORTC = 0b01111111;
9 – PORTC = 0b01011111;

—————————————————-
Интересный факт:

В среднем человеческий глаз может воспринимать частоты до 60 Гц. При этом некоторые люди способны различать и более высокие частоты — до 90 Гц. 1

Способность воспринимать мерцание и высокую частоту кадров индивидуальна для каждого человека и даже меняется со временем.
—————————————————-

————————————————————
ЧЕТЫРЕ ЦИФРЫ одновременно.
—————————————————————

Скачать hex файл и С файл:
– в формате zip архива
– в формате tar.gz архива

У меня фьюзы были выставлены на внутренний RC генератор 4МГц (по фьюзам по умолчанию атмега8515 работает на частоте 1МГц)

Задержку между цифрами пришлось искать экспериментально – поставил разную:
_delay_ms(20); между четырех цифр – мигание не видно 20*4=80 (4000/80=50 Гц)
_delay_ms(30); между четырех цифр – мигание видно 30*4=120 (4000/120=33,3 Гц)
_delay_ms(50); между четырех цифр – мигание очень хорошо видно 50*4=200

Соответственно если используете фьюзы по умолчанию – 1МГц, то задержку нужно поставить 1000/50=20 – то есть 20/на 4 цифры =5 , то есть _delay_ms(5);

Также в цикле 125 – будет отвечать за длительность смены цифр.

Код с 4 цифрами:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//#define F_CPU 16000000UL // 16 MHz clock speed
   
int main(void)
{


PORTA = 0b00000000; //vihod
DDRA=0xFF; //

PORTD = 0b00000000; //vihod
DDRD=0xFF; //

PORTC = 0b00000000; //vihod
DDRC=0xFF; //

int m = 0;

   
while (1)
      {
     for (m = 0; m <= 125; ++m)
        {    
            
            PORTA = 0b00000010; //minus na pozicii 1
            PORTC = 0b00001000; 
            PORTD = 0b01000000; //1 na pozicii 1
            _delay_ms(50); 
            PORTA = 0b00000100; //minus na pozicii 2
            PORTC = 0b00001000; 
            PORTD = 0b01100000; //7 na pozicii 2
            _delay_ms(50); 
            PORTA = 0b00001000; //minus na pozicii 3
            PORTC = 0b00111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(50);
            PORTA = 0b00010000; //minus na pozicii 4
            PORTC = 0b01111000; 
            PORTD = 0b01101000; //8 na pozicii 3
            _delay_ms(50); 
        }
        m = 0;
        for (m = 0; m <= 125; ++m)
        {    
 
            PORTA = 0b00000100; //minus na pozicii 1
            PORTC = 0b00001000; 
            PORTD = 0b01000000; //1 na pozicii 1
            _delay_ms(30); 
            PORTA = 0b00001000; //minus na pozicii 2
            PORTC = 0b00001000; 
            PORTD = 0b01100000; //7 na pozicii 2
            _delay_ms(30); 
            PORTA = 0b00010000; //minus na pozicii 3
            PORTC = 0b00111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(30);
            PORTA = 0b00000010; //minus na pozicii 4
            PORTC = 0b01111000; 
            PORTD = 0b01101000; //8 na pozicii 3
            _delay_ms(30); 
        }
        m = 0;
        for (m = 0; m <= 125; ++m)
        {    
 
            PORTA = 0b00001000; //minus na pozicii 1
            PORTC = 0b00001000; 
            PORTD = 0b01000000; //1 na pozicii 1
            _delay_ms(20); 
            PORTA = 0b00010000; //minus na pozicii 2
            PORTC = 0b00001000; 
            PORTD = 0b01100000; //7 na pozicii 2
            _delay_ms(20); 
            PORTA = 0b00000010; //minus na pozicii 3
            PORTC = 0b00111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(20);
            PORTA = 0b00000100; //minus na pozicii 4
            PORTC = 0b01111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(20); 
        }
        m = 0;
    
}
}

——————————————–
Код со стандартными фьюзами Atmega8515 – 1 МГц
————————————
_delay_ms(5); между четырех цифр – мигание не видно 5*4цифры=20 (1000/20=50 Гц)
_delay_ms(7); между четырех цифр – мигание видно 7*4=28 (1000/28=35,7 Гц)
_delay_ms(10); между четырех цифр – мигание очень хорошо видно 10*4=40 (1000/40=25 Гц)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//#define F_CPU 16000000UL // 16 MHz clock speed
   
int main(void)
{


PORTA = 0b00000000; //vihod
DDRA=0xFF; //

PORTD = 0b00000000; //vihod
DDRD=0xFF; //

PORTC = 0b00000000; //vihod
DDRC=0xFF; //

int m = 0;

   
while (1)
      {
     for (m = 0; m <= 125; ++m)
        {    
            
            PORTA = 0b00000010; //minus na pozicii 1
            PORTC = 0b00001000; 
            PORTD = 0b01000000; //1 na pozicii 1
            _delay_ms(10); 
            PORTA = 0b00000100; //minus na pozicii 2
            PORTC = 0b00001000; 
            PORTD = 0b01100000; //7 na pozicii 2
            _delay_ms(10); 
            PORTA = 0b00001000; //minus na pozicii 3
            PORTC = 0b00111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(10);
            PORTA = 0b00010000; //minus na pozicii 4
            PORTC = 0b01111000; 
            PORTD = 0b01101000; //8 na pozicii 3
            _delay_ms(10); 
        }
        m = 0;
        for (m = 0; m <= 125; ++m)
        {    
 
            PORTA = 0b00000100; //minus na pozicii 1
            PORTC = 0b00001000; 
            PORTD = 0b01000000; //1 na pozicii 1
            _delay_ms(7); 
            PORTA = 0b00001000; //minus na pozicii 2
            PORTC = 0b00001000; 
            PORTD = 0b01100000; //7 na pozicii 2
            _delay_ms(7); 
            PORTA = 0b00010000; //minus na pozicii 3
            PORTC = 0b00111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(7);
            PORTA = 0b00000010; //minus na pozicii 4
            PORTC = 0b01111000; 
            PORTD = 0b01101000; //8 na pozicii 3
            _delay_ms(7); 
        }
        m = 0;
        for (m = 0; m <= 125; ++m)
        {    
 
            PORTA = 0b00001000; //minus na pozicii 1
            PORTC = 0b00001000; 
            PORTD = 0b01000000; //1 na pozicii 1
            _delay_ms(5); 
            PORTA = 0b00010000; //minus na pozicii 2
            PORTC = 0b00001000; 
            PORTD = 0b01100000; //7 na pozicii 2
            _delay_ms(5); 
            PORTA = 0b00000010; //minus na pozicii 3
            PORTC = 0b00111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(5);
            PORTA = 0b00000100; //minus na pozicii 4
            PORTC = 0b01111000; 
            PORTD = 0b01101000; //0 na pozicii 3
            _delay_ms(5); 
        }
        m = 0;
    
}
}

Добавить комментарий