Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexGyver committed Feb 22, 2021
1 parent d212142 commit 8eb269a
Show file tree
Hide file tree
Showing 15 changed files with 1,102 additions and 0 deletions.
455 changes: 455 additions & 0 deletions SevenSegmentsDisp/Disp595.h

Large diffs are not rendered by default.

56 changes: 56 additions & 0 deletions SevenSegmentsDisp/Disp595_symbols.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#pragma once

/*
Битовые маски символов для библиотеки Disp595
*/

#define _A 0b10001000
#define _B 0b10000000
#define _C 0b11000110
#define _D 0b11000000
#define _E 0b10000110
#define _F 0b10001110
#define _G 0b11000010
#define _H 0b10001001
#define _J 0b11100001
#define _L 0b11000111
#define _N 0b11001000
#define _O 0b11000000
#define _P 0b10001100
#define _S 0b10010010
#define _U 0b11000001
#define _V 0b11000001
#define _Y 0b10010001
#define _a 0b10100000
#define _b 0b10000011
#define _c 0b10100111
#define _d 0b10100001
#define _e 0b10000100
#define _f 0b10001110
#define _h 0b10001011
#define _i 0b11101111
#define _j 0b11110001
#define _l 0b11111001
#define _n 0b10101011
#define _o 0b10100011
#define _q 0b10011000
#define _r 0b10101111
#define _t 0b10000111
#define _u 0b11100011
#define _v 0b11100011
#define _y 0b11100011
#define _dash 0b10111111
#define _under 0b11110111
#define _equal 0b10110111
#define _empty 0b11111111

#define _0 0b11000000
#define _1 0b11111001
#define _2 0b10100100
#define _3 0b10110000
#define _4 0b10011001
#define _5 0b10010010
#define _6 0b10000010
#define _7 0b11111000
#define _8 0b10000000
#define _9 0b10010000
12 changes: 12 additions & 0 deletions SevenSegmentsDisp/SevenSegmentsDisp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
Набор быстрых и удобных библиотек для работы с семисегментными дисплеями совместно с Arduino.
Документацию к конкретным библиотекам контроллеров дисплеев см. в заголовочных файлах библиотек.
V1.0 от 24/01/2021 - Добавлена библиотека 'Disp595.h' для модулей дисплеев на базе сдвиговых регистров TM74HC595
...
*/

#pragma once
#include <Arduino.h>
#include "Disp595.h" // Либа дисплея TM74HC595
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
Простой пример программного управления яркостью
Обслуживание динамической индикации берет на себя аппаратный Timer 2
https://alexgyver.ru/lessons/timer-isr/
*/

#define DATA_PIN 11
#define SCLK_PIN 10
#define RCLK_PIN 12
#define DISP_PERIOD 500 // Период динамической индикации в мкс, делаем почаще!
#define DISP595_BRIGHTNESS // Сообщаем библиотеке, что будем использовать регулировку яркости!
// #define DISP595_BRIGHTNESS_DEPTH 10 // Глубину яркости можно настроить, больше - плавнее, но сильнее мерцание (по умолч. 8)

#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>

Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);

void setup() {
Timer2.setPeriod(DISP_PERIOD); // Заводим Timer 2 на прерывания с нужным периодом
Timer2.enableISR(); // Включаем прерывания Timer 2

disp.displayBytes(_t, _E, _S, _t); // Вывод символов
}

void loop() {
disp.brightness(0); // Устанавливаем яркость в диапазоне (0 - 7)
delay(1000);
disp.brightness(3);
delay(1000);
disp.brightness(7);
delay(1000);
}

ISR(TIMER2_A) { // Прерывание Timer 2
disp.tickManual(); // Обслуживание динамической индикации дисплея
}
139 changes: 139 additions & 0 deletions SevenSegmentsDisp/examples/TM74HC595 Display/demo/demo.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
/*
Демонстрация всего функционала, вывод разных данных на дисплей TM74HC595
Обслуживание динамической индикации берет на себя аппаратный Timer 2
https://alexgyver.ru/lessons/timer-isr/
*/

#define DATA_PIN 11
#define SCLK_PIN 10
#define RCLK_PIN 12
#define DISP_PERIOD 3000 // Период динамической индикации в мкс (500-6000)
// #define DISP_PERIOD 500 // Если используется регулировка яркости, дергать tick() надо чаще!

// #define DISP595_BRIGHTNESS // Использовать регулировку яркости
// #define DISP595_BRIGHTNESS_DEPTH 10 // Глубину яркости можно изменить (по умолч. 8), больше - плавнее яркость, но сильнее мерцание дисплея

#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>

Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);

