Управление семисегментным индикатором через ТМ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, образуя маленький нолик, который можно использовать как значок градусов Цельсия при отображении температуры.Пример программы в прилагаемом файле, а на видео — пример работы этой программы.

Метки , , , , , , , , , , , , , , , , , , , , , , , , . Закладка постоянная ссылка.

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

  1. Алексей говорит:

    Здесь привязка к аппаратному I2C или можно задать любые контакты на Ардуине?

    • admin говорит:

      #define CLK 5 //обзываем пины
      #define DIO 4

      вот в этих строках определяются пины. аппаратный TWI не используется.

  2. Cerega говорит:

    Как я понял этот код для ардуино. А как обозвать порты для atmega8, ну или что еще изменить чтобы работать из atmelStudio или codevisionavr.

  3. Cerega говорит:

    Помогите ес не трудно. Есть мега 8 и модуль на тм1637, хочу выводить на него счетчик, т.е. показания

  4. Cerega говорит:

    Все работает. Спасибо за статью.

  5. сергей говорит:

    здравствуйте, подскажите как подключить (прописать) несколько TM1637 к ардуино UNO и выводить различные данные

    • admin говорит:

      Самый простой путь — подключить каждую TM1637 к своим пинам Arduino UNO. Соответственно получится, что каждый индикатор займет два пина.
      В данном примере мы определяем три объекта пользовательского типа TM1637 и привязываем первый экземпляр к лапкам 2 и 3, второй к лапкам 4 и 5, а третий к 6 и 7. В дальнейшем работать с каждым из индикаторов нужно будет отдельно. Отмечу, что данный метод не является оптимальным, кушает много памяти, но зато является самым простым для понимания.

      #include <TM1637.h>
      
      #define CLK_1 3 //определим константы как номера пинов на которые будут соединены с одноименными пинами на модуле
      #define DIO_1 2 //это нужно будет позже
      
      #define CLK_2 4
      #define DIO_2 5
      
      #define CLK_3 6
      #define DIO_4 7
      
      TM1637 tm1637_1(CLK_1,DIO_1);//создаем экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
      TM1637 tm1637_2(CLK_2,DIO_2);//создаем второй экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
      TM1637 tm1637_3(CLK_3,DIO_3);//создаем третий экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
      
      
  6. сергей говорит:

    спасибо за подробный ответ, еще есть вопрос, при обработке прерывания в функции не работает delay() и стабильно зависает цикл while, как организовать бесконечный цикл, до выполнения определенного условия, и еще если в функции обработки прерывания запретить исполнение прерывания detachInterrupt(), станет эта функция полноценной (будет ли работать delay() и while и Serial порт) вернется ли в void loop() СПАСИБО.

    • admin говорит:

      не совсем понял вопроса, о какой именно функции идет речь? Если программа связана с ожиданием ввода какой-либо информации и в том числе ждёт обработки прерывания, delay, на мой взгляд вообще надо выкидывать. Delay очень хорошо подходит для программ типа «поморгай диодом», а для приложений, которые так или иначе завязаны с реальным миром необходимо однозначно использовать таймеры.

      Например, заводите переменную timer1 и в момент когда вы планируете использовать функцию delay инициализируете её значением системной переменной из функции milliseconds() и прибавляете нужную вам задержку, например 300. timer1=milliseconds+300;. Затем отпускаете программу делать свои остальные дела: проверять ввод пользователя, дрыгать лапками, что-нибудь вычислять и т.д. по циклу, а затем сравниваете значение из timer1 c milliseconds(). если значение timer1 меньше, то значит, что время Вашей задержки подошло к концу.

  7. сергей говорит:

    здравствуйте, извините что я вас запутал, я просто начинающий, и спросить не у кого, вот и пытаюсь посредством интернета учиться, у меня идет цикл обработки данных с нескольких термометров, вычисления формул и на основе расчета выдается число, оно сравниваться должно с введенным из вне (типо заданная температура) при достижении должно сработать реле на двигатель, ввод параметра хочу сделать с энкодера, экран 1637, на экране все время вычисленный параметр, при нажатии на ось энкодера хочу что бы выводился запомненный ранее параметр в эпроме, вращаем меняя параметр, нажимаем запоминая новое в эмпроме, далее программа работает в нормальном режиме, ну как наверное программа термостат, я просно не нашел пока скэйтч с энкодером подходящее для меня,

    • admin говорит:

      У Вас опрос идет в постоянном цикле? Если да, то ничего не мешает мерить температуру по значению таймера. Или каждый таймер для каждого датчика, ну или один таймер для всех датчиков по очереди. А ввод параметра с энкодера нужно вынести в отдельную подпрограмму. И на время ввода параметра прекратить замер температуры.

  8. сергей говорит:

    здравствуйте, основная программа loop работает хорошо, опросы датчиков, расчеты и вывод на экран, кнопка энкодера подключена на 3 пин объявлен и подтянут (#define Swich 3, pinMode(Swich, INPUT);, digitalWrite (Swich, HIGH);) и привязана к прерыванию attachInterrupt (1, norma, FALLING);), в подпрограмме norma пытаюсь работать с энкодером, определяю направление вращения и подсчета импульсов при вращении, с ограничением значения от 0 до 100, хочу вывести на экран, но что-то не получается, моя задача изменив переменную вращением энкодером нажатием на ручку энкодера записываем в эпром и выходим в loop, не могу найти ошибку, может из-за того что повторное нажатие опять вызывает подпрограмму, хотя читал что до конца обработки прерывания другое прерывания не работают, может надо отключать прерывание принудительно detachInterrupt(interrupt);. а потом включать. да и еще переменные учавствующие в norma все с приставкой volatile. извините что много слов в вашу голову, но сижу в комнате и мучаю комп, а надо быстрее решить эту задачу и ставить на агрегат, проект стоит, может есть у вас пример скэйча для моей задачи, СПАСИБО

    • admin говорит:

      Примера у меня нет, но не вижу здесь необходимости использовать прерывания вообще. Я бы сделал так.
      1) Для начала ввода с энкодера отлавливаем нажатие на кнопку (надеюсь, энкодер с кнопкой). ну фильтруем дребезг и всё такое, само собой.
      2) А затем когда отловили достоверное нажатие на кнопку, переводим программу из основного цикла в подпрограмму ожидание ввода с энкодера.
      3) В этой подпрограмме спокойно вводим нужное нам значение. Завершение ввода можно считать повторное нажатие кнопки энкодера или например паузу 3 секунды, когда энкодер ничего не вводит.
      4) после того, как ввели значение и обработали его — возвращаемся в основное тело программы и опрашивайте датчики далее на здоровье.

  9. сергей говорит:

    здравствуйте, вашу идею понял, теперь мысли в слух, ввод с энкодера отлавливаем нажатием (да энкодер с кнопкой)я так понял условием (если пин 3 LOW), обработка дребезга чем лучше, задержкой на 5мс, библиотекой Bounce.h или физически кондерами и резисторами? и еще такой вопрос (я почему и использовал прерывание) частый опрос датчиков мне не нужен, система очень инертна, планирую раз в минуту, а то и реже, интервал измерений сделал через delay, а теперь как быть, при нажатии на энкодер он сразу не сработает, надо будет минуту ловить момент прохождения проверки условия, я так понимаю надо изучать millis(), опрашивать по времени, а цикл гонять с расчетами (со старыми данными с датчиков) непрырывно?

    • admin говорит:

      Всё верно. при такой неторопливости программы библиотека и навеснуха в виде кондера с резюками — роскошь. Достаточно задержки delay (70). вот мои стандартные подпрограммы отлова нажатия:

      unsigned char inkey()
      {
        unsigned char ccc=0;
        ccc = (PIND&0xF8); //здесь ставим нужный нам порт (в данном случае PORTD) и битовую маску,
      чтобы не было срабатывания от случайных сигналов на других пинах.
      Можно заменить "ccc = (PIND&0xF8)" на digitalRead с соответствующим пином.    if (ccc)  {      delay(70);    if (ccc == (PIND&0xF8)) return ccc;  }  else return 0; } unsigned char keypressed() { unsigned char ccc=0;  while (ccc==0)  {    ccc=inkey();  }  while (ccc==inkey());   return ccc; }
  10. admin говорит:

    первая подпрограмма будет
    1) отлавливать нажатие,
    2) тупить 70 мс, если нажатие есть, если нет нажатия, то тупить не будет
    3) если потупивши, обнаружит что кнопка всё еще нажата, то и выдаст её код, а в Вашем случае подтвердит факт нажатия.

    Вторая просто так сюда запихнута. Она просто ожидает нажатия кнопки и возвращает её код в случае нажатия. Если кнопку не нажать, она будет всё равно ждать.

  11. admin говорит:

    А с задержками всё просто:
    1) объявите глобальные переменные типа uint_32t (длинное беззнаковое целое) по одной на каждый датчик температуры или одну на все датчики, если их опрос проходит быстро и не вызывает задержек в программе. допустим это будет одна переменная

    uint_32t timer1=0;

    2) при запуске программы присвойте этим (этой) переменной значение millis()+60000 (минута в миллисекундах).

    timer1 = millis()+60000;
    3) в основном цикле отлавливайте нажатие кнопки для запуска процедуры ввода значения с энкодера и наступление условия когда millis() больше timer1 для запуска процедуры опроса датчиков, пусть она называется read_sensors():

    if (millis()>timer1) {read_sensors(); timer1 = millis()+60000;}

    и всё, а потом, когда датчики считаются, переменная, как можно видеть, увеличится на 60000 миллисекунд и так каждый раз.

  12. сергей говорит:

    спасибо за ответ, буду дерзать (вернее сначала изучать мат часть глубже). изучу ваши примеры, с налету с моими знаниями, трудно прочесть алгоритм работы (например 0xF8 или PIND). Подскажите еще пожалуйста, я столкнулся с такой проблемой, купил для пробы первый экран на основе ТМ1637 не дорогой 50р где-то, при работе UNO от USB шнура от компа все показывает, при питании от блока питания экран не запускается, думал косяк экрана, заказал еще несколько, пришло, все тоже самое. при кратковременном вынимании провода с пина CLK все начинает работать, значить проблема не экранов, заказал подороже от RobotDyn, работает безупречно, но такой экран для меня большой и при использовании нескольких экранов на малой панели не удобны, подскажите как решить проблемму, может библиотека кривая или несколько их модификаций существует?

    • admin говорит:

      Микросхема одна и та же. отлов нажатия в вашем случае, если кнопка одна и висит на подтянутом пине 3 будет выглядеть так:

      unsigned char inkey()
      {
      if (digitalRead(3)==LOW)
      {
      delay(70);
      if (digitalRead(3)==LOW) return 1;
      }
      else return 0;
      }

      если кнопка нажата — функция возвращает 1, если не нажата — 0

    • admin говорит:

      Блоки питания бывают разными. плохая стабилизация блока может тоже быть причиной нестабильной работы МК.

  13. сергей говорит:

    1) От одного блока питания работает МК, но экран RobotDyn запускается а другой нет, что их теперь выкидывать, может как-то програмно передергивать пин CLK.

    2) И еще про экраны, какие посоветуете использовать с точки зрения простоты вывода чисел на экран TM1637, MAX7219 или какие-то TM74HC595.
    1637 вроде не напрягает МК, обработку сдвиговых регистров берет на себя в отличии от 7219 если я правильно понял.

    3) На этой странице я прочитал статью несколько раз, посмотрел видео, пытался разобраться со скэйчем, но такой уровень написания пока для меня сложен, у меня просьба, можете ли Вы привести пример доступного кода для моего понимания на включение любого сегмента, необходимо создать не только значек градуса, но и другие не стандартные символы экрана 1637, да и как включать точки?

    СПАСИБО

    • admin говорит:

      Ничего не могу сказать про неработающие экраны.

      Использовать проще всего 7219 (самый элементарный последовательный интерфейс)или 1637 (аналог i2c). Обе этих микросхемы являются специализированными и прямо предназначены для управления светодиодными дисплеями разного вида.
      А вот 595 — это обычный сдвиговый регистр, то есть микросхема общего назначения, предназначенная для преобразования последовательных данных в параллельные. Чтобы реализовать на нем вменяемый аналог 1637 или 7219,нужно еще кучу всего напаять

    • admin говорит:

      управлять отдельными сегментами просто, но нужно понимать, что такое двоичная система счисления. Это азы. В цифровой электронике без этого вообще никуда.
      Подучите эту часть теории и милости просим обратно к этой статье!

  14. сергей говорит:

    в двоичной системе исчисления меняя биты 0 на 1 в разных разрядах байта включаем нужный сегмент, а перевести число для более компактного вида в коде с двоичной в шестнадцатиричную систему не представляет труда, в нете есть переводчики и визуально напрямую (http://arduino.on.kg/seven-segment-generator), и я эти азы немного осваиваю, вопрос был в простом коде из вашего замечательного большого скэйча как вывети значек градуса на последнюю цифру (я собираю гелио-систему и стопориться на этом не хотелось бы, времени мало, а различные азы я постигну потихоньку, я месяц изучаю ардуино и уже могу задавать хоть какие-то логичные вопросы, посмотрим что будет через год, может и помощь ничья будет не нужна) зря вы так!!!!!

    • admin говорит:

      Да ладно! Чего это зря-то?! Как раз в статье четко написано » Если же отправить 01100011, то загорятся сегменты A, B, F и G, образуя маленький нолик, который можно использовать как значок градусов Цельсия при отображении температуры.» последняя цифра лежит в регистре с адресом 0, если мне не изменяет память. Таким образом для того, чтобы отобразить вышеуказанный «нолик», с использованием тех функций, что описаны в приложенном файле нужно:
      — объявить массив из четырех байт с одновременной записью нужных бит (01100011) в нужное знакоместо:

      uint8_t SegData[4]={0b01100011,0,0,0};

      — вывести его на TM1637:

      TM1637_display_all_direct(SegData);

      и всё.

  15. admin говорит:

    А если Вас интересуют мои услуги, как программиста или учителя — всегда рад. Тем более, что Ваш IP подсказывает, что Вы живете в Волгограде. Полноценный клуб для обучения робототехнике и программированию, скажу честно, у меня открыть пока не получается по причине отсутствия большого количества свободного времени, а разовые консультации — всегда пожалуйста. Привозите Ваше устройство и код. Всё починим.

  16. сергей говорит:

    спасибо!!!!!!!
    я так понимаю весь секрет в строке TM1637_display_all_direct(SegData); вернее в _all_direct (как правильно ее понимать?) она и выводит значения ячеек массива на экран т.е. в нулевой регистр знак градуса, да? а простая строка tm1637.display(0,1); выводит десятичные значения, т.е. напрямую с помощью библиотеки экрана. если запутался с вопросом не обижайтесь!!!

    • admin говорит:

      TM1637_display_all_direct — это просто название функции, которую я написал для того, чтобы напрямую управлять сегментами. Район Краснооктябрьский или Центральный

  17. сергей говорит:

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

  18. сергей говорит:

    извините, нашел ответ в вашей другой статье на строку TM1637_display_all_direct(SegData); выводит массив, а просто TM1637_display(х,у); выводит один знак, а без массива можно обойтись, типа: TM1637_display(0b01100011,0); или TM1637_display(0x63,0); и приставка 0b какое имеет здесь значение, в дугом месте я видел b0 моя ссылка в коментарии выше

    • admin говорит:

      можно, но нужно функцию писать специальную. Её я не писал. не было потребности отдельно выводить на экран один знак. 0b — стандартная приставка в Си для двоичных чисел, 0x — приставка для шестнадцатеричных

  19. сергей говорит:

    понятно, а как быть при использовании значка градуса постоянно, а значения температуры меняется, прийдется постоянно переписывать массив с новыми цифрами и выводить на экран?

  20. admin говорит:

    я бы сделал отдельную функцию, которая выводит температуру. У меня есть погодная станция, но я её делал на LCD 1602. там там и было. сначала выводятся цифры, а затем отдельно «градус». В Вашем случае надо отдельно выводить. не в массиве.

  21. сергей говорит:

    т.е. при вводе температуры 38,
    TM1637_display(2,3);
    TM1637_display(1,8);
    а перед этим единожды TM1637_display_all_direct(SegData); и при смене чисел температуры значек градуса затрагиваться не будет?

  22. сергей говорит:

    извини что не в тему и надоедаю, вот мучает вопрос, нужно выделить остаток от деления, нашел оператор %, в примерах (http://arduino.ru/Reference/Modulo) пишут:
    x = 7 % 5; // x имеет значение 2
    x = 9 % 5; // x имеет значение 4
    x = 5 % 5; // x имеет значение 0
    x = 4 % 5; // x имеет значение 4

    не пойму, как это 7/5=1,4 а пишут значение 2, мне казалось 4
    и так во всех строках кроме 5/5, может опять счисления другие?

  23. сергей говорит:

    библиотеку для работы с функцией
    TM1637_display_all_direct(SegData);
    качать надо с вашей странички или стандартная работает

    • admin говорит:

      1) функция TM1637_display_all_direct(SegData) меняет все цифры сразу, затирая предыдущие.

      2) остаток от деления точно такой же как и при целочисленном делении «столбиком» во 2-м классе средней школы. То есть, если делимое — 7, делитель — 5, то частное — 1, а остаток = 7-(5*1)= 2. Система счисления роли не играет.

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

      Цель статьи всё таки помочь понять принцип действия.

  24. сергей говорит:

    здравствуйте,
    1) значит я правильно понял, отрабатываем в начале однажды TM1637_display_all_direct(SegData); а затем меняем цифры температуры по разрядно, тогда значек градуса сохраниться?

    2) про деление с остатком, понял что при 7/5 остаток 2, но где это применимо? мне надо из 37,8 выделить 8 (цифру после запятой) думал % отделит целую часть, а нет, что простого способа нет?

    3) работу функции TM1637_display_all_direct(SegData);
    со стандартной библиотекой я проверю, но если вы говорите что что-то меняли/прописывали в библиотеке то надо при компиляции и применять ее, а где ее взять, пример программы это хорошо, но не каждый может разбираться и править библиотеку.

    СПАСИБО!!!!!!!!!!!!!

    • admin говорит:

      1) Можете и так
      2) вы путаете остаток с дробной частью. если вам нужно выделить 8 из 37.8, то 8=(37.8-37)*10 или 8=(37.8 — int(37.8))*10
      3) не надо проверять, её там просто нет. Эту функцию, повторяю, я рисовал сам

  25. сергей говорит:

    здравствуйте, спасибо за ответ,
    вопрос 2) отбрасывает, понял,
    а вот 1) и 3) непонятно, «может и так» и «её там просто нет», противоречите сами себе, выходит чтобы так работать с дисплеем каждому надо самому поправить библиотеку, новичку значек градуса недоступен?

    • admin говорит:

      Сергей, Вы абсолютно правы! действительно новичок не сможет поправить библиотеку, но никто Вам не мешает взять мою функцию и скопировать к себе в программу. Чтобы это сделать, нужно сначала выделить текст, зажав левую кнопку мыши на начале нужного Вам текста, затем протащить мышью то конца этого текста. Таким образом текст окажется выделенным. Если у Вас не получается, то можно попробовать стопроцентно работающий способ — установить с помощью стрелок на клавиатуре компьютера курсор (это такая вертикальная мигающая палочка, она всегда появляется когда Вы щелкаете мышкой на любом текстовом поле), затем зажать клавишу Shift, а затем с помощью кнопок со стрелками выделить нужный Вам текст (не отпуская клавиши Shift). Убедившись, что нужный Вам текст выделен, Вы можете отпустить клавишу Shift. Далее, необходимо нажать сочетание клавиш Ctrl+C или Ctrl+Insert (не отпуская клавиши Ctrl, нужно нажать С или Insert). Таким образом, вы скопируете выделенный текст в буфер обмена (это такое специально временное хранилище для текста, а также для многих других объектов встроенное в операционную систему). Для того, чтобы вставить скопированный текст в Вашу программу, установите с помощью манипулятора типа «мышь» или кнопок со стрелками на клавиатуре курсор (что это такое, я писал немного ранее), в нужную Вам позицию в тексте Вашей программы и нажмите сочетание клавиш Ctrl+V или Shift+Insert. Если не получится, обращайтесь, я всегда рад помочь.

    • admin говорит:

      как моя статья с программой, так и библиотека поставляются по принципу «как есть» («as is»). без гарантии, что там будет, то что Вам нужно. без обязательств, что то, что Вам нужно, туда добавят. Мало того, ни в моей программе, ни в библиотеке нет возможности рисовать знак градуса и вряд ли вообще будет. Если Вы всерьез решили заняться программированием, то стоит начать с более простых вещей. Ну или пройти какой-нибудь курс обучения. А если время поджимает или Вы хотите, чтобы работало всё и сразу, то нужно признать, что пока не готовы всё сделать сами и обратиться за помощью. За профессиональной помощью.

  26. сергей говорит:

    здравствуйте admin,
    вы прикололись с Ctrl+V или Shift+Insert. не лень было столько набирать, не настолько я чайник скопировать строку и вставть могу, в школе два года первые места по олимпиаде Basic, институт небольшие проекты в Pascal, самостоятельное изучении тогда модного Delphi, с «Си» и «С++» не приводилось сталкиваться, за двадцать лет все забыл, жизненное становление не до программирования, жить негде было, сейчас жизнь стабилизировалась, и увлечение тянет, вот и вспоминаю все заново, раньше небыло такой возможности программировать и этим замерять, крутить, управлять, далее компа код не выходил, и вот я задался вопросом, а как знать температуру в подвале не выходя из дома (50м до него), а еще регулировать влажность!!!, и вот друг говорит слышал про ARDUINO, вот оно, все вопросы решает, и прошлое есть в программировании. понеслось и поехало, как родился заново, в студенческие годы вернулся, сел за код, модель в железе парралельно готовлю, днем пилю и варю, вечером Си изучаю. вот так….
    я просто спросил будел ли стока TM1637_display_all_direct(SegData); работать со стандартной библиотекой , является ли эта функция стандартной? но увы от вас: «как моя статья с программой, так и библиотека поставляются по принципу «как есть» («as is»). без гарантии, что там будет, то что Вам нужно. без обязательств, что то, что Вам нужно, туда добавят.» — такой ответ не понять.
    СПАСИБО за время, внимание ко мне и ответы, удачи вам, и в создании клуба, я бы может с удовольствием бы пообщался в нем с такими как я и гуру как вы, а пока ищу в интернете общения, так проще и легче. появляются вопросы в процессе обучения и нескем посоветаваться, спросить, не всегда изучаю как школе методично (типа системы счисления), изучаю по мере изучения кода и модулей, просьба удалите нашу переписку, обществу она не нужна. не вся она по теме вашей статьи на страничке.
    ДО СВИДАНИЯ!!!!!!!!!!!!!!!!!!!!!
    не знаю для чего мой 89023826740@mail.ru

    • admin говорит:

      Если речь идет о проекте для Вас лично, то я не вижу смысла никуда торопиться. Освоите Си, подучите математику и безусловно всё получится. Я больше чем уверен, что с Вашим упорством удастся одолеть и железо и код!

      А вот комментарии я никуда не удалю, вдруг кому-то еще понадобятся ответы на поставленные Вами вопросы. Не писать же заново…

  27. сергей говорит:

    спасибо за поддержку, вы отвечали грамотно, а вот мой текст, много лишнего, типо о личном, это никому не надо, будет желание удалите лишний мусор, оставьте только по делу, буду дальше мучать код и свою голову.
    до свидания!!!!!!

  28. Дима говорит:

    Добрый день. В вашей библиотеке есть функция отвечающая за считывание кнопок подключенных к TM1637. Согласно даташиту можно еще подключить до 16 кнопок к этому чипу. Или функцию опроса кнопок надо дописать?

    • admin говорит:

      Добрый день! Я не писал поддержку считывания кнопок. Модули покупал только с функцией отображения 4-х разрядов. И задачу соответственно ставил минимальную — отображать то, что мне нужно. Прошу прощения, что не смог предоставить полную информацию по чипу на моем ресурсе.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *