Распиновка 4 разрядного 7 сегментного индикатора. Семисегментный индикатор

Новые статьи

● Проект 7: Матрица 4-разрядная из 7-сегментных индикаторов. Делаем динамическую индикацию

В этом эксперименте мы рассмотрим работу Arduino с 4-разрядной семисегментной матрицей. Получим представление о динамической индикации, позволяющей использовать одни выводы Arduino при выводе информации на несколько семисегментных индикаторов.

Необходимые компоненты:

Матрица 4-разрядная из семисегментных индикаторов состоит из четырех семисегментных индикаторов и предназначена для одновременного вывода на матрицу 4 цифр, также есть возможность вывода десятичной точки. Схема 4-разрядной матрицы на 7-сегментных индикаторах показана на рис. 7.1.

Рис. 7.1. Схема 4-разрядной матрицы на 7-сегментных индикаторах

Для вывода цифры необходимо зажечь нужные светодиоды на контактах A-G и DP и выбрать нужную матрицу подачей LOW на вывод 6, 8, 9 или 12.
Подключим контакты матрицы к плате Arduino и будем выводить цифры на различные разряды матрицы. Для подключения нам понадобятся 12 выводов Arduino. Схема соединений для подключения 4-разрядной матрицы к плате Arduino показана на рис. 7.2. При подключении контактов используются ограничительные резисторы 510 Ом.

Рис. 7.2. Схема подключения 4-разрядной матрицы к Arduino

Напишем скетч последовательного вывода цифр (0-9) на произвольный регистр матрицы. Для выбора случайного значения из диапазона будем использовать функцию random(). В массиве numbers хранятся значения, соответствующие данным для отображения цифр 0-9 (старший разряд байта соответствует метке сегмента A индикатора, а младший - сегменту G), в массиве pins - значения контактов для сегментов A-G и DP, в массиве pindigits - значения контактов для выбора разряда матрицы. Содержимое скетча показано в листинге 7.1.

// переменная для хранения значения текущей цифры int number=0 ; // семисегментного индикатора int digit=0 ; void setup () { for (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop () { number=(number+1 )%10 ; showNumber(number); // DS for (int i=0 ;i<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } void showNumber (int num) { for (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // зажечь сегмент // потушить сегмент digitalWrite(pins[i],LOW); } }
Порядок подключения:

1. Подключаем семисегментный индикатор по схеме на рис. 7.3.
2. Загружаем в плату Arduino скетч из листинга 7.2.

// список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора int pins={9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 }; // значения для вывода цифр 0-9 byte numbers = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110}; // переменная для хранения и обработки текущего значения int number=0 ; int number1=0 ; int number2=0 ; // семисегментного индикатора int pindigits={2 ,8 ,11 ,12 }; // переменная для хранения текущего разряда int digit=0 ; // для отмеривания 100 мс unsigned long millis1=0 ; // режим 1 - секундомер работает mode=0 ; const int BUTTON=14 ; // Контакт 14(A0) для подключения кнопки int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния // к нопки boolean ledOn = false ; // Текущее состояние светодиода (включен/выключен) void setup () { // Сконфигурировать контакт кнопки как вход pinMode (BUTTON, INPUT); // Сконфигурировать контакты как выходы for (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop () { tekButton = debounce(prevButton); if (prevButton == LOW && tekButton == HIGH) // если нажатие... { mode=1 -mode; // изменение режима if (mode==1 ) number=0 ; } if (millis()-millis1>=100 && mode==1 ) {millis1=millis1+100 ; number=number+1 ; if (number==10000 ) number=0 ; } number1=number; for (int i=0 ;i<4 ;i++) { number2=number1%10 ; number1=number1/10 ; showNumber(number2,i); for (int j=0 ;j<4 ;j++) digitalWrite(pindigits[j],HIGH); digitalWrite(pindigits[i],LOW); delay(1 ); } } // функция вывода цифры на семисегментный индикатор void showNumber (int num,int dig) { for (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // зажечь сегмент digitalWrite(pins[i],HIGH); else // потушить сегмент digitalWrite(pins[i],LOW); } if (dig==1 ) // десятичная точка для второго разряда digitalWrite(pins,HIGH); } // Функция сглаживания дребезга. Принимает в качестве // аргумента предыдущее состояние кнопки и выдает фактическое. boolean debounce (boolean last) { boolean current = digitalRead(BUTTON); // Считать состояние кнопки, if (last != current) // если изменилось... { d elay (5 ) ; // ж дем 5 м с current = digitalRead(BUTTON); // считываем состояние кнопки return current; // возвращаем состояние кнопки } }

3. Нажатием кнопки запускаем или останавливаем секундомер.

Подключение семисегментного индикатора к Arduino – это прекрасный проект начального уровня, позволяющий познакомиться с платой Arduino поближе. Но довольно просто осуществляется. Поэтому мы несколько усложним задачу и подключим четырехразрядный семисегментный индикатор.



В данном случае будем использовать модуль четырехзначного светодиодного индикатора с общим катодом.


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



Светодиодные сегменты индикатора требуют подключения токоограничивающих резисторов при питании от 5 В на логическом выводе. Значение резистора обычно берется между 330 и 470 Ом. Также рекомендуется использование транзисторов для обеспечения дополнительного тока, поскольку каждый вывод микроконтроллера может выдавать максимум 40 мА. Если включить все сегменты разряда (цифра 8), то потребляемый ток превысит этот предел. На рисунке ниже показана схема подключения четырехразрядного семисегментного индикатора с применением транзисторов токоограничивающих резисторов.



Далее приведены схемы подключения индикатора к выводам Arduino. Здесь использованы биполярные npn-транзисторы BC547. Потенциометр 10 КОм, подключенный ко входу платы A0 позволяет изменять отображаемое на индикаторе значение от 0 до 1023.




На плате Arduino цифровые выходы D2-D8 в данном случае предназначены для управления сегментами от «a» до «g», а цифровые выходы D9-D12 используются для управления разрядами от D0 до D3. Следует заметить, что в данном примере точка не используется, но в скетче, приведенном ниже, есть возможность ее задействовать. Вывод D13 платы Arduino зарезервирован для управления сегментом точки.



Ниже представлен код, который позволяет управлять четырехразрядным сегментным индикатором с помощью платы Arduino. В нем в массиве numeral задаются коды чисел от 0 до 9 в двоичной форме. Данный скетч поддерживает как индикаторы с общим катодом (по умолчанию), так и индикаторы с общим анодом (для этого нужно раскомментировать одну строчку в конце скетча).


// биты, представляющие сегменты с A по G (и точки), для чисел 0-9 const int numeral = { //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 }; // выводы для точки и каждого сегмента // DP,G,F,E,D,C,B,A const int segmentPins = { 13,8,7,6,5,4,3,2 }; const int nbrDigits= 4; // количество разрядов светодиодного индикатора //разряды 0 1 2 3 const int digitPins = { 9,10,11,12 }; void setup() { for(int i=0; i < 8; i++) { pinMode(segmentPins[i], OUTPUT); // устанавливаем выводы для сегментов и точки на выход } for(int i=0; i < nbrDigits; i++) { pinMode(digitPins[i], OUTPUT); } } void loop() { int value = analogRead(0); showNumber(value); } void showNumber(int number) { if(number == 0) { showDigit(0, nbrDigits-1) ; // отображаем 0 в правом разряде } else { // отображаем значение, соответствующее каждой цифре // крайняя левая цифра 0, правая на единицу меньше, чем число позиций for(int digit = nbrDigits-1; digit >= 0; digit--) { if(number > 0) { showDigit(number % 10, digit) ; number = number / 10; } } } } // Отображаем заданное число на данном разряде 7-сегментного индикатора void showDigit(int number, int digit) { digitalWrite(digitPins, HIGH); for(int segment = 1; segment < 8; segment++) { boolean isBitSet = bitRead(numeral, segment); // isBitSet будет истинным, если данный бит будет 1 // isBitSet = ! isBitSet; // опционально // раскомментируйте опциональную строчку выше для индикатора с общим анодом digitalWrite(segmentPins, isBitSet); } delay(5); digitalWrite(digitPins, LOW); }

Эта статья продолжает цикл моих публикация про организацию динамической индикации на микроконтроллерах PIC и LED индикаторах. Вот ссылки на предыдущие публикации:

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

В каждом из прерываний с интервалом 2 мс (в данном случае от таймера TMR0) подготавливается один этап динамической индикации (ДИ) согласно алгоритму, который состоит из пяти фаз управления регистром и индикатором.

2-я фаза: положительный перепад на выводе 12 регистра (ST_CP) записывает нулевое состояние регистра в выходную защелку. Здесь и далее, до начала индикации, индикатор погашен нулевым потенциалом на сегментах.

3-я фаза: посредством управления выводами регистра 14 (DS – данные) и 11 (SH_CP – тактовый) в него записывается код для управления сегментами.

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

5-я фаза: здесь на выводы разрядов индикатора подается требуемый код, и далее происходит собственно индикация.

Если в схеме задействован один 4-х разрядный индикатор, то для правильной работы он должен быть с ОК. Если требуется управлять 8-ю разрядами, то используются 8 портов МК, при этом, остальные 4 порта просто управляют разрядами (в фазе 4 на них должен быть высокий уровень). Стоит отметить, что в этом случае возможно применение индикаторов как с ОК, так и с ОА, подключая к регистру соответственно сегменты или разряды (по причинам, изложенным ниже, ДИ в первом случае предпочтительно организовать посегментную, а во втором – поразрядную).

По этой методике можно подключить два четырехразрядных индикатора к МК PIC16F676, используя один сдвиговый регистр, при этом, останутся для использования целых четыре свободных порта. , например, для такого подключения люди использовали совмещение в некоторых портах МК функций ДИ и аналоговых входов (на мой взгляд, крайне сомнительное решение), что привело к значительному усложнению схемы и к некоторым ограничениям, о чем авторы и предупреждают. Используя мою схему подключения, все решилось бы просто и красиво – входы отдельно, индикация отдельно, плюс еще два порта (включая MCLR) для кнопок.

Для тестирования данного способа управления предлагается следующая простая схема на МК PIC12F629 и индикаторе FYQ3641A, которое выдает на индикаторе попеременно слово «test» и число 1234.

Здесь решено применить посегментную ДИ (в каждый момент включен один сегмент, а на разрядных выводах присутствует код, где в каждом разряде: 0 – если в данном разряде должен гореть данный сегмент и 1 – в противном случае), при котором пиковые токи перекладываются на регистр. Почему? Этому есть две причины: первая – максимальная нагрузочная способность выходов 74HC595 35 мА против 25 мА у контроллеров PIC; вторая и главная – близкий к предельному ток через выходной порт МК теоретически может поднять выходной потенциал оного до уровня переключения входов регистра, что привело бы к ошибкам в работе. А так, в порты МК втекают токи 6-7 мА и на выходах потенциалы заведомо не превышают TTL-уровни.

Как упоминалось выше, интервал прерываний - 2 мс, что соответствует частоте обновления индикатора в 64 Гц и его свечение достаточно комфортно воспринимается глазом.

Данный способ ДИ, кроме всего прочего, позволил вдвое уменьшить количество токоограничительных резисторов (R2-R5).

Устройство собрано на так называемой «беспаечной» макетной плате.

Индикатор можно заменить на любой из серии 3641А.

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

Программа управления МК написана на языке Си и оттранслирована в среде .

Код в MikroC, проект , HEX-файл в приложении.

Для использования данного способа подключения в коммерческих разработках просьба связаться со мной.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
DD1 МК PIC 8-бит

PIC12F629

1 В блокнот
DD2 Регистр 74HC595 1 В блокнот
HL Индикатор FYQ3641 1 В блокнот
R1 Резистор

30 кОм

1 В блокнот
R2 Резистор

430 Ом

1 В блокнот
R3 Резистор

430 Ом

1

При таком подходе, для вывода числа с любым количеством разрядов используется всего 2 цифровых выхода Arduino.

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

Исходные компоненты

Принцип работы

Семисегментный индикатор - это просто набор обычных светодиодов в одном корпусе. Просто они выложены восьмёркой и имеют форму палочки-сегмента. Можно подключить его напрямую к Arduino, но тогда будет занято 7 контактов, а в программе будет необходимо реализовать алгоритм преобразования числа из двоичного представления в соответствующие «калькуляторному шрифту» сигналы.

Для упрощения этой задачи существует 7-сегментный драйвер. Это простая микросхема с внутренним счётчиком. У неё есть 7 выходов для подключения всех сегментов (a, b, c, d, e, f, g pins), контакт для сбрасывания счётчика в 0 (reset pin) и контакт для увеличения значения на единицу (clock pin). Значение внутреннего счётчика преобразуется в сигналы (включен / выключен) на контакты a-g так, что мы видим соответствующую арабскую цифру.

На микросхеме есть ещё один выход, обозначенный как «÷10». Его значение всё время LOW за исключением момента переполнения, когда значение счётчика равно 9, а его увеличивают на единицу. В этом случае значением счётчика снова становится 0, но выход «÷10» становится HIGH до момента следующего инкремента. Его можно соединить с clock pin другого драйвера и таким образом получить счётчик для двузначных чисел. Продолжая эту цепочку, можно выводить сколь угодно длинные числа.

Микросхема может работать на частоте до 16 МГц, т.е. она будет фиксировать изменения на clock pin даже если они будут происходить 16 миллионов раз в секунду. На той же частоте работает Arduino, и это удобно: для вывода определённого числа достаточно сбросить счётчик в 0 и быстро инкрементировать значение по единице до заданного. Глазу это не заметно.

Подключение

Сначала установим индикаторы и драйверы на breadboard. У всех них ноги располагаются с двух сторон, поэтому, чтобы не закоротить противоположные контакты, размещать эти компоненты необходимо над центральной канавкой breadboard’а. Канавка разделяет breadboard на 2 несоединённые между собой половины.

    16 - к рельсе питания: это питание для микросхемы

    2 «disable clock» - к рельсе земли: мы его не используем

    3 «enable display» - к рельсе питания: это питание для индикатора

    8 «0V» - к рельсе земли: это общая земля

    1 «clock» - через стягивающий резистор к земле. К этому контакту мы позже подведём сигнал с Arduino. Наличие резистора полезно, чтобы избежать ложного срабатывания из-за окружающих помех пока вход ни к чему не подключен. Подходящим номиналом является 10 кОм. Когда мы соединим этот контакт с выходом Arduino, резистор не будет играть роли: сигнал притянет к земле микроконтроллер. Поэтому если вы знаете, что драйвер при работе всегда будет соединён с Arduino, можете не использовать резистор вовсе.

    15 «reset» и 5 «÷10» пока оставим неподключенными, но возьмём на заметку - нам они понадобятся в дальнейшем

Контакты 3 и 8 на индикаторе обозначены как «катод», они общие для всех сегментов, и должны быть напрямую соединены с общей землёй.

Далее следует самая кропотливая работа: соединение выходов микросхемы с соответствующими анодами индикатора. Соединять их необходимо через токоограничивающие резисторы как и обычные светодиоды. В противном случае ток на этом участке цепи будет выше нормы, а это может привести к выходу из строя индикатора или микросхемы. Номинал 220 Ом подойдёт.

Соединять необходимо сопоставляя распиновку микросхемы (выходы a-g) и распиновку индикатора (входы a-g)

Повторяем процедуру для второго разряда

Теперь вспоминаем о контакте «reset»: нам необходимо соединить их вместе и притянуть к земле через стягивающий резистор. В последствии, мы подведём к ним сигнал с Arduino, чтобы он мог обнулять значение целиком в обоих драйверах.

Также подадим сигнал с «÷10» от правого драйвера на вход «clock» левого. Таким образом мы получим схему, способную отображать числа с двумя разрядами.

Стоит отметить, что «clock» левого драйвера не стоит стягивать резистором к земле, как это делалось для правого: его соединение с «÷10» само по себе сделает сигнал устойчивым, а притяжка к земле может только нарушить стабильность передачи сигнала.

Железо подготовленно, осталось реализовать несложную программу.

Программирование

7segment.pde #define CLOCK_PIN 2 #define RESET_PIN 3 /* * Функция resetNumber обнуляет текущее значение * на счётчике */ void resetNumber() { // Для сброса на мгновение ставим контакт // reset в HIGH и возвращаем обратно в LOW digitalWrite(RESET_PIN, HIGH) ; digitalWrite(RESET_PIN, LOW) ; } /* * Функция showNumber устанавливает показания индикаторов * в заданное неотрицательное число `n` вне зависимости * от предыдущего значения */ void showNumber(int n) { // Первым делом обнуляем текущее значение resetNumber() ; // Далее быстро «прокликиваем» счётчик до нужного // значения while (n-- ) { digitalWrite(CLOCK_PIN, HIGH) ; digitalWrite(CLOCK_PIN, LOW) ; } } void setup() { pinMode(RESET_PIN, OUTPUT) ; pinMode(CLOCK_PIN, OUTPUT) ; // Обнуляем счётчик при старте, чтобы он не оказался // в случайном состоянии resetNumber() ; } void loop() { // Получаем количество секунд в неполной минуте // с момента старта и выводим его на индикаторы showNumber((millis() / 1000 ) % 60 ) ; delay(1000 ) ; }

Результат

Подключаем контакт 2 с Arduino к контакту clock младшего (правого) драйвера, контакт 3 - к общему reset’у драйверов; разводим питание; включаем - работает!

Семисегментные светодиодные индикаторы очень популярны среди устройств отображения цифровых значений и находят применение в передних панелях микроволновых печей, стиральных машин, цифровых часах, счетчиках, таймерах и др. По сравнению с ЖК индикаторами, сегменты светодиодного индикатора светятся ярко и различимы на большом расстоянии и при широком угле обзора. Для подключения семисегментного 4-разрядного индикатора к микроконтроллеру потребуется, по крайней мере, 12 линий ввода/вывода. Поэтому использовать данные индикаторы с микроконтроллерами с малым количеством выводов, например серии от компании , практически невозможно. Конечно, можно использовать разные методы мультиплексирования (описание которых можно найти на сайте в разделе "Схемы"), но и в этом случае имеются определенные ограничения для каждого метода, и зачастую в них используются сложные программные алгоритмы.

Мы рассмотрим метод подключения индикатора по интерфейсу SPI, который потребует всего 3 линии ввода/вывода микроконтроллера. При этом сохранится управление всеми сегментами индикатора.

Для подключения 4-разрядного индикатора к микроконтроллеру по SPI шине используется специализированная микросхема-драйвер производства компании . Микросхема способна управлять восемью семисегментными индикаторами с общим катодом и имеет в своем составе BCD-декодер, драйверы сегментов, схему мультиплексирования и статическое ОЗУ для хранения значений цифр.

Ток через сегменты индикаторов устанавливается с помощью лишь одного внешнего резистора. Дополнительно микросхема поддерживает управление яркостью индикаторов (16 уровней яркости) посредством встроенного ШИМ.

Рассматриваемая в статье схема - это схема дисплейного модуля с интерфейсом SPI, который может использоваться в радиолюбительских конструкциях. И нас больше интересует не сама схема, а работа с микросхемой по интерфейсу SPI. Питание модуля +5 В подается на вывод Vcc, сигнальные линии MOSI, CLK и CS предназначены для коммуникации мастер-устройства (микроконтроллер) с ведомым (микросхема MAX7219).

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

Данные передаются в микросхему 16-битными пакетами (по два байта), которые помещаются во встроенный 16-битный регистр сдвига по каждому нарастающему фронту сигнала CLK. 16-битный пакет мы обозначим D0-D15, где биты D0-D7 содержат данные, D8-D11 содержат адрес регистра, биты D12-D15 значения не имеют. Бит D15 - старший значащий бит и является первым принимаемым битом. Хотя микросхема способна управлять восемью индикаторами, мы рассмотрим работу только с четырьмя. Управление ими осуществляется на выходах DIG0 - DIG3, расположенных в последовательности справа налево, 4-битные адреса (D8-D11), которые им соответствуют, это 0×01, 0×02, 0×03 и 0×04 (шестнадцатеричный формат). Регистр цифр реализуется на базе встроенного ОЗУ с организацией 8×8 и адресуются непосредственно, так что каждая отдельная цифра на дисплее может обновляться в любое время. В следующей таблице приведены адресуемые цифры и регистры управления микросхемы MAX7219.

Регистр

Адрес

HEX-значение

Нет операции

Режим декодирования

Количество индикаторов

Выключение

Тест индикатора

Регистры управления

Микросхема MAX1792 имеет 5 регистров управления: режим декодирования (Decode-Mode), управление яркостью индикатора (Intensity), регистр количества подключенных индикаторов (Scan Limit), управление включением и выключением (Shutdown), режим тестирования (Display Test).

Включение и выключение микросхемы

При подаче питания на микросхему все регистры сбрасываются, и она переходит в режим Shutdown (выключение). В этом режиме дисплей отключен. Для перехода в нормальный режим работы необходимо установить бит D0 регистра Shutdown (адрес 0Сh). В любое время этот бит может быть сброшен, чтобы перевести драйвер в выключенное состояние, при это содержимое всех регистров сохраняется неизменным. Этот режим может использоваться для экономии энергии или в режиме сигнализации миганием индикатора (последовательная активация и деактивация режима Shutdown).

Перевод микросхемы в режим Shutdown осуществляется последовательной передачей адреса (0Сh) и данных (00h), а передача 0Ch (адрес) и затем 01h (данные) возвращают в нормальный режим работы.

Режим декодирования

C помощью регистра выбора режима декодирования (адрес 09h) можно использовать BCD code B декодирование (отображаемые символы 0-9, E, H, L, P, -) или же без декодирования для каждой цифры. Каждый бит в регистре соответствует одной цифре, установка логической единицы соответствует включению декодера для данного разряда, установка 0 - декодер исключается. Если используется BCD декодер, то принимается во внимание только младший полубайт данных в регистрах цифр (D3-D0), биты D4-D6 игнорируются, бит D7 не зависит от BCD декодера и отвечает за включение десятичной точки на индикаторе, если D7=1. Например, при последовательной посылке байтов 02h и 05h на индикаторе DIG1 (второй разряд справа) будет отображаться цифра 5. Подобным образом, при посылке 01h и 89h на индикаторе DIG0 будет отображаться цифра 9 с включенной десятичной точкой. В таблице ниже приведен полный список символов, отображаемых при использовании BCD декодера микросхемы.

Символ

Данные в регистрах

Включенные сегменты = 1

Пусто

*Десятичная точка устанавливается битом D7=1

При исключении BCD декодера из работы биты данных D7-D0 соответствуют линиям сегментов (A-G и DP) индикатора.

Управление яркостью индикаторов

Микросхема позволяет программно управлять яркостью индикаторов посредством встроенного ШИМ. Выход ШИМ контролируется младшим полубайтом (D3-D0) регистра Intensity (адрес 0Ah), который позволяет устанавливать один из 16 уровней яркости. При установке всех битов полубайта в 1 выбирается максимальная яркость индикатора.

Количество подключенных индикаторов

В регистре Scan-Limit (адрес 0Bh) устанавливается значение количества разрядов, обслуживаемых микросхемой (1 … 8). Для нашего варианта с 4 разрядами в регистр должно быть записано значение 03h.

Тест индикатора

Регистр, отвечающий за этот режим, находится по адресу 0Fh. Устанавливая бит D0 в регистре, пользователь включает все сегменты индикаторов, при этом содержимое регистров управления и данных не изменяется. Для выключения режима Display-Test бит D0 должен быть равен 0.

Интерфейс с микроконтроллером

Модуль индикатора может быть подключен к любому микроконтроллеру, который имеет три свободные линии ввода/вывода. Если микроконтроллер имеет встроенный аппаратный модуль SPI, то модуль индикатора может подключаться как ведомое устройство на шине. В этом случае сигнальные линии SPI интерфейса SDO (serial data out), SCLK (serial clock) и SS (slave select) микроконтроллера могут быть непосредственно подключены к выводам MOSI, CLK и CS микросхемы MAX7219 (модуля), сигнал CS имеет активный низкий уровень.

В случае если микроконтроллер не имеет аппаратного SPI, то интерфейс можно организовать программно. Общение с микросхемой MAX7219 начинается с установки и удержания низкого уровня на линии CS, после чего последовательно посылаются 16 бит данных (старший значимый бит передается первым) по линии MOSI по нарастающему фронту сигнала CLK. По завершению передачи на линии CS опять устанавливается высокий уровень.

В секции загрузок пользователи могут скачать исходный текст тестовой программы и HEX-файл прошивки, в которой реализуется обычный 4-разрядный счетчик с отображением значений на модуле индикатора с интерфейсом SPI. Используемый микроконтроллер - , интерфейс реализован программно, сигнальные линии CS, MOSI и CLK модуля индикатора подключены к портам GP0, GP1 и GP2, соответственно. Используется компилятор mikroC для PIC микроконтроллеров (), однако код может быть модифицирован под другие высокоуровневые компиляторы. Микроконтроллер работает на тактовой частоте 4 МГц от встроенного RC осциллятора, выход MCLR отключен.

Данный модуль можно подключать и к платформе Arduino. Для работы с ним потребуется библиотека LedControl, доступная для скачивания на сайте Arduino.

Загрузки

Исходный код тестовой программы и HEX-файл для прошивки микроконтроллера -

  • ЭТО НЕЧЕСТНО!!! Тему более корректно назвать "подключение светодиодной матрицы с интеллектуальным контроллером по малопроводному интерфейсу". Такую городушку можно и самому соорудить - поставить на индикаторе чего из PIC12-PIC16 с соответствующим протоколом (microLAN, SPI, I2C, rs232 или еще чего самодельного - просто синхронный режим УСАПП). Сейчас разных семейств МК развелось в достаточном количестве - пора переходить к работе со схемами составленными из нескольких МК, каждый из которых выполняет свою задачу, а не стараться грузить все "на одну голгву".
  • Это для буржуинов окаяных статейка! Больно уж дорого стОят чипы от Maxim. Есть куда более простое решение - последовательно-параллльные сдвиговые регистры. Правда, проводов больше потребуется - общие выводы индикаторов переключать. Или, как верно заметил коллега, использовать два МК. Это всё равно дешевле, чем Максовские чипы... З.Ы. Можно, правда, изваять универсальную схему на двух регистрах. Тогда можно обойтись четырьмя проводами: такт, данные, запись и знак/место. Количество знакомест будет ограничено лишь разрядностью регистров.
  • Сам начинал со сдвиговых регистров. Но потом отказался. Причина проста. Необходимо значительное время процессора для индикации. Для простых программ пойдёт. По мере роста объёма ПО падает яркость. Ток индикатора тоже нельзя увеличивать до величин превосходящих постоянный ток сегмента. Программа может и повиснуть. Отдельный процессор тоже не выход.Резисторы процессор и размеры платы и обвязка будут стоить 2/3 стоимости MAX7219 на плате. Имею ввиду 8 разрядную индикцию. Неоднократно выходил с Терраэлектроники с кучкой чего-то зажатой в руке. И за что отдал 6000-10000 деревянных? И когда потом сдаёшь заказчику устройство, вспоминаешь и думаешь от скольки проблем меня это спасло.И они стоят того. Со временем вы поменяете точку зрения.
  • Позвольте не согласиться;) Минимальный комплект для индикатора 4 позиции * 8 сегментов: pic16f628a или attiny2313 (кушает значительно больше) в режиме "растрового" сканирования, яркость правда не слишком велика, зато деталей минимум. В большинстве решений с достаточно значительным током сегментов и повышенным (+11 - +27 Вольт нестабилизированное постоянное) напряжением проблему создают только "верхние" ключи (независимо, что кормим с +U - сегмент или анод матрицы индикатора). Cтандартный набор: pic16f628a/attiny2313/, pic16f676 uln2803 tpic6b595 (hc595hc595 + uln2803) и наборчик npn транзисторов (по схеме эмиттерного поворителя) в качестве "верхних" ключей в качестве активных источников тока стандартное решение на LM317L (LM317T). При известном и стабильном уровне напряжения, питающего аноды рассчет базовых резисторов верхних ключей достаточно прост. Некоторые проблемы возникают при питании повышенным нестабилизированным постоянным напряжением...:mad: Возможно решение при помощи специализированных микросхем - но те достаточно дорогое удовольствие, по сему была придумана "обманка", быстродействия которой вполне достаточно, а детали весьма народные - комплект из нескольких резисторов, 4N33 и мощного n-p-n транзистора (см. схему по ссылке http://radiokot.ru/forum/download/file.php?id=93485):)
  • В каких-то случаях сдвиговые регистры и оправданы. Ну не берусь я за копеечные конструкции. Если например делаю электронный теодолит за 80 . То четырёх строчный LCD за 1т.р. надо покупать. Просто жалко тратить время на индикацию. Ключи паять, Растрачивать время процессора-оно самое дорогое. Да и заказчик обычно привередливый. Яркость должна быть нормальной. Да вы забыли посчитать стоимость набора деталей и не забудьте туда включить разницу в стоимости печатной платы(она будет больше) и время монтажа. И ещё об одном. Тут специфика работы. К примеру повис PIC. Есть возможность понять причину. Последние данные до сбоя вы можете увидеть. Вот и недавний пример 3 месяца очень редкий и непонятный сбой в программе. Не знал где и искать. Тут ещё и пальцы отдавило работнику конкретно. И когда увидел последние данные перед сбоем - понял причину.
  • Разница между профессиональным оборудованием и любительскими самоделками всегда была, есть и будет - "по крутому" разработанную схему сдал китаям, а те вообще на "капельке" ее соорудят:) Сетодиодный примитив - не конкурент моноблоку на ЖКИ (правда за редкими исключениями). А вот за примером типового применения МК в сьёмных индикаторах далеко ходить не потребуется - стоит обратить внимание на решение у так называемых фискальных регистраторов (дисплей клиента) - там у одного аппарата может применяться любой вариант (люминесцентный/ЖКИ/светодиодный) - лиш бы протокол связи поддерживался и клиенту нравился (готов денюжку на то выложить)... Чего касательно закладки в разработку по принципу "клиент может заплатить больше"... дык тот, у кого много денежки готовенькое у фирмачей покупает, а к самодельщику обращаются либо "по нищете", либо полные жлобы, умеющие найти любой повод для последующего кидалова...:mad: Для себя самого сгодится то, что в данный момент доступно (и не всегда самое свеженькое - ramtronовских часиков я уже лет 12 никак не увижу в продаже:)). Кроме всего прочего - практически ведь болшинство "специализированных" БИС создаются на базе тех же МК с масочной программой. ;)