void setup() {
Timer2.setPeriod(DISP_PERIOD); // Заводим Timer 2 на прерывания с нужным периодом
Timer2.enableISR(); // Включаем прерывания Timer 2
}

void loop() {

/* Вывод встроенных и кастомных символов, сырых данных на элеменыт дисплея */
disp.displayBytes(_H, _E, _L, _P); // Прямой вывод данных (символов) на дисплей
disp.point(0, true); // ПОСЛЕ вывода данных можно добавить / удалить точки
disp.point(3, true); // Указываем позицию точки слева (0 - 3) и включаем / выключаем ее (true / false)
delay(1000);

/*
Программное управление яркостью дисплея
Чем больше глубина яркости - тем чаще нужно дергать tick()!
(если DISP595_BRIGHTNESS обьявлен перед подключением)
*/
/*
disp.brightnessDepth(8); // Установка "глубины" яркости - количества градаций, по умолчанию 8 градаций
for (uint8_t i = 7; i > 0; i--) {
disp.brightness(i); // Яркость в диапазоне 0-7
delay(500);
}
delay(1000);
for (uint8_t i = 0; i < 8; i++) {
disp.brightness(i); // Яркость в диапазоне 0-7
delay(500);
}
*/


/* Вывод одиночных символов на нужную позицию СЛЕВА */
disp.displayByte(_L, 3); // Заменяем 3й символ с 'P' на 'L'
delay(1000);


/* Вывод массива символов на дисплей с выравниванием по левому / правому краю */
uint8_t data[] = {_D, _A};
disp.clear();
disp.displayBytes(data, sizeof(data)); // Вывод массива символов с выравниванием по левому краю
delay(1000);

disp.clear();
disp.displayBytes(data, sizeof(data), ALIGN_RIGHT); // Вывод массива символов с выравниванием по правому краю
delay(1000);

disp.clear();
disp.displayBytes(data, sizeof(data), ALIGN_LEFT); // Вывод массива символов с выравниванием по левому краю
delay(1000);


/* Вывод бегущих строк */
uint8_t str[] = {_1, _2, _3, _4, _5, _empty, _t, _E, _S, _t};
disp.runningString(str, sizeof(str), 300); // Вывод бегущей строки, указываем массив символов, размер, задержку в мс


/* Вывод целых чисел без нулей слева */
for (int8_t i = -50; i < 50; i++) {
disp.displayInt(i);
delay(100);
}


/* Вывод целых чисел c нулями слева */
for (int8_t i = 50; i > -50; i--) {
disp.displayIntNulls(i);
delay(100);
}

/* Вывод чисел с плавающей точкой без нулей слева */
disp.displayFloat(-12.34); // Без указания точности, дробных знаков - 1
delay(1000);
disp.displayFloat(-12.34, 1); // Или же кол-во знаков можно ввести вручную, от 1 до 3
delay(1000);
disp.displayFloat(12.34, 2); // Выводить можно как положительные, так и отрицательные числа
delay(1000);
disp.displayFloat(1.234, 3); // Но при выводе 3х десятичных знаков, места под знак минуса не достаточно
delay(1000);


/* Вывод чисел с плавающей точкой с нулями слева */
disp.displayFloat(-3.14); // Тут все аналоично, но с нулями слева
delay(1000);
disp.displayFloat(-1.34, 1);
delay(1000);
disp.displayFloat(3.1415, 2);
delay(1000);
disp.displayFloat(3.1415, 3);
delay(1000);


/* Вывод числа + символов */
for (uint8_t i = 0; i < 30; i++) {
int value = random(0, 99);
disp.displayInt(value); // СНАЧАЛА выводим число int
disp.displayByte(_t, 0); // Пустые символы можем вручную заполнить символами
disp.displayByte(_equal, 1);
delay(200);
}


/* Вывод числа + массива символов */
uint8_t strData[] = {_P, _H};
disp.displayFloat(1.2, 1); // СНАЧАЛА выводим число float (заняли всего 2 символа)
disp.displayBytes(strData, sizeof(strData)); // Пустые символы можем заполнить массивом символов
delay(1000);

/* Очистка дисплея */
disp.clear(); // Буфер дисплея очищается
delay(3000);
}

ISR(TIMER2_A) { // Прерывание Timer 2
disp.tickManual(); // Обслуживание динамической индикации дисплея
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
Простой пример вывода чисел с плавающей точкой (float),с автоматическим выбором точности
Обслуживание динамической индикации берет на себя аппаратный Timer 2
https://alexgyver.ru/lessons/timer-isr/
*/

#define DATA_PIN 11
#define SCLK_PIN 10
#define RCLK_PIN 12
#define DISP_PERIOD 3000 // Период динамической индикации в мкс (500-6000)

#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>

Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);

