ПОДКЛЮЧЕНИЕ ДИСПЛЕЯ НА 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 < TM74HC595Display.h> 
#include < TimerOne.h> 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 < TM74HC595Display.h> 
#include < TimerOne.h> 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 < TM74HC595Display.h> 
#include < TimerOne.h> 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(); // пнуть дисплей }