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

Будем подключать светодиоды аналогично схеме казино – как в предыдущей записи – “микроник.рус/7799/” (PIC16F877A делаем игровые автоматы (казино) на языке С в MPLab X), таким способом к PIC16F877A можно подключить около 128 светодиодов, которые будут работать от 5 В, однако, чем больше светодиодов, тем они тускло они будут светить, однако, если добавить дополнительный внешний источник питания, то и эту проблему можно решить.

Схема всё та же:

Только вместо семисегментного индикатора добавим обычные светодиоды:

Чтобы нарастить количество светодиодов до 128 можно увеличить количество “управляемых минусов” – те которые в данной схеме используют транзисторы.

Код на Си написан в MPLab X 5.35 (“микроник.рус/7271/” или “микроник.рус/7259/”)

#include <xc.h>
  
#define _XTAL_FREQ 20000000 //Specify the XTAL crystal FREQ 
  
// Configuration Byte
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF   
 
 
void main() //The main function
{
TRISC = 0b10000000; //knopka na RC7
TRISA = 0b00000000; //Minusa na razradi
TRISB = 0b00000000; //cifri
PORTC = 0b10000000; //knopka na RC7
PORTA = 0b00000000; //Minusa na pozicii
PORTB = 0b00000000; //cifri vivod


label1:
    __delay_ms(100);
    PORTCbits.RC7=1;
    __delay_ms(100);
 
int m = 0;
int k = 0; 

    for (k = 0; k <= 3; ++k)
    {

        // зажигаем на секунду 4*4*60=960мс = 1000 мс = 1 сек все светодиоды, при этом частота мигания светодиодов будет 1000:16=62 Гц - мигания не видны.

        for (m = 0; m <= 60; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b11111111; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b11111111; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b11111111; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b11111111; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        

        // гасим на секунду 4*4*60=960мс = 1000 мс = 1 сек все светодиоды

        for (m = 0; m <= 60; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        // зажигаем четыре светодиода RB0, RB1, RB2, RB3 на каждом разряде (управляемом минусе) на секунду 4*4*15=240 мс, то есть на 1:4 секунды 1000 мс = 1 сек все светодиоды

        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00001111; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00001111; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00001111; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00001111; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        

        // зажигаем четыре светодиода RB4, RB5, RB6, RB7 на каждом разряде (управляемом минусе) на секунду 4*4*15=240 мс, то есть на 1:4 секунды 1000 мс = 1 сек все светодиоды

        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b11110000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b11110000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b11110000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b11110000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
// соединим вышеуказанные коды в один
// зажигаем четыре светодиода RB0, RB1, RB2, RB3 на каждом разряде (управляемом минусе) 
// зажигаем четыре светодиода RB4, RB5, RB6, RB7 на каждом разряде (управляемом минусе) 
// светодиоды будут мигать так как 4*8 = 32  1000:32= 31 Гц - глаз видит мигание, чтобы это устранить достаточно  delay_ms(4) поменять на delay_ms(2), тогда 8*2=16 и 1000:16=62 Гц
// но с миганием светодиодов - получается гирлянда - красиво смотреть

        for (m = 0; m <= 7; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b11110000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b11110000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b11110000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b11110000; //1 na pozicii 4
        __delay_ms(4);
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00001111; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00001111; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00001111; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00001111; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        
        for (m = 0; m <= 60; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
    }  

// Код кнопки остался   

    if (PORTCbits.RC7==0)
            {
                
                 __delay_ms(100);
                 goto label1;
                  
                   
            }
   
}

Скачать код на Си и файл hex для данного примера:
– скачать в формате zip
– скачать в формате tar.gz

А вот код, где мигания уже не видны (delay_ms(4) поменять на delay_ms(2)):
Скачать код на Си и файл hex для данного примера:
– скачать в формате zip
– скачать в формате tar.gz

Видео работы кода без мигания:

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