Будем зажигать несколько разрядов (цифр) одновременно на семисегментном многоразрядном индикаторе, код простой – написан на языке Си в 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;
}
}
Видео:





