Atmega8515 с помощью ШИМ зажигаем светодиодную матрицу или много светодиодов (более 100 от 5В)

Собрал простую светодиодную матрицу:

То есть минуса и плюсы соединены по рядам.

Теперь с помощью ШИМ (широтно-импульсная модуляция) будем выводить на неё различные световые эффекты и делать изображения.

Схема аналогична подключению семисегментного индикатора к 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); 
                    
        }
        
    }  

     
}

Фото светодиодных матриц:

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