Будем подключать светодиоды аналогично схеме казино – как в предыдущей записи – “микроник.рус/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
Видео работы кода без мигания:









