Собрал простую светодиодную матрицу:
То есть минуса и плюсы соединены по рядам.
Теперь с помощью ШИМ (широтно-импульсная модуляция) будем выводить на неё различные световые эффекты и делать изображения.
Схема аналогична подключению семисегментного индикатора к Atmege (“микроник.рус/7910/”), то есть зажигать минуса будем через транзисторы, а плюсы – напрямую от ножек.
Будем собирать вот по этой схеме:
Код простой – написан на языке Си в MpLab X 5.35 (MpLab X 5.35 скачать можно здесь “микроник.рус/7271/” ).
Скачать код на Си и hex файл – скачать.
На фьюзах по умолчанию Атмега 8515 будет работать на скорости 1 МГц:
Код на Си – Atmega 8515 подключена как на картинке выше, то есть задействованы ножки PA0,PA2,PA3,PA4 (пропущена ножка PA1 – не смог припаять к ней провод)(управляющий минус – подаёт минуса к светодиодам), а также ножки PC0, PC1, PC2, PC3 (подают плюсы к светодиодам), в коде используются также PC4, PC5, PC6, PC7, но на картинке выше я их не дорисовал и при подключении на макетной плате также не использовал:
#include <xc.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 1000000UL // 1 MHz clock speed
//на фьюзах по умолчанию Атмега8515 работает на 1 МГц (без внешнего кварца)
int main(void)
{
PORTC=0xFF;
DDRC=0xFF;
PORTA=0xFF;
DDRA=0xFF;
int m = 0;
//int p = 0; //pozicii cifr
int k = 0; //kakaya cifra
//int k2 = 0; //kakaya cifra
//int k3 = 0; //kakaya cifra
//int k4 = 0; //kakaya cifra
for (k = 0; k <= 3; ++k)
{
// зажигаем на секунду 4мс*4раза*60раз=960мс = 1000 мс = 1 сек все светодиоды
// при этом частота мигания светодиодов будет 1000:16(4мс и 4 раза)=62 Гц - мигания не видны.
for (m = 0; m <= 60; ++m)
{
PORTA = 0b00000001;
PORTC = 0b11111111;
_delay_ms(4);
PORTA = 0b00000100;
PORTC = 0b11111111;
_delay_ms(4);
PORTA = 0b00001000;
PORTC = 0b11111111;
_delay_ms(4);
PORTA = 0b00010000;
PORTC = 0b11111111;
_delay_ms(4);
}
// гасим на секунду 4*4*60=960мс = 1000 мс = 1 сек все светодиоды
for (m = 0; m <= 60; ++m)
{
PORTA = 0b00000001;
PORTC = 0b00000000;
_delay_ms(4);
PORTA = 0b00000100;
PORTC = 0b00000000;
_delay_ms(4);
PORTA = 0b00001000;
PORTC = 0b00000000;
_delay_ms(4);
PORTA = 0b00010000;
PORTC = 0b00000000;
_delay_ms(4);
}
// зажигаем четыре светодиода PC0, PC1, PC2, PC3
// на секунду 4*4*15=240 мс, то есть на 1:4 секунды 1000 мс = 1 сек
for (m = 0; m <= 15; ++m)
{
PORTA = 0b00000001;
PORTC = 0b00001111;
_delay_ms(4);
PORTA = 0b00000100;
PORTC = 0b00001111;
_delay_ms(4);
PORTA = 0b00001000;
PORTC = 0b00001111;
_delay_ms(4);
PORTA = 0b00010000;
PORTC = 0b00001111;
_delay_ms(4);
}
// зажигаем четыре светодиода PC4, PC5, PC6, PC7
// на секунду 4*4*15=240 мс, то есть на 1:4 секунды 1000 мс = 1 сек все светодиоды
for (m = 0; m <= 15; ++m)
{
PORTA = 0b00000001;
PORTC = 0b11110000;
_delay_ms(4);
PORTA = 0b00000100;
PORTC = 0b11110000;
_delay_ms(4);
PORTA = 0b00001000;
PORTC = 0b11110000;
_delay_ms(4);
PORTA = 0b00010000;
PORTC = 0b11110000;
_delay_ms(4);
}
// если в коде ниже вместо delay_ms(2) поставить delay_ms(4)
// светодиоды будут мигать так как 4мс*8раз = 32 1000:32= 31 Гц - глаз видит мигание, чтобы это устранить достаточно delay_ms(4) поменять на delay_ms(2), тогда 8*2=16 и 1000:16=62 Гц
// но с миганием светодиодов при delay_ms(4) - получается гирлянда - красиво смотреть
for (m = 0; m <= 60; ++m)
{
PORTA = 0b00000001;
PORTC = 0b11110000;
_delay_ms(2);
PORTA = 0b00000100;
PORTC = 0b11110000;
_delay_ms(2);
PORTA = 0b00001000;
PORTC = 0b11110000;
_delay_ms(2);
PORTA = 0b00010000;
PORTC = 0b11110000;
_delay_ms(2);
PORTA = 0b00000001;
PORTC = 0b00001111;
_delay_ms(2);
PORTA = 0b00000100;
PORTC = 0b00001111;
_delay_ms(2);
PORTA = 0b00001000;
PORTC = 0b00001111;
_delay_ms(2);
PORTA = 0b00010000;
PORTC = 0b00001111;
_delay_ms(2);
}
for (m = 0; m <= 60; ++m)
{
PORTA = 0b00000001;
PORTC = 0b00000000;
_delay_ms(4);
PORTA = 0b00000100;
PORTC = 0b00000000;
_delay_ms(4);
PORTA = 0b00001000;
PORTC = 0b00000000;
_delay_ms(4);
PORTA = 0b00010000;
PORTC = 0b00000000;
_delay_ms(4);
}
// здесь эффект змейки, задержку между светодиодами поставил 100 мс = 0.1 с
for (m = 0; m <= 2; ++m)
{
PORTA = 0b00000001;
PORTC = 0b00000000;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b00000001;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b00000010;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b00000100;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b00001000;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b00010000;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b00100000;
_delay_ms(100);
PORTA = 0b00000001;
PORTC = 0b01000000;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b00000001;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b00000010;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b00000100;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b00001000;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b00010000;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b00100000;
_delay_ms(100);
PORTA = 0b00000100;
PORTC = 0b01000000;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b00000001;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b00000010;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b00000100;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b00001000;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b00010000;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b00100000;
_delay_ms(100);
PORTA = 0b00001000;
PORTC = 0b01000000;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b00000001;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b00000010;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b00000100;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b00001000;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b00010000;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b00100000;
_delay_ms(100);
PORTA = 0b00010000;
PORTC = 0b01000000;
_delay_ms(100);
}
}
}
Фото светодиодных матриц:








