ПОДКЛЮЧЕНИЕ ДИСПЛЕЯ НА TM74HC595 К ARDUINO

Простенький 7-ми сегментный дисплей на базе сдвигового регистра TM74HC595. Встроенной динамической индикацией не обладает, это его основной минус. Но зато здесь есть десятичные точки, ради удобства которых и затеян весь сыр-бор.

ОСОБЕННОСТИ

  • Вывод четырёхзначных чисел с десятичной точкой
  • Нет встроенной динамической индикации – дисплей приходится “пинать” вручную каждые несколько микросекунд
  • Потребление: все индикаторы погашены – 0 мА, все индикаторы горят – 44 мА.
  • Оригинальная библиотека найдена на форуме – ссылка
в магазин

СХЕМЫ И БИБЛИОТЕКИ

Библиотека использует библиотеку TimerOne.h (идёт в комплекте в архиве) для динамической индикации. В массиве SYM объявлены символы и цифры для отправки на индикаторы.

Основные методы библиотеки:
  disp.set(X, port);             // вывести 16 ричный код X в порт port (либо элемент массива SYM!!!)
  // вывести двухзначное число value на порт port (0 - первый и второй порт, 2 - 2 и 3, 3 - 3 и 4 порты))
  disp.digit2(value, port);
  disp.digit4(value);            // вывести число value
  disp.digit4showZero(value);    // вывести число value с нулями СЛЕВА
  disp.float_dot(value, pos);    // вывести float число value с точкой СПРАВА по счёту pos
  disp.int_dot(value, pos);      // вывести int число value с точкой СПРАВА по счёту pos
  disp.clear();                  // очистить дисплей
  *порты идут справа налево! (3 2 1 0)
скачать архив библиотек
ПЕРВЫЕ ШАГИ С ARDUINO

ВНИМАНИЕ!

Если вы не знаете, куда подключить Arduino, где взять программу для прошивки, как установить драйвера, как всё настроить и как устанавливать библиотеки – читайте статейку “Первые шаги с Arduino”, ссылка справа от этого текста. Там же разобраны типичные ошибки, описаны варианты питания и есть краткий FAQ.

ПЕРВЫЕ ШАГИ С ARDUINO

КАК ВЫВЕСТИ БУКВЫ?

В конце скетча с примером есть объявление членов массива SYM – не что иное как символы, которые будут выводить индикаторы (по умолчанию массив забит цифрами, цифрами с точками, а также некоторыми буквами). Для вывода используется метод disp.set, например вывод буквы А в самый левый порт будет выглядеть как disp.set(SYM[20], 3); , где 20 – номер буквы А в массиве SYM, а 3 – номер левого порта.

КАК ЗАДАТЬ СВОЙ СИМВОЛ?

На картинке справа показано, каким образом строится “код” символа: то есть в каком порядке расположены биты индикаторов и как они включаются и выключаются. Поняв закономерность, вы сможете задать любую конфигурацию светящихся индикаторов в одном слоте. Давайте выведем на дисплей строчку _ABC, состоящую из самодельных символов. Для начала объявим переменные символов

byte char_ = 0b11110111;
byte charA = 0b10001000;
byte charB = 0b10000000;
byte charC = 0b11000110;

Осталось только вывести их на экран!

disp.set(char_, 3);    // вывести _ в 4 порт
disp.set(charA, 2);    // вывести A в 3 порт
disp.set(charB, 1);    // вывести B в 2 порт
disp.set(charC, 0);    // вывести C в 1 порт

Да, переменные задавать совсем необязательно! Можно и так:

disp.set(0b11110111, 3);    // вывести _ в 4 порт
disp.set(0b10001000, 2);    // вывести A в 3 порт
disp.set(0b10000000, 1);    // вывести B в 2 порт
disp.set(0b11000110, 0);    // вывести C в 1 порт

А ещё можно воспользоваться онлайн-конвертером чисел, и перегнать двоичные коды в 16-ричные, они будут абсолютно непонятные, но зато короткие.

ОНЛАЙН-ГЕНЕРАТОР СИМВОЛОВ

А ещё можно воспользоваться онлайн генератором двоичных кодов для индикаторов!

ОНЛАЙН-ГЕНЕРАТОР СИМВОЛОВ

14.06.2018 в библиотеку добавлены встроенные буквы! Вот так например выводится слово HELL. Буквы имеют префикс _

disp.set(_H, 3);    // вывести H в четвёртый порт
disp.set(_E, 2);    // вывести E в третий порт
disp.set(_L, 1);    // вывести L во второй порт
disp.set(_L, 0);    // вывести L в первый порт

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ

/*
Пример работы с дисплеем на микросхеме TM74HC595
Динамическая индикация осуществляется по прерываниям таймера Timer1
AlexGyver Technologies https://alexgyver.ru/
*/
/*
Основные методы библиотеки:
disp.set(X, port);             // вывести 16 ричный код X в порт port (либо элемент массива SYM!!!)
// вывести двухзначное число value на порт port (0 - первый и второй порт, 2 - 2 и 3, 3 - 3 и 4 порты))
disp.digit2(value, port);
disp.digit4(value);            // вывести число value
disp.digit4showZero(value);    // вывести число value с нулями СЛЕВА
disp.float_dot(value, pos);    // вывести float число value с точкой СПРАВА по счёту pos
disp.int_dot(value, pos);      // вывести int число value с точкой СПРАВА по счёту pos
disp.clear();                  // очистить дисплей
*порты идут справа налево! (3 2 1 0)
*/
//---- ПИНЫ ----
byte SCLK = 4;
byte RCLK = 3;
byte DIO = 2;
//---- ПИНЫ ----
#include 
#include 
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char SYM[39];
void setup() {
symbols();                         // объявление пачки символов для работы дисплея
Timer1.initialize(1500);           // установка таймера на каждые 1500 микросекунд
Timer1.attachInterrupt(timerIsr);  // запуск таймера
}
void loop() {
// вывод 0.1_A
disp.set(SYM[10], 3);    // вывести 0. в четвёртый порт
delay(1000);
disp.set(SYM[1], 2);     // вывести 1 в третий порт
delay(1000);
disp.set(SYM[38], 1);    // вывести _ во второй порт
delay(1000);
disp.set(SYM[20], 0);    // вывести A в первый порт
delay(2000);
disp.clear();            // очистить дисплей
for (int i = 0; i <= 99; i++) {
disp.digit2(i, 0);         // счётчик 0-99 на портах 1 и 2
delay(50);
}
disp.clear();
for (int i = 0; i <= 99; i++) {
disp.digit2(i, 1);         // счётчик 0-99 на портах 2 и 3
delay(50);
}
disp.clear();
for (int i = 0; i <= 99; i++) {
disp.digit2(i, 2);          // счётчик 0-99 на портах 3 и 4
delay(50);
}
disp.clear();
for (int i = 0; i <= 1100; i++) {
disp.digit4(i);             // счётчик 0-1100
delay(10);
}
disp.clear();
for (int i = 0; i <= 1100; i++) {
disp.digit4showZero(i);     // счётчик 0-1100 с нулями слева
delay(10);
}
disp.clear();
for (float i = 0.0; i <= 15; i += 0.1) {
disp.float_dot(i, 1);       // счётчик 0.0 - 15.0 до десятых (точка на 1 знаке)
delay(50);
}
disp.clear();
for (float i = 0.0; i <= 3; i += 0.01) {
disp.float_dot(i, 2);       // счётчик 0.00 - 3.00 до сотых (точка на 2 знаке)
delay(30);
}
disp.clear();
}
void timerIsr() {   // прерывание таймера
disp.timerIsr();  // пнуть дисплей
}
// символы для дисплея
void symbols() {
// обычные
SYM[0] = 0xC0; //0
SYM[1] = 0xF9; //1
SYM[2] = 0xA4; //2
SYM[3] = 0xB0; //3
SYM[4] = 0x99; //4
SYM[5] = 0x92; //5
SYM[6] = 0x82; //6
SYM[7] = 0xF8; //7
SYM[8] = 0x80; //8
SYM[9] = 0x90; //9
// с точкой
SYM[10] = 0b01000000; //0.
SYM[11] = 0b01111001; //1.
SYM[12] = 0b00100100; //2.
SYM[13] = 0b00110000; //3.
SYM[14] = 0b00011001; //4.
SYM[15] = 0b00010010; //5.
SYM[16] = 0b00000010; //6.
SYM[17] = 0b01111000; //7.
SYM[18] = 0b00000000; //8.
SYM[19] = 0b00010000; //9.
// буквы
SYM[20] = 0x88; //A
SYM[21] = 0x83; //b
SYM[22] = 0xC6; //C
SYM[23] = 0xA1; //d
SYM[24] = 0x86; //E
SYM[25] = 0x8E; //F
SYM[26] = 0xC2; //G
SYM[27] = 0x89; //H
SYM[28] = 0xF9; //I
SYM[29] = 0xF1; //J
SYM[30] = 0xC3; //L
SYM[31] = 0xA9; //n
SYM[32] = 0xC0; //O
SYM[33] = 0x8C; //P
SYM[34] = 0x98; //q
SYM[35] = 0x92; //S
SYM[36] = 0xC1; //U
SYM[37] = 0x91; //Y
SYM[38] = 0b11110111; // _
}
/*
Пример работы с дисплеем на микросхеме TM74HC595
Динамическая индикация осуществляется "вручную" таймером на micros()
AlexGyver Technologies https://alexgyver.ru/
*/
/*
Основные методы библиотеки:
disp.set(X, port);             // вывести 16 ричный код X в порт port (либо элемент массива SYM!!!)
// вывести двухзначное число value на порт port (0 - первый и второй порт, 2 - 2 и 3, 3 - 3 и 4 порты))
disp.digit2(value, port);
disp.digit4(value);            // вывести число value
disp.digit4showZero(value);    // вывести число value с нулями СЛЕВА
disp.float_dot(value, pos);    // вывести float число value с точкой СПРАВА по счёту pos
disp.int_dot(value, pos);      // вывести int число value с точкой СПРАВА по счёту pos
disp.clear();                  // очистить дисплей
*порты идут справа налево! (3 2 1 0)
*/
//---- ПИНЫ ----
byte SCLK = 4;
byte RCLK = 3;
byte DIO = 2;
//---- ПИНЫ ----
#include 
#include 
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char SYM[39];
unsigned long dispIsrTimer, countTimer;
float value = 0.0;
void setup() {
symbols();               // объявление пачки символов для работы дисплея
}
void loop() {
if (millis() - countTimer > 50) {   // каждые 50 миллисекунд ("прозрачный" аналог delay)
value += 0.01;                    // прибавить 0.01
disp.float_dot(value, 2);         // вывести на дисплей
countTimer = millis();            // сбросить таймер
}
disp_isr();                         // динамическая индикация
}
void disp_isr() {
if (micros() - dispIsrTimer > 300) {       // таймер динамической индикации (по-русски: КОСТЫЛЬ!)
disp.timerIsr();                         // "пнуть" дисплей
dispIsrTimer = micros();                 // сбросить таймер
}
}
// символы для дисплея
void symbols() {
// обычные
SYM[0] = 0xC0; //0
SYM[1] = 0xF9; //1
SYM[2] = 0xA4; //2
SYM[3] = 0xB0; //3
SYM[4] = 0x99; //4
SYM[5] = 0x92; //5
SYM[6] = 0x82; //6
SYM[7] = 0xF8; //7
SYM[8] = 0x80; //8
SYM[9] = 0x90; //9
// с точкой
SYM[10] = 0b01000000; //0.
SYM[11] = 0b01111001; //1.
SYM[12] = 0b00100100; //2.
SYM[13] = 0b00110000; //3.
SYM[14] = 0b00011001; //4.
SYM[15] = 0b00010010; //5.
SYM[16] = 0b00000010; //6.
SYM[17] = 0b01111000; //7.
SYM[18] = 0b00000000; //8.
SYM[19] = 0b00010000; //9.
// буквы
SYM[20] = 0x88; //A
SYM[21] = 0x83; //b
SYM[22] = 0xC6; //C
SYM[23] = 0xA1; //d
SYM[24] = 0x86; //E
SYM[25] = 0x8E; //F
SYM[26] = 0xC2; //G
SYM[27] = 0x89; //H
SYM[28] = 0xF9; //I
SYM[29] = 0xF1; //J
SYM[30] = 0xC3; //L
SYM[31] = 0xA9; //n
SYM[32] = 0xC0; //O
SYM[33] = 0x8C; //P
SYM[34] = 0x98; //q
SYM[35] = 0x92; //S
SYM[36] = 0xC1; //U
SYM[37] = 0x91; //Y
SYM[38] = 0b11110111; // _
}
/*
Пример работы с дисплеем на микросхеме TM74HC595
Динамическая индикация осуществляется по прерываниям таймера Timer1
Скетч показывает, как использовать заданные в библиотеке готовые буквы
AlexGyver Technologies https://alexgyver.ru/
*/
//---- ПИНЫ ----
byte SCLK = 4;
byte RCLK = 3;
byte DIO = 2;
//---- ПИНЫ ----
#include 
#include 
TM74HC595Display disp(SCLK, RCLK, DIO);
void setup() {
Timer1.initialize(1500);           // установка таймера на каждые 1500 микросекунд
Timer1.attachInterrupt(timerIsr);  // запуск таймера
// вывод HELL
disp.set(_H, 3);    // вывести H в четвёртый порт
delay(1000);
disp.set(_E, 2);     // вывести E в третий порт
delay(1000);
disp.set(_L, 1);    // вывести L во второй порт
delay(1000);
disp.set(_L, 0);    // вывести L в первый порт
delay(2000);
}
void loop() {
}
void timerIsr() {   // прерывание таймера
disp.timerIsr();  // пнуть дисплей
}
Arduino подключение дисплея на TM74HC595
3 (60%) 2 vote[s]
2018-01-03T23:17:14+03:00