Будем зажигать несколько разрядов (цифр) одновременно на семисегментном многоразрядном индикаторе, код простой – написан на языке Си в 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;
}
}



