Подключаем многоразрядный семисегментный индикатор к 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

Таким образом цифры будут записаны следующим образом:
0 – PORTC = 0b00111111;
1 – PORTC = 0b00001100;
2 – PORTC = 0b01110110;
3 – PORTC = 0b00101110;
4 – PORTC = 0b01001101;
5 – PORTC = 0b01011011;
6 – PORTC = 0b01111101;
7 – PORTC = 0b00001110;
8 – PORTC = 0b01111111;
9 – PORTC = 0b01011111;

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 секунды, что и видно на видео ниже. Скачать hex файл и С файл: – в формате zip архива

Код на С следующий – он будет выводить цифры (на 3 и 4 разряды) 41, 32, 23 каждые 2 секунды их меняя:

#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;
 
    }
}

Видео:

————————————————————
Добавил ещё одну цифру – теперь будет светиться уже три цифры одновременно.
—————————————————————

Скачать hex файл и С файл:
– в формате zip архива
– в формате tar.gz архива

Транзисторы лучше поставить одинаковые, если поставить разные npn транзисторы, то цифры светятся по разному – одна ярче, другая тускнее.
Задержку между цифрами пришлось уменьшить до 5 мс (с двумя было 10 мс), чтобы не было видно мигания. Если оставить по __delay_ms(10); – то видно мигание цифр.
Также в цикле for со 100 раз увеличил до 130, чтобы смена цифр была в 2 секунды (5+5+5)*130=1950 мс

Вот код:

#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;
 
    }
}

Видео:

————————————————————
Добавил ещё одну цифру – теперь будет светиться уже ЧЕТЫРЕ ЦИФРЫ одновременно.
—————————————————————

Скачать hex файл и С файл:
– в формате zip архива
– в формате tar.gz архива

Задержку между цифрами пришлось уменьшить до 4 мс (хотя и с 5 мс мигания не видно), чтобы не было видно мигания. Если оставить по __delay_ms(10); – то видно мигание цифр.
Также в цикле for со 130 раз уменьшил до 125, чтобы смена цифр была в 2 секунды (4+4+4+4)*125=2000 мс

Код с 4 цифрами:

#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;
 
    }
}

Видео:

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