Управление семисегментным индикатором через ТМ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 (Си).— предыдущая статья на эту же тему