Подключаем многоразрядный семисегментный индикатор к pic16f877

Будем зажигать несколько разрядов (цифр) одновременно на семисегментном многоразрядном индикаторе, код простой – написан на языке Си в MpLab X 5.35 (скачать можно здесь ).

Схема подключения:

Здесь на выходы A0 и А1 – подключены разряды 3 и 4 у семисегментного индикатора – на них при помощи npn транзистора (в качестве “управляемого минуса”, можно использовать любой npn транзистор – он используется в качестве ключа) будут подаваться минуса.

Выходы C0,C1,C2,C3,C4,C5,C6 – будут формировать цифры:
С0 – f
C1 – a
C2 – b
C3 – c
C4 – d
C5 – e
C6 – g

delay 1000 – 1 секунда
delay 10 – 10 мс

—————————————————-
Интересный факт:

В среднем человеческий глаз может воспринимать частоты до 60 Гц. При этом некоторые люди способны различать и более высокие частоты — до 90 Гц. 1

Способность воспринимать мерцание и высокую частоту кадров индивидуальна для каждого человека и даже меняется со временем.
—————————————————-

То есть при смене цифры каждые 10 мс (delay 10) – получаем 100 Гц (человеческий глаз не видит мигание), так как будем менять 2 цифры, то одна цифра будет светиться 10 мс, потом она гаснет, и светится другая 10 мс.

В коде ниже циклы выводят и меняют цифры каждые 2 секунды.
Цикл будет повторятся 100 раз (“for (m = 0; m <= 100; ++m)") в каждом цикле задержки по 10 мс два раза итого 20*100=2000 мс или 2 секунды. То есть цифры будут меняться каждые 2 секунды, что и видно на видео ниже. Код на С следующий - он будет выводить цифры (на 3 и 4 разряды) 41, 32, 23 каждые 2 секунды их меняя: [php] #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 = 0b00000000; //PORTC pini kak vyhodi TRISA = 0b00000000; //PORTA pini kak vyhodi PORTC = 0b00000000; //Dlya sozdanya cifr PORTA = 0b00000000; //Minusa na razradi int m = 0; while(1) { for (m = 0; m <= 100; ++m) // выводим цифру 41 на индикаторе на 2 секунды { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b00001100; //1 na pozicii 1 __delay_ms(10); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01001101; //4 na pozicii 2 __delay_ms(10); } m = 0; for (m = 0; m <= 100; ++m) // выводим цифру 32 на индикаторе на 2 секунды { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b01110110; //2 na pozicii 1 __delay_ms(10); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01011110; //3 na pozicii 2 __delay_ms(10); } m = 0; for (m = 0; m <= 100; ++m) // выводим цифру 23 на индикаторе на 2 секунды { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b01011110; //3 na pozicii 1 __delay_ms(10); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01110110; //2 na pozicii 2 __delay_ms(10); } m = 0; } } [/php] Видео: [video width="1280" height="720" mp4="https://xn--h1aafbgigp.xn--p1acf/wp-content/uploads/2026/04/cifra.mp4"][/video] ------------------------------------------------------------ Добавил ещё одну цифру - теперь будет светиться уже три цифры одновременно. --------------------------------------------------------------- Транзисторы лучше поставить одинаковые, если поставить разные npn транзисторы, то цифры светятся по разному - одна ярче, другая тускнее. Задержку между цифрами пришлось уменьшить до 5 мс (с двумя было 10 мс), чтобы не было видно мигания. Если оставить по __delay_ms(10); - то видно мигание цифр. Также в цикле for со 100 раз увеличил до 130, чтобы смена цифр была в 2 секунды (5+5+5)*130=1950 мс Вот код: [php] #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 = 0b00000000; //Instruct the MCU that the PORTB pins are used as Output. TRISA = 0b00000000; PORTC = 0b01000000; //Make all output PORTA = 0b00000000; //Minusa na pozicii int m = 0; while(1) { for (m = 0; m <= 130; ++m) { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b00001100; //1 na pozicii 1 __delay_ms(5); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01001101; //4 na pozicii 2 __delay_ms(5); PORTA = 0b00000100; //minus na pozicii 3 PORTC = 0b00001110; //7 na pozicii 3 __delay_ms(5); } m = 0; for (m = 0; m <= 130; ++m) { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b01110110; //2 na pozicii 1 __delay_ms(5); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01011110; //3 na pozicii 2 __delay_ms(5); PORTA = 0b00000100; //minus na pozicii 3 PORTC = 0b01111011; //6 na pozicii 3 __delay_ms(5); } m = 0; for (m = 0; m <= 130; ++m) { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b01011110; //3 na pozicii 1 __delay_ms(5); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01110110; //2 na pozicii 2 __delay_ms(5); PORTA = 0b00000100; //minus na pozicii 3 PORTC = 0b01011011; //5 na pozicii 3 __delay_ms(5); } m = 0; } } [/php] Видео: [video width="1280" height="720" mp4="https://xn--h1aafbgigp.xn--p1acf/wp-content/uploads/2026/04/3cifri.mp4"][/video] ------------------------------------------------------------ Добавил ещё одну цифру - теперь будет светиться уже ЧЕТЫРЕ ЦИФРЫ одновременно. --------------------------------------------------------------- Задержку между цифрами пришлось уменьшить до 4 мс (хотя и с 5 мс мигания не видно), чтобы не было видно мигания. Если оставить по __delay_ms(10); - то видно мигание цифр. Также в цикле for со 130 раз уменьшил до 125, чтобы смена цифр была в 2 секунды (4+4+4+4)*125=2000 мс Код с 4 цифрами: [php] #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 = 0b00000000; //Instruct the MCU that the PORTB pins are used as Output. TRISA = 0b00000000; PORTC = 0b01000000; //Make all output PORTA = 0b00000000; //Minusa na pozicii int m = 0; while(1) { for (m = 0; m <= 125; ++m) { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b00001100; //1 na pozicii 1 __delay_ms(4); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01001101; //4 na pozicii 2 __delay_ms(4); PORTA = 0b00000100; //minus na pozicii 3 PORTC = 0b00001110; //7 na pozicii 3 __delay_ms(4); PORTA = 0b00001000; //minus na pozicii 4 PORTC = 0b01011111; //9 na pozicii 4 __delay_ms(4); } m = 0; for (m = 0; m <= 125; ++m) { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b01110110; //2 na pozicii 1 __delay_ms(4); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01011110; //3 na pozicii 2 __delay_ms(4); PORTA = 0b00000100; //minus na pozicii 3 PORTC = 0b01111011; //6 na pozicii 3 __delay_ms(4); PORTA = 0b00001000; //minus na pozicii 4 PORTC = 0b01111111; //8 na pozicii 4 __delay_ms(4); } m = 0; for (m = 0; m <= 125; ++m) { PORTA = 0b00000001; //minus na pozicii 1 PORTC = 0b01011110; //3 na pozicii 1 __delay_ms(4); PORTA = 0b00000010; //minus na pozicii 2 PORTC = 0b01110110; //2 na pozicii 2 __delay_ms(4); PORTA = 0b00000100; //minus na pozicii 3 PORTC = 0b01011011; //5 na pozicii 3 __delay_ms(4); PORTA = 0b00001000; //minus na pozicii 4 PORTC = 0b00001110; //7 na pozicii 4 __delay_ms(4); } m = 0; } } [/php] Видео: [video width="1280" height="720" mp4="https://xn--h1aafbgigp.xn--p1acf/wp-content/uploads/2026/04/4cifri.mp4"][/video]

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