void setup() {
Timer2.setPeriod(DISP_PERIOD); // Заводим Timer 2 на прерывания с нужным периодом
Timer2.enableISR(); // Включаем прерывания Timer 2
}

void loop() {
disp.displayFloatAuto(16.384); // Вывод числа с автоматическим выбором точности
delay(1000);
disp.displayFloatAuto(8.192); // Выведет с точностью 3 знака
delay(1000);
disp.displayFloatAuto(-4.096); // Выведет с точностью 2 знака
delay(1000);
disp.displayFloatAuto(-12.048); // Выведет с точносью 1 знак
delay(1000);
}

ISR(TIMER2_A) { // Прерывание Timer 2
disp.tickManual(); // Обслуживание динамической индикации дисплея
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
Простой пример вывода чисел с плавающей точкой (float),С НУЛЯМИ СЛЕВА, на дисплей TM74HC595
Обслуживание динамической индикации берет на себя аппаратный Timer 2
https://alexgyver.ru/lessons/timer-isr/
*/

#define DATA_PIN 11
#define SCLK_PIN 10
#define RCLK_PIN 12
#define DISP_PERIOD 3000 // Период динамической индикации в мкс (500-6000)

#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>

Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);

void setup() {
Timer2.setPeriod(DISP_PERIOD); // Заводим Timer 2 на прерывания с нужным периодом
Timer2.enableISR(); // Включаем прерывания Timer 2
}

void loop() {
disp.displayFloatNulls(16.384); // Вывод числа С НУЛЯМИ СЛЕВА (минус всегда крайний слева)
delay(500);
disp.displayFloatNulls(8.192, 1); // Можно указать кол-во дробных знаков, (без указания - 1 знак)
delay(500);
disp.displayFloatNulls(-4.096, 2); // Можно выводить и отрицательные числа
delay(500);
disp.displayFloatNulls(2.048, 3); // Но в случае с 3мя знаками, доступны только положительные (не хватает символов)
delay(500);
}

ISR(TIMER2_A) { // Прерывание Timer 2
disp.tickManual(); // Обслуживание динамической индикации дисплея
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
Простой пример вывода чисел с плавающей точкой (float),БЕЗ НУЛЕЙ СЛЕВА, на дисплей TM74HC595
Обслуживание динамической индикации берет на себя аппаратный Timer 2
https://alexgyver.ru/lessons/timer-isr/
*/

#define DATA_PIN 11
#define SCLK_PIN 10
#define RCLK_PIN 12
#define DISP_PERIOD 3000 // Период динамической индикации в мкс (500-6000)

#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>

Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);

void setup() {
Timer2.setPeriod(DISP_PERIOD); // Заводим Timer 2 на прерывания с нужным периодом
Timer2.enableISR(); // Включаем прерывания Timer 2
}

void loop() {
disp.displayFloat(16.384); // Вывод числа БЕЗ НУЛЕЙ СЛЕВА (минус следует за ближайшим числом)
delay(500);
disp.displayFloat(-8.192, 1); // Можно указать кол-во дробных знаков, (без указания - 1 знак)
delay(500);
disp.displayFloat(-4.096, 2); // Можно выводить и отрицательные числа
delay(500);
disp.displayFloat(2.048, 3); // Но в случае с 3мя знаками, доступны только положительные (не хватает символов)
delay(500);
}

ISR(TIMER2_A) { // Прерывание Timer 2
disp.tickManual(); // Обслуживание динамической индикации дисплея
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
Простой пример вывода целых чисел (unsigned int / int), С НУЛЯМИ СЛЕВА, на дисплей TM74HC595
Обслуживание динамической индикации берет на себя аппаратный Timer 2
https://alexgyver.ru/lessons/timer-isr/
*/

#define DATA_PIN 11
#define SCLK_PIN 10
#define RCLK_PIN 12
#define DISP_PERIOD 3000 // Период динамической индикации в мкс (500-6000)

#include <GyverTimers.h>
#include <SevenSegmentsDisp.h>

Disp595 disp(DATA_PIN, SCLK_PIN, RCLK_PIN);

void setup() {
Timer2.setPeriod(DISP_PERIOD); // Заводим Timer 2 на прерывания с нужным периодом
Timer2.enableISR(); // Включаем прерывания Timer 2
}

void loop() {
int value = random(-99, 99); // Получим случайное число со знаком в диапазоне (-99...99)
disp.displayIntNulls(value); // Вывод числа С НУЛЯМИ СЛЕВА (минус всегда крайний слева)
delay(500); // Задержка между сменой
}

ISR(TIMER2_A) { // Прерывание Timer 2
disp.tickManual(); // Обслуживание динамической индикации дисплея
}
Loading

0 comments on commit 8eb269a

Please sign in to comment.