MAX 7219. Управление светодиодными индикаторами. Часть 3 (Arduino).

В предыдущей статье мы подробно разобрали как управлять микросхемой MAX7219, хотя и только в теории, затем мы разобрали как это делается на языке Си в для микроконтроллеров AVR (на примере ATMEGA8). А в данном материале я приведу подробный пример, как это сделать на Arduino. По сути эта та же статья про программирование на Си для AVR, но с кодом «переведенным» на «ардуинский язык».

Как отмечалось в статье MAX 7219. Управление светодиодными индикаторами. Часть 1 (Теория)., управление сводится к записи в определенные регистры MAX 7219 различных значений. Соответственно, первое, что нам надо сделать это научиться записывать в в нужные регистры нужные данные. Напишем соответствующую подпрограмму для Arduino по аналогии с ATMEGA8.

//ВЕРСИЯ ДЛЯ Arduino
#define DIN 2 //определяем пины к которым мы присоединим нашу MAX7219, это будут цифровые пины 2,3 и 4
#define CLK 3
#define CS 4
void Transfer7219(byte adr,byte data)
{
byte i=0;//просто переменная-счетчик
digitalWrite (CS,LOW);//выводим «0» на лапку CS, чтобы начать передачу команды
asm(«nop»);//коротенькая пауза длиной в 1 тактfor(i=0;i<8;i++)//выгружаем байт адреса
{
if((adr & 0x80)==0x80)// определяем, что выводить
{
digitalWrite (DIN,HIGH);// единицу
}
else
{
digitalWrite (DIN,LOW); // или ноль
}

asm(«nop»); //создаем тактовый импульс, посылая сначала 1, а затем спустя короткое время 0 на лапку CLK
digitalWrite (CLK,HIGH);
asm(«nop»);
digitalWrite (CLK,LOW);
adr <<= 1;
}

for(i=0;i<8;i++) //выводим байт данных
{//тут всё то же самое, что и при выводе адреса. Если хотите, то можно вынести этот кусок кода в отдельную функцию
if((data & 0x80)==0x80)
{
digitalWrite (DIN,HIGH);// единицу
}
else
{
digitalWrite (DIN,LOW); // или ноль
}

asm(«nop»); //создаем тактовый импульс, посылая сначала 1, а затем спустя короткое время 0 на лапку CLK
digitalWrite (CLK,HIGH);
asm(«nop»);
digitalWrite (CLK,LOW);
data <<= 1;
}
digitalWrite (CS,HIGH);//выводим 1 на CS, завершая таким образом процесс передачи команды
}

Теперь, когда мы можем записывать в MAX7219 команды, давайте перейдем к практике. Для начала нормальной работы необходимо сделать небольшую инициализацию. Сначала покажем как инициализировать режим непосредственного вывода, а затем режим с дешифратором.

//общий кусочек кода для инициализации
//при использовании данного кода нужно отдавать себе отчет в том, что нужные лапки порта сконфигурированы на выход
//иначе говоря, если мы используем порт PORTD, то где нибудь перед функцией инициализации должна присутствовать такая запись
pinMode (DIN,OUTPUT);//конфигурируем нужные лапки на выход
pinMode (CLK,OUTPUT);
pinMode (CS,OUTPUT);
//********************* собственно функция инициализации *****************
void setup_7219()
{
Transfer7219(0x0F,0);//очищаем регистр DisplayTest, для перехода в нормальный режим работы
Transfer7219(0x0C,1);//записываем «1» в регистр MAX7219, тем самым выводя микросхему из режима Shutdown, обычно ей требуется 250 мкс на включение, но это не мешает принимать команды
Transfer7219(0x0A,1);//записываем значение яркости дисплея, в данном случае — «1», почти минимальное значение
Transfer7219(0x0B,7);//записываем в ScanLimit максимальное значение «7», что позволяет отображать содержимое всех регистров дисплея от Digit 0 до Digit 7
Transfer7219(0x09,0);//ну и наконец отключаем дешифратор, путем записи 0 в регистр Decode Mode
}

А после инициал7219изации можно чего-нибудь и вывести на дисплей. В данном случае наглядней будет вывести какую-нибудь пиктограммку на дисплей 8х8. Давайте запишем в регистры 0x01 и 0x08 значения 0x81. В двоичном виде это значение будет выглядеть так — 0b10000001. То есть мы записываем в крайние два регистра значения зажигающие два крайних светодиода. Результатом исполнения двух строчек ниже должны стать четыре горящие точки по краям дисплея.

Transfer7219(0x01,0x81);
Transfer7219(0x08,0x81);

а для пущей наглядности давайте вообще заполоним всё поле дисплея точками в шахматном порядке:

Transfer7219(0x01,0xAA);
Transfer7219(0x02,0x55);
Transfer7219(0x03,0xAA);
Transfer7219(0x04,0x55);
Transfer7219(0x05,0xAA);
Transfer7219(0x06,0x55);
Transfer7219(0x07,0xAA);
Transfer7219(0x08,0x55);

7segПолагаю, что приведенных примеров для понимания, как управлять матрицей 8х8 с помощью MAX7219, вполне достаточно. Давайте перейдем к управлению семисегментным индикатором. Возьмем промышленно изготовленный образец с одной MAX7219 и восемью индикаторами с десятичными точками, изображенный на фотографии. О соответствии разрядов байта индицируемым сегментам можно почитать в моей статье о микросхеме TM1637. Итак, данный модуль управляется ровно также как и вышеописанная матрица 8х8 и светодиодов в данном модуле тоже 64, но уже по внешнему виду понятно, что результат работы одной и той же программы для этих дисплеев будет разным. Вот для примера небольшое видео работы демонстрационной программы. Оба модуля показанные на видео подключены к одним и тем же выводам Arduino Nano и в обоих случая мы видим постепенное заполнение дисплея загорающимися светодиодами. Программа взята из примера к библиотеки для Arduino.

Для отображения чисел в режиме прямого управления необходимо использовать программный дешифратор, преобразующий код цифры в код прямого управления сегментами. Например для того, чтобы отобразить цифру «1», необходимо зажечь два сегмента B и C, которые соответствуют второму и третьему разряду в байте. Иначе говоря, в регистр нужного нам знакоместа нужно записать число 00000110 в двоичной системе или 6 в десятичной. И так далее. Но в самой микросхеме MAX7219 уже имеется встроенный дешифратор и о принципе его действия я подробно рассказывал в теоретической части. Теперь к практике: вывести цифру на определенное место проще простого, особенно если речь идет о десятичной системе счисления, то есть о символах от «0» до «9». Мы просто записываем нужную нам цифру в соответствующий регистр. Например, если нам нужно вывести на ранее упомянутый нами 8-разрядный дисплей цифры от 1 до 8, то уместен будет такой простой код:

void display12345678()
{
for (byte i = 1;i<=8,i++)
{
Transfer7219(i,i); //мы просто вносим в каждый регистр, отвечающий за хранение отображаемой информации, его номер. Вуаля!
}
}

Ну вот вроде и всё, что касается взаимодействия MAX7219 c Arduino. Все остальные фишки, такие как вывод чисел и значений переменных на цифровой дисплей, рисование пиктограмм и букв на матрице 8х8, непосредственно к программированию MAX7219 не относятся. Но мне совершенно не жалко поделиться своими наработками в этой области и в дальнейшем я обязательно напишу статью и выложу примеры прикладного кода. На матрицах 8х8 я делал бегущую строку, дисплей часов и простую анимацию. Опыта практического применения 8-ми разрядного семисегментного дисплея у меня еще не было, но в качестве примера можно будет чего-нибудь придумать. Часы, те же самые, термометр или любой другой прибор, отображающий информацию.
Кстати, если Вам показалось это сложным, то Вы можете использовать уже упомянутую специальную библиотеку для плат Arduino.

Как всегда ссылки на скачивание для ленивых:
MAX7219 datasheet
Библиотека MAX7219 для Arduino

MAX 7219. Управление светодиодными индикаторами. Часть 2 (AVR. Atmega8. Программируем на Си).

В предыдущей статье мы подробно разобрали как управлять микросхемой
MAX7219, хотя и только в теории. А в данном материале я приведу подробный пример, как это сделать на «голом» микроконтроллере AVR (Atmel Atmega8, например) .

Как отмечалось в предыдущей статье, управление сводится к записи в определенные регистры MAX 7219 различных значений. Соответственно, первое, что нам надо сделать это научиться записывать в в нужные регистры нужные данные. Напишем соответствующую подпрограмму на Си для AVR.

//ДАННАЯ ФУНКЦИЯ НАПИСАНА ДЛЯ ИСПОЛЬЗОВАНИЯ В Atmel Studio. Применялась на голом контроллере Atmega8, настроенным на работу от внутреннего тактового генератора 8 Мгц
#define DIN 2 //определяем разряды порта к которому мы присоединим нашу MAX7219, пусть это будут разряды 2,3 и 4 порта PORTD
#define CLK 3
#define CS 4
#define Out_port PORTD
//********************* собственно функция вывода *****************
void Transfer7219(uint8_t adr,uint8_t data)
{
uint8_t i=0;//просто переменная-счетчик Out_port
&= ~(1<<CS);//выводим «0» на лапку CS, чтобы начать передачу команды
asm(«nop»);//коротенькая пауза длиной в 1 тактfor(i=0;i<8;i++)//выгружаем байт адреса
{
if((adr & 0x80)==0x80)// определяем, что выводить
{
Out_port |= 1<<DIN;// единицу
}
else
{
Out_port &= ~(1<<DIN); // или ноль
}asm(«nop»); //создаем тактовый импульс, посылая сначала 1, а затем спустя короткое время 0 на лапку CLK
Out_port |=1<<CLK;
asm(«nop»);
Out_port &= ~(1<<CLK);
adr <<= 1;
}
for(i=0;i<8;i++) //выводим байт данных
{//тут всё то же самое, что и при выводе адреса. Если хотите, то можно вынести этот кусок кода в отдельную функцию
if((data & 0x80)==0x80)
{
Out_port |=1<<DIN;
}
else
{
Out_port&= ~(1<<DIN);
}
asm(«nop»);
Out_port |=1<<CLK;
asm(«nop»);
Out_port&= ~(1<<CLK);
data <<= 1;
}
Out_port|= 1<<CS;//выводим 1 на CS, завершая таким образом процесс передачи команды
}

Теперь, когда мы можем записывать в MAX7219 команды, давайте перейдем к практике. Для начала нормальной работы необходимо сделать небольшую инициализацию. Сначала покажем как инициализировать режим непосредственного вывода, а затем режим с дешифратором.

//общий кусочек кода для инициализации
//при использовании данного кода нужно отдавать себе отчет в том, что нужные лапки порта сконфигурированы на выход
//иначе говоря, если мы используем порт PORTD, то где нибудь перед функцией инициализации должна присутствовать такая запись
DDRD = 1<<CS | 1<<DIN | 1<<CLK;//мы заносим в регистр DDRD, который управляет состоянием лапок порта PORTD, единички в соответствующие разряды
//********************* собственно функция инициализации *****************
void setup_7219()
{
Transfer7219(0x0F,0);//очищаем регистр DisplayTest, для перехода в нормальный режим работы
Transfer7219(0x0C,1);//записываем «1» в регистр MAX7219, тем самым выводя микросхему из режима Shutdown, обычно ей требуется 250 мкс на включение, но это не мешает принимать команды
Transfer7219(0x0A,1);//записываем значение яркости дисплея, в данном случае — «1», почти минимальное значение
Transfer7219(0x0B,7);//записываем в ScanLimit максимальное значение «7», что позволяет отображать содержимое всех регистров дисплея от Digit 0 до Digit 7
Transfer7219(0x09,0);//ну и наконец отключаем дешифратор, путем записи 0 в регистр Decode Mode
}

А после инициал7219изации можно чего-нибудь и вывести на дисплей. В данном случае наглядней будет вывести какую-нибудь пиктограммку на дисплей 8х8. Давайте запишем в регистры 0x01 и 0x08 значения 0x81. В двоичном виде это значение будет выглядеть так — 0b10000001. То есть мы записываем в крайние два регистра значения зажигающие два крайних светодиода. Результатом исполнения двух строчек ниже должны стать четыре горящие точки по краям дисплея.

Transfer7219(0x01,0x81);
Transfer7219(0x08,0x81);

а для пущей наглядности давайте вообще заполоним всё поле дисплея точками в шахматном порядке:

Transfer7219(0x01,0xAA);
Transfer7219(0x02,0x55);
Transfer7219(0x03,0xAA);
Transfer7219(0x04,0x55);
Transfer7219(0x05,0xAA);
Transfer7219(0x06,0x55);
Transfer7219(0x07,0xAA);
Transfer7219(0x08,0x55);

7segПолагаю, что приведенных примеров для понимания, как управлять матрицей 8х8 с помощью MAX7219, вполне достаточно. Давайте перейдем к управлению семисегментным индикатором. Возьмем промышленно изготовленный образец с одной MAX7219 и восемью индикаторами с десятичными точками, изображенный на фотографии. О соответствии разрядов байта индицируемым сегментам можно почитать в моей статье о микросхеме TM1637. Итак, данный модуль управляется ровно также как и вышеописанная матрица 8х8 и светодиодов в данном модуле тоже 64, но уже по внешнему виду понятно, что результат работы одной и той же программы для этих дисплеев будет разным. Вот для примера небольшое видео работы демонстрационной программы. Оба модуля показанные на видео подключены к одним и тем же выводам Arduino Nano и в обоих случая мы видим постепенное заполнение дисплея загорающимися светодиодами. Программа взята из примера к библиотеки для Arduino.

Для отображения чисел в режиме прямого управления необходимо использовать программный дешифратор, преобразующий код цифры в код прямого управления сегментами. Например для того, чтобы отобразить цифру «1», необходимо зажечь два сегмента B и C, которые соответствуют второму и третьему разряду в байте. Иначе говоря, в регистр нужного нам знакоместа нужно записать число 00000110 в двоичной системе или 6 в десятичной. И так далее. Но в самой микросхеме MAX7219 уже имеется встроенный дешифратор и о принципе его действия я подробно рассказывал в теоретической части. Теперь к практике: вывести цифру на определенное место проще простого, особенно если речь идет о десятичной системе счисления, то есть о символах от «0» до «9». Мы просто записываем нужную нам цифру в соответствующий регистр. Например, если нам нужно вывести на ранее упомянутый нами 8-разрядный дисплей цифры от 1 до 8, то уместен будет такой простой код:

void display12345678()
{
for (uint_8 i = 1;i<=8,i++)
{
Transfer7219(i,i); //мы просто вносим в каждый регистр, отвечающий за хранение отображаемой информации, его номер. Вуаля!
}
}

Ну вот вроде и всё, что касается взаимодействия MAX7219 c микроконтроллерами AVR. Все остальные фишки, такие как вывод чисел и значений переменных на цифровой дисплей, рисование пиктограмм и букв на матрице 8х8, непосредственно к программированию MAX7219 не относятся. Но мне совершенно не жалко поделиться своими наработками в этой области и в дальнейшем я обязательно напишу статью и выложу примеры прикладного кода. На матрицах 8х8 я делал бегущую строку, дисплей часов и простую анимацию. Опыта практического применения 8-ми разрядного семисегментного дисплея у меня еще не было, но в качестве примера можно будет чего-нибудь придумать. Часы, те же самые, термометр или любой другой прибор, отображающий информацию.

Как всегда ссылки на скачивание для ленивых:
MAX7219 datasheet
Библиотека MAX7219 для Arduino

MAX 7219. Управление светодиодными индикаторами. Часть 1 (теория).

72197segМикросхема MAX 7219 служит для управления до 8-ми семисегментных светодиодных индикаторов или матрицей светодиодов размерностью 8х8. Её можно применять как в виде единичного драйвера, так и в составе каскада аналогичных микросхем, управляя большим количеством светодиодов
(чаще всего такая схема применяется в управлении несколькими матрицами 8х8).

Соответственно, наболее часто мы можем видеть данную микросхему в составе готовых модулей. Таких какие представлены на рисунках. Кстати, на этих же рисунках прекрасно видно, что для управления всеми сегментами индикатора или точками матрицы используются всего три контакта DIN (вход данных или Data in), CLK (вход тактирования или Clock), CS (выбор чипа или Chip Select, иногда его еще называют Load).

Передача данных осуществляется крайне просто: на вход CS подаем логический «ноль», а далее побитово, начиная со старшего разряда, последовательно выгружаем два байта. Берем старший разряд байта, выводим его на вход DIN, далее выводим «1» на CLK, а потом «0» на CLK. Берем следующий разряд и делаем тоже самое и так всего 16 раз. Для наглядности я скопирую картинку из datasheet’a:

7219time

А теперь давайте подробней разберем, что же именно за байты необходимо записывать в MAX 7219. Дело в том, что управление микросхемой, а соответственно и светодиодами, осуществляется простой записью однобайтовых значений в определенные внутренние регистры. Стало быть, первый байт — это адрес регистра. А второй байт это значение. Ни больше, ни меньше. Всё предельно просто, господа. Ну, а теперь снова обратимся к datasheet‘y. Посмотрим, что он там нам про регистры говорит.

регистры

А говорит он, как мы видим, следующее: по адресам с 0x01 по 0x08 (Digit 0 — Digit 7)располагаются регистры, где собственно и хранятся данные. Состояние каждого из светодиодов кодируется битом, а так как битов всего 64 (8 бит по 8 байт), то и максимальное количество адресуемых (отображаемых) точек, тоже 64. Или, как мы говорили ранее, матрица 8х8 или, 8 семисегментных индикаторов с десятичными точками. Меньше можно, но больше нельзя, если, конечно, не использовать еще такую же микросхему, включенную каскадом с данной. Принудительно можно отключать отображение информации части регистров с Digit 0 по Digit 7, для этого используется регистр по адресу 0x0B (Scan Limit). Записывая в него число 0, мы разрешаем отображение только из регистра Digit 0, записывая 1, разрешаем отображение из двух регистров Digit 0, Digit 1, и так далее. Соответственно, если мы хотим, чтобы информация оторажалась из всех регистров, в 0x0B нужно записать 7.

Далее: в регистре 0x0А (Intensity) находится значение яркости всего дисплея, от 0 до 15. В регистре 0x0F (Display Test) может храниться 1, включая режим тестирования дисплея (тогда все присоединенные светодиоды загораются на максимальной яркости), или 0, что соответствует нормальному режиму, в котором можно управлять свечением каждого светодиода. В регистре 0x0С (Shutdown), для нормальной работы, должна быть записана 1, если в данном регистре — 0, то дисплей выключен.

И последний настроечный регистр 0x09 (Decode Mode), он управляет режимом отображения. Дело в том, что в нашей микросхеме содержится, кроме всего прочего, еще и дешифратор семисегментного кода. Если в данном регистре записан 0, то дешифратор выключен, ничего хитрого не происходит, каждый бит в регистрах Digit 0 — Digit 7 отвечает за свой светодиод. Но если режим включен, то дешифратор отбрасывает значения страших четырех битов в регистрах Digit 0 — Digit 7 и преобразует значения четырех младших битов непосредственно в цифры от «0» до «9», а также в какие-то неясно зачем придуманные буквы и символы «-«, «Е», «Н», «L»,»P», » «. Иначе говоря, если в одном из регистров Digit 0 — Digit 7 записано 7, то на семисегментный индикатор будет выводиться «7», если 9, то «9», ну а если 10, то «-«, а случае, прости господи, 14, будет выводиться буква «Р».

Режимы дешифровки такие: если 0x00 — дешифратор выключен вообще. Если 0x01 — дешифратор включен только для Digit 0. Если 0x0F, то дешифратор включен только для Digit 0 — Digit 3. Если 0xFF, то дешифратор включен для всех регистров Digit 0 — Digit 7.

Ну вот и всё, мы разобрали все регистры, кроме одного — 0х00. Данный регистр нужен при каскадировании микросхем MAX 7219. Если мы посылаем в качестве адреса 0х00, то управление передается следующей в каскаде микросхеме. Это нужно, для того, чтобы управлять неограниченным числом индикаторов всего по трём проводам.

Завершаем теоретическую часть. В следующих статьях поговорим о подключении модулей на основе MAX 7219 к Arduino и «голому» микроконтроллеру AVR (Atmega или Attiny).

Ссылки:

Datasheet — https://yadi.sk/i/cjDKD81HsThv6

Управление семисегментным индикатором через ТМ1637.

2016-04-06_23-31-157segs
В этой короткой статье я поясню как именно микросхема TM1637 управляет семисегментным индикатором. Управление происходит путем записи в регистры ТМ1637 однобайтовых слов. Каждый регистр отвечает за отображение одного знака, состоящего из семи сегментов ABCDEF и десятичной точки dp — итого 8 сегментов, как раз по числу битов в байте. Зажигает нужный нам сегмент установленный в «1» разряд байта. Сегменту А соответствует самый младший разряд, десятичной точке dp — самый старший.
2016-04-14_22-03-31

Таким образом, записывая байты в соответствующие регистры можно управлять каждым сегментом в отдельности. Запишем в регистр знакоместа байт 00000110 — он зажжет сегменты В и С, которые образуют знак «1», запишем 00000111 — включатся сегменты А, В и С, образуя цифру «7».  Если же отправить 01100011, то загорятся сегменты A, B, F и G, образуя маленький нолик, который можно использовать как значок градусов Цельсия при отображении температуры.Пример программы в прилагаемом файле, а на видео — пример работы этой программы.

Управление TM1637. AVR (Си)

2016-04-06_23-31-15TM1637Краткое содержание предыдущей серии: купил модули, очень красивые, вроде работают, а вроде и не очень. К Ардуине вроде как прикручиваются, но не совсем. То ли библиотека не очень подходящая, то ли модули недоработанные. Написал продавцу, так мол и так, или не работает ваше добро как надо или библиотеку пришлите нормальную. Писал, как надо, на английском, мозг аж вспотел, а продавец возьми да и ответь на русском, типа: «всё нормально, дядя, модули исправные, зуб даю, а вот библиотеки у нас нет…».
Ладно, думаю, разберемся… Взял и напрямую прозвонил выводы — пожалуй, продавец был не прав — похоже, что на индикаторе просто нет светодиодов в десятичных точках. Ну да и ладно — первый блин комом, если эти модули нужны для индикации целых чисел, то не пугайтесь — покупайте. А вот если нужно отображать, что-то с плавающей точкой, то увы — ничего не выйдет.Итак, как я уже говорил, библиотеки для микроконтроллеров AVR в среде AtmelStudio я не нашел, а потому был вынужден переписать ардуиновскую. Для этого надо было переписать с C++ на Си полиморфную функцию Display, которая занимается отображением как единичных разрядов, так и всех четырех, а также выводит на дисплей целые и дробные (ха-ха, три раза) числа.

Библиотеку переписывать в полном объеме я не стал, а реализовал лишь служебные функции, а также несколько публичных функций — Display(), осуществляющих вывод знаков на экран. Дисплей применялся мной для отображения текущей скорости вращения двигателей двухколесного шасси для робота. Особенностью этого шасси является то, что ровно оно не едет из-за того, что колеса имеют разные угловые скорости. Для того, чтобы заставить ездить её ровно, я решил управлять с помощью ШИМ (широтно-импульсной модуляции) скоростью вращения каждого колеса. Установленный на машинку дисплейчик в левых двух символах показывает скорость левого колеса, а правые два символа — скорость правого.

Общение с ТМ637 происходит по протоколу I2C. В библиотеке он реализован программно, тоже самое я сделал и для себя. Это нужно для того, чтобы цеплять дисплей на любые выводы контроллера, так как аппаратная поддержка данного протокола в микроконтроллерe Atmega8 поддерживается только на двух пинах — SDA и SCL. Использовать мой перевод библиотеки можно путем копирования из файла описанных ниже функций:

//СЛУЖЕБНЫЕ ФУНКЦИИ (секция Private)
void TM1637_writeByte(int8_t wr_data) // служебная функция для общения с дисплеем по протоколу I2C
void TM1637_start(void) // служебная функция для общения с дисплеем по протоколу I2C
void TM1637_stop(void) // служебная функция для общения с дисплеем по протоколу I2C
void TM1637_coding_all(uint8_t DispData[])// служебная функция — шифратор
int8_t TM1637_coding(uint8_t DispData) //служебная функция — шифратор

//ПОЛЕЗНЫЕ ФУНКЦИИ (секция Public)
void TM1637_display_all(uint8_t DispData[]) // полезная функция, пожалуй даже самая полезная. Выводит содержимое массива на индикаторы
void TM1637_display(uint8_t BitAddr,uint8_t DispData) // выводит один знак на указанное место на индикаторе
void TM1637_display_int_decimal(int16_t Decimal) //выводит целое десятичное число
void TM1637_display_float_decimal(double Decimal) // должна выводить десятичное число с плавающей точкой
void TM1637_clearDisplay(void) // чистит дисплей
void TM1637_init(uint8_t DispType,uint8_t Clk, uint8_t Data) // инициализация глобальных переменных: DispType — Тип дисплея как правило равна 1, Clk — номер пина SCL, Data — номер пина SDA. Порт по умолчанию — PORTC, но можете поставить тот, который Вам нужен, кое-что поменяв в коде
void TM1637_set(uint8_t brightness)// ставим яркость от 0 до 7

Собственно, скачать эти функции можно здесь. Там же заодно и пример работы с ними.
На видео как раз и показана работа программы.

«TM1637.h» — Библиотека для Arduino
Аналог библиотеки на Си для AVR
Управление TM1637. AVR (Си).— предыдущая статья на эту же тему

Управление TM1637. Arduino.

2016-04-06_23-31-15TM1637На просторах китайского интернет-ширпотреба можно найти кучу полезных в нашем деле вещей. Речь сегодня как пойдет именно о такой полезной вещи — модуле семисегментных индикаторов на четыре знакоместа на базе драйвера ТМ1637, позволяющем управлять всем модулем всего по двум проводам. Данная микросхема родилась в недрах китайской электронной промышленности и была предназначена для управления отображением времени и счетчика в видеоплеерах. Соответственно datasheet на неё придумывали китайцы и (вы не поверите!) на китайском языке.
Производитель то ли микросхемы, то ли модуля (я так и не разобрал) порадовал потенциальных пользователей своего продукта небольшим куском кода в даташите, а также скромной, но вполне годной библиотекой «TM1637.h», позволяющей выводить на экранчик как отдельные цифры, так и числа целиком (положительные, отрицательные, целые и с плавающей точкой). Если внимательно приглядеться ко второй картинке, можно увидеть, что индикатор имеет как десятичные точки в каждом знакоместе, так и сдвоенные точки между вторым и третьим разрядом, предназначенные для отображения времени. И по заявлению продавца, продавшего мне сие чудо, все сегменты индивидуально управляемые. Кстати, купил я эти модули примерно за 120 рублей за штучку, это что-то около 1,6 бакса. Модули были доступны в трёх цветах — зеленом, красном и желтом. Все цвета красивые и радующие глаз. Если интересно, то вот магазин . Радость от покупки была не очень долгой. После того, как я порадовался эстетичной пайке и красивому внешнему виду, я решил испытать их на деле.

Раскопал в закромах китайский аналог Arduino Nano 3.0, прикрутил библиотеку, прошил скетч из примеров, прилагавшихся к уже вышеупомянутой библиотеке и, о чудо!.. Ничего не заработало… Я прошил еще один — та же ерунда. Лишь третий скетч под названием NumberFlow, так уж и быть, заработал. Это выглядело как одолжение со стороны разработчика модуля или библиотеки, но тем не менее это позволило мне проверить работоспособность купленных модулей. Так что если перед Вами стоит задача проверить модули на исправность, то
— смело качайте библиотеку и прикручивайте её к Arduino IDE,
— подсоединяйте к Вашей Arduino модуль ТМ1637, по умолчанию тактовый вход (CLK) цепляется на 3-й цифровой пин, а вход данных (DIO) на 2-й цифровой пин;
— берите пример NumberFlow и прошивайте им свою Arduino.
— радуйтесь тому, как шестнадцатеричные цифры бегут по индикатору.

В целом библиотека для Arduino позволяет:
— выводить шестнадцатеричный знак в любое знакоместо — функция Display(x,y) где x — номер разряда от 0 до 3, y — знак 0..9, A,b,C,d,E,F
— выводить сразу группу из 4-х шестнадцатеричных знаков- функция Display(x[]) где x[] — массив из 4 элементов, по числу знаков.
— выводить десятичное целое число — функция Display(x) где x — целое от -999 до 9999
— выводить десятичное число с плавающей точкой — функция Display(x) где x — число с плавающей точкой от -999 до 9999
— очищать дисплей — функция clearDisplay(x) — дело в том, что информация на индикаторе сохраняется до тех пока не запишешь новую
— устанавливать яркость индикатора функция set(x) где x — яркость от 0 до 7, по умолчанию яркость равна 2.

Пример простейшего кода:

#include <TM1637.h>

#define CLK 3 //определим константы как номера пинов на которые будут соединены с одноименными пинами на модуле
#define DIO 2 //это нужно будет позже

TM1637 tm1637(CLK,DIO);//создаем экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
// можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
// TM1637 tm1637(3,2);, но так как мы сделали наглядней

void setup()
{
tm1637.init();// инициализация библиотеки «TM1637.h»
tm1637.set(BRIGHT_TYPICAL);//установка яркости указанная константа равна 2, значение по умолчанию
}void loop()
{
tm1637.display(1234);//выводим на индикатор целое «1234»
delay(3000);//ждём 3 секунды
tm1637.display(0,9);//выводим на первое знакоместо индикатора (с индексом 0) знак «9», таким образом у нас на экранчике — «9234»
delay(3000);}//опять ждём 3 секунды, чтобы заценить результат

Ладно, хорошо. На Arduino вроде работает. Но меня интересовало подключение к «голому» микроконтроллеру AVR. Попытка раскопать аналогичную библиотеку на Си для Atmel Studio вообще ни к чему не привела. Мало того, кое-как я умудрился нарыть перевод datasheet’а на английский язык. Ага, на английский с небольшим кантонским диалектом. Но тем не менее, кое-что разобрать было можно и я решил с помощью datasheet’а переписать ардуиновскую библиотеку на Си для AVR.

Но про это в другой статье, а пока для ленивых все ссылки из текста:

«TM1637.h» — Библиотека для Arduino
RoboDyne — магазин
Управление TM1637. AVR (Си). — следующая статья на эту же тему

P.S. Пока писалась статья, выяснилось, что я никак не могу заставить отображать этот модуль десятичные точки. Вот это поворот! Пишу это немного забегая вперед, так как я уже полностью перекопал библиотеку и подрихтовал её в соответствии с даташитом. Но даже записывая в микросхему напрямую, в обход библиотечных функций, команды, прямо указывающие отобразить десятичные точки, я не получал нужного мне результата. Так, что вывод простой — полноценной функциональности от связки модуля с приложенной библиотекой вы не добьетесь. Будем копать и стараться исправить.