ТЕОРИЯ
- Вывод четырёхзначных чисел с десятичной точкой
- Нет встроенной динамической индикации – дисплей приходится “пинать” вручную каждые несколько микросекунд
- Потребление: все индикаторы погашены – 0 мА, все индикаторы горят – 44 мА.
- Оригинальная библиотека найдена на форуме – ссылка
БИБЛИОТЕКА
УСТАНОВКА
- Про ручную установку читай здесь
ДОКУМЕНТАЦИЯ
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(); // очистить дисплей
ПРИМЕРЫ
КАК ВЫВЕСТИ БУКВЫ?
В конце скетча с примером есть объявление членов массива 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(); // пнуть дисплей }
ПОДДЕРЖАТЬ
Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь.