Подключение 4-разрядного led индикатора всего к 4 портам микроконтроллера

Подключение 4-разрядного светодиодного индикатора по SPI интерфейсу

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

По сравнению с ЖК индикаторами, сегменты светодиодного индикатора светятся ярко и различимы на большом расстоянии и при широком угле обзора. Для подключения семисегментного 4-разрядного индикатора к микроконтроллеру потребуется, по крайней мере, 12 линий ввода/вывода.

Поэтому использовать данные индикаторы с микроконтроллерами с малым количеством выводов, например серии PIC12F от  компании Microchip, практически невозможно.

Конечно, можно использовать разные методы мультиплексирования (описание которых можно найти на сайте Радиолоцман в разделе “Схемы”), но и в этом случае имеются определенные ограничения для каждого метода, и зачастую в них используются сложные программные алгоритмы.

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

Для подключения 4-разрядного индикатора к микроконтроллеру по SPI шине используется специализированная микросхема-драйвер MAX7219 производства компании Maxim. Микросхема способна управлять восемью семисегментными индикаторами с общим катодом и имеет в своем составе 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-значение
D15-D12 D11 D10 D9 D8
Нет операции Х 0хХ0
Разряд 0 Х 1 0хХ1
Разряд 1 Х 1 0хХ2
Разряд 2 Х 1 1 0хХ3
Разряд 3 Х 1 0хХ4
Разряд 4 Х 1 1 0хХ5
Разряд 5 Х 1 1 0хХ6
Разряд 6 Х 1 1 1 0хХ7
Разряд 7 Х 1 0хХ8
Режим декодирования Х 1 1 0хХ9
Яркость Х 1 1 0хХA
Количество индикаторов Х 1 1 1 0хХB
Выключение Х 1 1 0хХC
Тест индикатора Х 1 1 1 1 0хХF

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

Микросхема 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* D6-D4 D3 D2 D1 D0 DP* A B C D E F G
X 1 1 1 1 1 1
1 X 1 1 1
2 X 1 1 1 1 1 1
3 X 1 1 1 1 1 1 1
4 X 1 1 1 1 1
5 X 1 1 1 1 1 1 1
6 X 1 1 1 1 1 1 1 1
7 X 1 1 1 1 1 1
8 X 1 1 1 1 1 1 1 1
9 X 1 1 1 1 1 1 1 1
X 1 1 1
E X 1 1 1 1 1 1 1 1
H X 1 1 1 1 1 1 1
L X 1 1 1 1 1 1
P X 1 1 1 1 1 1 1 1
Пусто X 1 1 1 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.

Используемый микроконтроллер – PIC12F683, интерфейс реализован программно, сигнальные линии CS, MOSI и CLK модуля индикатора подключены к портам GP0, GP1 и GP2, соответственно.

Используется компилятор mikroC для PIC микроконтроллеров (mikroElektronika), однако код может быть модифицирован под другие высокоуровневые компиляторы. Микроконтроллер работает на тактовой частоте 4 МГц от встроенного RC осциллятора, выход MCLR отключен.

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

Загрузки

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

embedded-lab.com

Источник: https://www.rlocman.ru/shem/schematics.html?di=134175

Семисегментный индикатор

Доброго дня уважаемые друзья!
Приветствую Вас на сайте «Мир микроконтроллеров»

Семисегментный светодиодный индикатор
Схема подключения одноразрядного семисегментного индикатора
Схема подключения многоразрядного семисегментного индикатора

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

Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр.

Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.

Семисегментные светодиодные индикаторы бывают разных цветов, обычно это белый, красный, зеленый, желтый и голубой цвета. Кроме того, они могут быть разных размеров.

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

Кроме десяти цифр, семисегментные индикаторы способны отображать буквы. Но лишь немногие из букв имеют интуитивно понятное семисегментное представление.

В латинице: заглавные A, B, C, E, F, G, H, I, J, L, N, O, P, S, U, Y, Z, строчные a, b, c, d, e, g, h, i, n, o, q, r, t, u.
В кириллице: А, Б, В, Г, г, Е, и, Н, О, о, П, п, Р, С, с, У, Ч, Ы (два разряда), Ь, Э/З.

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

Всего семисегментный светодиодный индикатор может отобразить 128 символов:

 В обычном светодиодном индикаторе девять выводов: один идёт к катодам всех сегментов, а остальные восемь — к аноду каждого из сегментов. Эта схема называется «схема с общим катодом», существуют также схемы с общим анодом (тогда все наоборот).

Часто делают не один, а два общих вывода на разных концах цоколя — это упрощает разводку, не увеличивая габаритов. Есть еще, так называемые «универсальные», но я лично с такими не сталкивался.

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

А так как необъятное не объять, то такие индикаторы мы пока рассматривать не будем (а ведь есть еще индикаторы с гораздо большим количеством сегментов, матричные).

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

Подключение одноразрядного семисегментного индикатора к микроконтроллеру

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

При этом следует учитывать, что если индикатор с ОБЩИМ КАТОДОМ, то его общий вывод подключается к «земле», а зажигание сегментов происходит подачей логической единицы на вывод порта.

Если индикатор с ОБЩИМ АНОДОМ, то на его общий провод подают «плюс» напряжения, а зажигание сегментов происходит переводом вывода порта в состояние логического нуля.

Осуществление индикации в одноразрядном светодиодном индикаторе осуществляется подачей на выводы порта микроконтроллера двоичного кода соответствующей цифры соответствующего логического уровня (для индикаторов с ОК — логические единицы, для индикаторов с ОА — логические нули).

Токоограничительные резисторы могут присутствовать в схеме, а могут и не присутствовать. Все зависит от напряжения питания, которое подается на индикатор и технических характеристик индикаторов.

Если, к примеру, напряжение подаваемое на сегменты равно 5 вольтам, а они рассчитаны на рабочее напряжение 2 вольта, то токоограничительные резисторы ставить необходимо (чтобы ограничить ток через них для повышенного напряжении питания и не сжечь не только индикатор, но и порт микроконтроллера).

Рассчитать номинал токоограничительных резисторов очень легко, по формуле дедушки Ома.

К примеру, характеристики индикатора следующие (берем из даташита): — рабочее напряжение — 2 вольта — рабочий ток — 10 мА (=0,01 А) — напряжение питания 5 вольт Формула для расчета: R= U/I (все значения в этой формуле должны быть в Омах, Вольтах и Амперах) R= (напряжение питания — рабочее напряжение)/рабочий ток

R= (5-2)/0.01 = 300 Ом

Источник: https://microkontroller.ru/praktikum-mikrokontrollershhika/semisegmentnyiy-indikator/

Делаем цифровую шкалу — Сообщество «Электронные Поделки» на DRIVE2

Немножко теорииНаверное нет необходимости рассказывать, что такое 7-сегментные индикаторы. Как сложно и представить область техники, где они не применяются.

Соответственно по их подключению написано масса статей, но попробую все таки написать свою :)Итак: что же такое 7-сегментный индикатор?Обратимся к Википедии: “Семисегме́нтный индика́тор — устройство отображения цифровой информации. Это — наиболее простая реализация индикатора, который может отображать арабские цифры.

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

Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.По сути говоря данный индикатор — это 8 светодиодов расположенных на панели определенным образом.

Соответственно самая простая схема включения — подсоединить все 8 ножек на выводы микроконтроллера (микросхемы — дешифратора) через балластные резисторы, а на общий провод подавать либо “+” (для индикаторов с общим анодом) либо “-” (для индикаторов с общим катодом).

Пример подключения индикатора с общим анодом для схемы индикации включенной передачи АКПП Лансера приведен нижеА как быть, если нужно выводить не 1 цифру, а 2,3,4 и более?И вот тут на помощь приходит человеческая психика.

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

Тогда чтобы вывести первый разряд (опять же для схемы с общим анодом) нужно подать “+” только на общий провод первого разряда и “-” на нужные провода сегментов. Задержать изображение на 2-3 милисекунды, переключится на второй разряд и проделать то же самое с ним, поле чего перейти на третий (четвертый и т.д.) или вернутся к первому.

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

Кстати, транзисторы в этой схеме необязательны — можно подключить выводы индикатора непосредственно к выводам микроконтроллера и затем не подавать на них напряжение (выводы 8-10 данной схемы), а наоборот “притягивать к земле” выводя на них “низкое” напряжение или попросту говоря 0. А “высокое” напряжение (или 1) подается на общие выводы разрядов, которые не должны в данный момент гореть.

Более подробно о таком способе подключения написано здесь — arduino-kit.com.ua/instru…-indikator-i-arduino.html

В чем же “бяка” данной схемы? А в том, что для вывода например трехразрядного числа нужно задействовать 11 ножек микроконтроллера, причем 7 из них, чтобы не раздувать программу, должны относится к одному порту.Все это хорошо, но, например, у Attiny2313 такой только порт В на котором “висят” и оба входа аналогового компаратора.И вот тут на помощь приходят специальные драйверы.

Чаще всего применяют драйвера MAX7219 и MAX7221, управляемые по SPI. Материал по работе с этими драйверами разместил недавно serdgos тут — www.drive2.ru/c/2812487/. Поэтому повторятся не буду — желающие могут почитать.

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

А есть ли более “хардкорные” решения? Оказывается есть — драйвер CD4026.

Описание ДрайвераЧип CD4026 предназначен для управления 7-сегментными индикаторами и представляет собой счётчик до десятка с встроенным сдвиговым регистром.

Счётчик увеличивается на единицу всякий раз, когда контакт «clock» становится HIGH (на восходящем фронте). Выходы a-g становятся HIGH в соответствии со значением счётчика, и отражают его значение арабской цифрой при подключении 7-сегментного индикатора с общим катодом.

Контакт «reset» должен быть притянут к земле в общем случае. Когда он становится HIGH, счётчик сбрасывается в ноль.Контакт «disable clock» также должен быть притянут к земле в общем случае. На время пока он HIGH сигналы на контакт «clock» игнорируются.

Контакт «enable display» должен снабжаться напряжением питания. Иначе выходы a-g будут выставлены в LOW. Контакт «enable out» возвращает его значение с небольшой задержкой.Контакт «÷10» (обозначен как h в таблице) принимает HIGH для значений 0-4 и LOW для 5-9.

Его выход может быть отправлен на вход «clock» следующего 7-сегментного драйвера, чтобы организовать счётчик числа с несколькими разрядами.Контакт «not 2» принимает значениние LOW тогда и только тогда, когда значение счётчика — 2. В остальных случаях он HIGH.

Рабочее напряжение питания: 3—15 В.

ПодключениеС этим все просто: смотрим даташит на индикатор. Я использовал 3х- разрядный, но принципиально разницы с четырехразрядным нет, — для подключения четвертого разряда нужно будет еще задействовать вывод 6 индикатора (сейчас он “пустой”).

Сопоставив даташиты у меня получилась такая схема подключенияи после распайки

В качестве источника сигнала выступал Arduino Pro Micro c задействованными выводамиPin2 Выход на счетчикPin3 Сброс счетчикаPin4 Подключение разряда 1Pin6 Подключение разряда 2Pin9 Подключение разряда 3

Точку не подключал, ибо сейчас ненужно, а принцип подключения тот же.

ПрограммаТак как задействовано Arduino. то и язык соответствующий — модифицированный С.

Прога секундомера, считающего секунды с момента включения, “накидана по быстрячку” чтобы проверить работоспособность, поэтому слегка корява — уж извините.

#define CLOCK_PIN 2#define RESET_PIN 3#define DIGIT_1PIN 4#define DIGIT_2PIN 6

#define DIGIT_3PIN 9

void resetNumber(){// Для сброса на мгновение ставим контакт// reset в HIGH и возвращаем обратно в LOWdigitalWrite(RESET_PIN, HIGH);digitalWrite(RESET_PIN, LOW);digitalWrite(DIGIT_1PIN, HIGH);digitalWrite(DIGIT_2PIN, HIGH);digitalWrite(DIGIT_3PIN, HIGH);}void showNumber(float t){ int n;// Первым делом обнуляем текущее значениеresetNumber();// Выводим первый разрядdigitalWrite(DIGIT_1PIN, LOW);n=int(t-int(t/10)*10);// Далее быстро «прокликиваем» счётчик до нужного// значенияwhile (n–) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);}delay(2);// Обнуляем счетчикresetNumber();// Выводим второй разрядdigitalWrite(DIGIT_2PIN, LOW);n=int(t/10-int(t/100)*10);// Далее быстро «прокликиваем» счётчик до нужного// значенияwhile (n–) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);}delay(2);// Обнуляем счетчикresetNumber();// Выводим третий разрядdigitalWrite(DIGIT_3PIN, LOW);n=int(t/100);// Далее быстро «прокликиваем» счётчик до нужного// значенияwhile (n–) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);}

delay(2);

}void setup() {pinMode(RESET_PIN, OUTPUT);pinMode(CLOCK_PIN, OUTPUT);pinMode(DIGIT_1PIN, OUTPUT);pinMode(DIGIT_2PIN, OUTPUT);

pinMode(DIGIT_3PIN, OUTPUT);

// Обнуляем счётчик при старте, чтобы он не оказался// в случайном состоянииresetNumber();

}

// Основной циклvoid loop(){showNumber((millis() / 1000));}

Ну и результат

Можно еще сократить количество выводов, задействовав сдвиговые регистры, но об этом мы поговорим отдельно 🙂

Источник: https://www.drive2.ru/c/2827146/

Устройство и работа портов ввода-вывода микроконтроллеров AVR. Часть 2

Подключение светодиода к линии порта ввода/вывода Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.
Пример будем рассматривать на микроконтроллере ATMega8.

Программу писать будем в Atmel Studio 6.0.

Эмулировать схему будем в Proteus 7 Professional.

Первым примером в изучении микроконтроллеров является подключение и управление светодиодом, это самый простой и наглядный пример. Этот пример стал классическим при изучении микроконтроллеров, как программа «Hello World!» при изучении прочих языков программирования. Максимальный ток, который способен пропустить каждый порт ввода/вывода составляет 40 mA. Максимальный ток, который способна пропускать каждая линия порта ввода/вывода составляет 20 mA. Прежде чем подключать нагрузку, в том числе и светодиод к линиям порта ввода/вывода нужно знать, что можно спалить микроконтроллер превысив допустимую нагрузку на линию порта ввода/вывода. Что бы ограничить ток, который протекает через линии порта ввода/вывода микроконтроллера нужно рассчитать и подключить резистор.Рис: Рапиновка светодиода.Рис: Подключение светодиода анодом к микроконтроллеру.Рис: Подключение светодиода катодом к микроконтроллеру. Сопротивление токоограничивающего резистора подключаемого к линиям портов ввода/вывода при подключении светодиода рассчитывается по формуле:где:

Vs — напряжение источника питания;

Vsp — падение напряжения на линии порта ввода/вывода;
Vd — прямое падения напряжения на светодиоде;
Id — прямой ток на светодиоде;
Кn — коэффициент надежности роботы светодиода; Пример:

— напряжение источника питания – ;

— прямое падения напряжения на светодиоде – (Берётся с datasheet на светодиод);
— прямой ток на светодиоде – 10мА (Берётся с datasheet на светодиод);
— коэффициент надежности роботы светодиода – 75% (Берётся с datasheet на светодиод);
— падение напряжения на линии порта ввода/вывода – 0,5В (Берётся с datasheet на микроконтроллер: Vol(output low voltage) – если ток втекает, и Voh (output high voltage) – если ток вытекает);

Таким образом номинал резистора R = 166,66 Om, подбирается ближайшее большее значение сопротивления.

Если не известно прямое напряжение светодиода, сопротивление можно рассчитать по закону Ома.где:

U — напряжение, приложенное к участку цепи;

I — номинальный ток линии порта ввода/вывода. Пример:

— напряжение, приложенное к участку цепи – 4,5В;

— номинальный ток линии порта ввода/вывода – 20мА.

Определив номинал резистора R, необходимо рассчитать мощность P, измеряемая в ваттах, которая будет выделяться в резисторе, в виде тепла при протекании тока в цепи.

где:

U – напряжение, приложенное к участку цепи;

I — номинальный ток линии порта ввода/вывода. Пример:

— напряжение, приложенное к участку цепи – 4,5В;

— прямой ток на светодиоде – 20мА.Рассчитав выделяемую мощность на резисторе, выбираем ближайшее большее значение мощности резистора. Если рассеиваемой мощности резистора будет недостаточной, то он может выйти из строя.

— подключения маломощного светодиода анодом к линии порта ввода/вывода:

// Подключаем внешние библиотеки
#include #include // Основная программа
int main(void) { // Настраиваем порты ввода/вывода DDRC = 0b11111111; //Настраиваем все разрады порта С на режим “Выход” PORTC = 0b11111111; //Устанавливаем все разряды порта C в лог.«1» (Навыходе порта напряжение равное Vcc) // Вечный цикл while (1) { } }

— подключения маломощного светодиода катодом к линии порта ввода/вывода:

// Подключаем внешние библиотеки
#include #include // Основная программа
int main(void) { // Настраиваем порты ввода/вывода DDRC = 0b11111111; //Настраиваем все разряды порта С на режим “Выход” PORTC = 0b00000000; //Устанавливаем все разряды порта C в лог.«0» (На выходе порта напряжение равное GND) // Вечный цикл while (1) { } }

— подключения маломощного светодиода анодом и катодом к линии порта ввода/вывода:

Источник: https://habr.com/post/253961/

Подключение семисегментного индикатора через 74hc595. Статическая индикация

Источник: http://AVRproject.ru/publ/kak_podkljuchit/podkljuchenie_semisegmentnogo_indikatora_cherez_74hc595_staticheskaja_indikacija/2-1-0-57

Управление матричными LED-индикаторами

По своему принципу действия, матричные LED-индикаторы полностью аналогичны семисегментным моделям, за исключением большего числа выводов. Это позволяет использовать классические схемы включения таких устройств, без использования каких-либо ухищрений.

Простота реализации, в этом случае, имеет обратную сторону в виде необходимости использования большого числа выводов микроконтроллера. Так для индикатора 5х7 потребуется 12 линий, а 8х8 – 16 управляющих линий. Данный вариант требует также использования ресурсов микроконтроллера.

В виду этого, прямое подключение LED матриц к микроконтроллеру наилучшим образом подходит для включения только одного индикатора. В случае необходимости увеличения размеров поля, лучше применять другие схемы. 

Использование готовых драйверов

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

В данной микросхеме уже реализовано все необходимое для динамической индикации 8 семисегментных индикаторов или матрицы светодиодов, размером 8х8. При этом, для управления MAX7219 требуется только 3 линии ввода вывода микроконтроллера.

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

Главным недостатком MAX7219, является высокая стоимость микросхем, что почти исключает возможность ее применения в больших любительских проектах, с использованием матричных индикаторов.
 

Использование дешифраторов

В отличие от семисегментных индикаторов, для управления матричными индикаторами практически не подходят дешифраторы.

По своему принципу действия они преобразуют двоичный код в позиционный или другой специальный код, тогда как матричный LED-индикатор требует наличия именно двоичного кода.

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

Использование регистров сдвига

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

Возможность каскадного включения позволяет создавать светодиодные матрицы большого размера.

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

Применение регистров возможно как для формирования отдельных элементов в строке, так и для управления столбцами. Такое включение позволяет использовать для LED-матрицы 8х8 всего 4 вывода микроконтроллера. В качестве регистров сдвига можно использовать микросхемы 74HC164 (1554ИР8), 74HC299 (1554ИР24) и некоторые другие.

Использование счетчиков

Для управления столбцами индикаторов, особенно вариантов 5х7 и 5х8 возможно использовать счетчик-дешифратор 4017. Данный счетчик  на выходе имеет функцию 1 из 10, что позволяет организовать динамическую индикацию на двух матрицах с 5 столбцами. Управление отдельными элементами возможно как с прямым подключением, так и с использованием регистров.

You have no rights to post comments

Источник: https://mcucpu.ru/index.php/pdevices/41-indicators/81-matrixcontrol

4-разрядный 7-сегментный индикатор и Arduino

В сегодняшней статье поговорим о 7-сегментных индикаторах и о том, как их «подружить» с Ардуино. Есть несколько вариантов. Самый простой, безусловно, это зайти на arduino-kit.com.ua/seriynyy-displey-opensegment-20-mm-zelenyy.

html и купить готовый индикатор с интегрированным шилдом (это платка согласования так называется), но мы не ищем лёгких путей, поэтому пойдем путем чуть более сложным. Новички – не пугайтесь, эта статья, как и предыдущие мои статьи (arduino-kit.com.ua/arduino-i-labview-ili-vizualizacija-dannyh.html и arduino-kit.com.

ua/chasy-ds1302-dlya-rduino-uno.html) именно для вас. Пусть гуру пишут для таких же умудренных опытом гуру, а я новичок – пишу для новичков.

Почему именно 7-сегментный индикатор? Ведь существует столько всяких экранов, с большим количеством символов, строк, разнообразных диагоналей и разрешений, черно-белых и цветных, самые доступные из которых стоят пару долларов… А тут: «старенький», до безобразия простой, но требующий огромного количества пинов 7-сегментный индикатор, но все-таки преимущество есть и у этого «старичка». Дело в том, что пользуясь приведенными здесь скетчами можно оживить не только индикатор с высотой цифр 14 мм, но и более серьезные (правда уже самодельные) проекты, и метровые цифры в данном случае далеко не предел. Жителям столиц это может быть не так интересно, а вот население Новокацапетовки или Нижней Кедровки очень порадуется, если на клубе или сельсовете появятся часы, которые еще могут и дату отображать, и температуру, а о создателе этих часов будут говорить очень долго. Но, подобные часы тема отдельной статьи: будет желание у посетителейarduino-kit.com.ua/ – напишу. Всё выше написанное можно считать вступлением. Как и прошлая моя статья эта будет состоять из частей, на этот раз из двух. В первой части мы просто «по управляем» индикатором, а во второй – попробуем приспособить его для чего-то хоть немного полезного. Итак, продолжим:

Часть первая. Экспериментально – познавательная

За основу данного проекта взят нам уже хорошо знакомый по предыдущим статьям ARDUINO UNO. Напомню, что приобрести его легче всего можно здесь: arduino-kit.com.ua/uno-r3-new.html или здесь:arduino-kit.com.ua/arduino-leonardo-original-italiya-new-rev3.html , кроме этого понадобится 4-разрядный, 7-сегментный индикатор.

У меня, в частности GNQ-5641BG-11. Почему именно этот? Да просто потому, что лет 5 назад купил его по ошибке, идти менять было лень, вот он и валялся все это время, ожидая своего часа. Думаю, что подойдет любой с общим анодом (и с общим катодом можно, но придется данные массива и остальные значения портов инвертировать – т.е.

менять на обратные), лишь бы не был слишком мощным, чтобы не сжечь Ардуинку. Кроме этого – 4 токоограничивающих резистора, примерно 100 Ом каждый и кусок шлейфа (мне хватило 10 см) на 12 пин (жил) можно «оторвать» от более широкого, что я и сделал. А можно вообще отдельными проводочками подпаяться, проблем не будет.

Еще понадобятся штыри на плату (11 шт.) хотя, если аккуратно можно и без них. Эскиз индикатора можно увидеть на рисунке 1, а его схему на рисунке 2. Также отмечу, что на каждый сегментик этого индикатора лучше подавать не более 2.1В (ограничивается 100-Омными резисторами), и в этом случае он будет потреблять не более 20 мА.

В случае, если загорится цифра «8» потребление не превысит 7х20=140 мА, что вполне допустимо для выходов Ардуино. Любознательный читатель задаст вопрос: «Но ведь 4 разряда по 140 мА это уже 4х140=560 мА, а это уже многовато!» Отвечу – останется 140. Каким образом? Читайте дальше! Расположение пинов на индикаторе видно на рисунке 3.

А подключение делаем согласно таблице 1.

 Рис. 1 – Эскиз индикатора

Рис. 2 – Схема индикатора

Рис. 3 – Расположение пинов

Таблица 1

 Ранее был рассмотрен вариант того, как можно сэкономить кучу портов вывода микроконтроллера, применив сдвиговый регистр 74HC595.

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

Этот пример подходит только для индикаторов, у которых сегменты между разрядами не соеденены вместе. Например, если индикатор собран из одноразрядных семисегментников.

Схема подключения (кликабельно):

 Каждый разряд индикатора подключен к микроконтроллеру через свой регистр. При этом получается, что сдвиговый регистр является буфером в котором хранится выводимая цифра. И отправив значение на индикатор, микроконтроллер может заниматься своими делами, не отвлекаясь на индикацию. Удобно? Очень! Не нужно заморачиваться с динамической индикацией и таймерами. 

Код в Bascom-AVR, для примера выведем на индикатор число 123 :

$regfile = “m8def.

dat”
$crystal = 1000000

Config Portd = Output

'значение этой переменной должны будем вывести на индикатор
Dim A As Word

'переменные для преобразования исходного числа
Dim N1 As Integer
Dim N2 As Integer
Dim N3 As Integer

'для значений отправляемых в регистр
Dim R1 As Byte                                              'сотки
Dim R2 As Byte                                              'десятки
Dim R3 As Byte                                              

A

= 123                                                             'выведем вот это число

'раскладываем число на составляющие

N1 = A / 100                                                'подготовка соток, N1=1

N2 = A Mod 100                                              'подготовка десяток, N2=2
N2 = N2 / 10

N3 = A Mod 10                                               
'вытаскиваем из массива подготовленные значения
R1 = Lookup(n1 , Numbers)
R2 = Lookup(n2 , Numbers)
R3 = Lookup(n3 , Numbers)

'задвигаем в регистры значения, единицы идут первыми
Shiftout Portd.5 , Portd.6 , R3 , 1
Shiftout Portd.5 , Portd.6 , R2 , 1
Shiftout Portd.5 , Portd.6 , R1 , 1

Pulseout Portd , 7 , 5                                      'защелкиваем данные

End

'массив с кодами для семисегментника
Numbers:
Data &B11000000                                             '0
Data &B11111001                                             '1
Data &B10100100                                             '2
Data &B10110000                                             '3
Data &B10011001                                             '4
Data &B10010010                                             '5
Data &B10000010                                             '6
Data &B11111000                                             '7
Data &B10000000                                             '8
Data &B10010000                                             '9

 Схему собрал на беспаячной макетке (solderless breadboard), вещь зачетная если не обращать внимание на необходимое количество соединительных проводов =) Результат экспериментов ниже:

 

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

 Скачать файлы проекта (в архиве исходник, прошивка и файлик протеуса)

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

Главным минусом  метода является невозможность использовать многоразрядные индикаторы, в которых выводы сегментов соединены вместе.

Такие индикаторы предназначены для динамической индикации, поэтому рассмотрим следующий пример:

 Подключение семисегментного индикатора через 74hc595. Динамическая индикация >>>>

Пин Ардуино Уно

Пин индикатора

Примечание

1

5

Сегмент G

2

10

Сегмент F

3

1

Сегмент E

4

2

Сегмент D

5

4

Сегмент C

6

7

Сегмент B

7

11

Сегмент A

8

12

Общий анод сегмента № 1, подключать через резистор 100 Ом.

9

9

Общий анод сегмента № 2, подключать через резистор 100 Ом.

10

8

Общий анод сегмента № 3, подключать через резистор 100 Ом.

11

6

Общий анод сегмента № 6, подключать через резистор 100 Ом.

Заливаем простенький скетч, который представляет собой простенькую «считалочку» от 0 до 9:

sketch-6-1.txt 

А теперь немного пояснений. DDRD это регистр порта D (DDRB – соответственно порта В) за «страшным» словом «регистр» всего лишь «спряталась» функция, которая указывает, будет порт своим пином читать что-то (принимать информацию), либо наоборот туда можно будет что-то писать (отдавать информацию).

В данном случае строчка DDRD=B11111111; указывает, что все пины порта D выходные, т.е. информация из них будет выходить. Буквочка «В» обозначает, что в регистр записано двоичное (бинарное) число. Нетерпеливый читатель тут же спросит: «А десятичное можно!?!». Спешу успокоить – можно, но об этом чуть позже.

Если бы мы хотели половину порта задействовать на вход, а половину на выход можно было бы указать так: DDRD=B11110000; единицы показывают те пины, которые будут отдавать информацию, а нули – те, которые будут эту самую информацию принимать. Основное удобство регистра заключено еще и в том, что не надо прописывать 8 раз все пины, т.е.

мы экономим в программе 7 строк. А теперь разберем следующую строку:

PORTB=B001000; // устанавливаем высокий уровень 11 пина порта В

PORTB это регистр данных порта В, т.е. записав в него какое-либо число мы указываем на каком пине порта будет единица, а на каком – ноль.

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

крайний правый ноль порта В отвечает за 8-й пин, а крайний левый – за 13-й (у которого встроенные светодиод). Для порта D соответственно правый за пин 0, левый за пин 7.

Надеюсь после таких развёрнутых пояснений все понятно, а раз понятно предлагаю вернуться к известной нам и горячо любимой с детства десятичной системе счисления. И еще – скетч в 25 строк вроде и небольшой, но для новичка все-таки несколько громоздок. Будем уменьшать.

Заливаем еще более простой скетч, та же самая «считалочка»: 

sketch-6-2.txt 

Работу скетча можно посмотреть на Видео 1.

Всего 11 строчек! Вот это по-нашему, «по-новичковски»! Прошу обратить внимание вместо двоичных чисел в регистры записаны десятичные. Естественно, для десятичных чисел никаких букв впереди не нужно. Думаю, не лишним будет свести все числа в таблицы.Таблица 2. Соответствие отображаемого знака данным порта

Знак

Общий анод

Общий катод

Двоичная система

Десятичная система

Двоичная система

Десятичная система

«0»

00000011

3

11111100

252

«1»

10011111

159

01100000

96

«2»

00100101

37

11011010

218

«3»

00001101

13

11110010

242

«4»

10011001

153

01100110

102

«5»

01001001

73

10110110

182

«6»

01000001

65

10111110

190

«7»

00011111

31

11100000

224

«8»

00000001

1

11111110

254

«9»

00001001

9

11110110

246

Таблица 3. Соответствие отображаемого разряда данным порта

Разряд

Общий анод

Общий катод

Двоичная система

Десятичная система

Двоичная система

Десятичная система

1

001000

8

110111

55

10

000100

4

111011

59

100

000010

2

111101

61

1000

000001

1

111110

62

Внимание! Данные таблиц 2 и 3 справедливы только при распайке согласно таблице 1.

А теперь зальем скетч со «считалочкой» от 0 до 9999: 
sketch-6-3.txt  Рис. 4 – Считалочка

Работу скетча можно посмотреть на Видео 2

В этом скетче комментариев больше, чем самого кода. Вопросов возникнуть не должно…. Кроме одного, что это за «цикл мерцания» такой, что, собственно говоря, там мерцает и для чего? А еще переменная для этого какая-то…

А все дело в том, что одноименные сегменты всех четырех разрядов у нас соединены в одной точке. А1, А2, А3 и А4 имеют общий катод; А1, В1,…..G1 общий анод. Так, что подав одновременно на 4 разрядный индикатор «1234» мы получим «8888» и очень удивимся по этому поводу. Чтобы этого не произошло нужно сначала зажечь «1» в своем разряде, потом отключить её, зажечь «2» в своем и т.д. Если делать это очень быстро, то мерцание цифр сольётся, как кадры на киноплёнке и глаз его практически не будет замечать. А максимальное значение переменной мерцания в данном случае управляет скоростью смены цифр на индикаторе. Кстати, именно благодаря этому «мерцанию» и максимальное потребление тока всего 140 мА, вместо 560. А теперь предлагаю перейти к чему-то более полезному.

Часть вторая. Хоть немного полезная

В этой части мы выведем символы с персонального компьютера на 7-сегментный индикатор при помощи ARDUINO MEGA.

Почему вдруг возникла идея «поменять лошадей на переправе»? Причин две: первая – до этого в своих статьях я ни разу не рассматривал ARDUINO MEGA; и вторая – в ARDUINO UNO я так и не разобрался, как мне динамически менять местами СОМ порт и порт D. Но я новичок – мне простительно.

Приобрести данный контроллер, естественно можно здесь: arduino-kit.com.ua/arduino-mega-2560-adk-new.html . Для реализации задуманного пришлось взять паяльник и перепаять шлейф со стороны Ардуино, а также написать новый скетч. Как перепаян шлейф можно посмотреть на Рисунке 5.

Все дело в том, что ARDUINO MEGA и ARDUINO UNO имеют разную распиновку портов, да и в Меге портов гораздо больше. Соответствие использованных пинов видно из Таблицы 4.

 Рис. 5 – Новая распайка шлейфа

Таблица 4

Пин Уно

Порт Уно

Пин Мега

Порт Мега

1

D

23

A

2

D

24

A

3

D

25

A

4

D

26

A

5

D

27

A

6

D

28

A

7

D

29

A

8

B

37

C

9

B

36

C

10

B

35

C

11

B

34

C

Внимание! Данная таблица справедлива только для данного проекта!

Также следует обратить внимание, что порт С у Ардуино Мега «начинается» с 37 пина и далее по убывающей, а порт А – с 22 пина и далее по возрастающей.

 Рис. 6 – Общий вид

Небольшие особенности реализации: выводить будем 4 символа. Символы должны быть цифрами. Если ввели «1234» и увидим «1234», если ввели «123456» все равно увидим «1234», если ввели «йцук», «фыва1234», «отиог485909оапоьм» – не увидим ничего. Если ввели «рр2345мм» увидим « 23» т.е. небольшая, встроенная «защита от дурака».

Собственно скетч:

sketch-6-4.txt 

А как работает данная программа можно посмотреть на Видео 3

 

Обзор подготовил Павел Сергеев

Источник: http://arduino-kit.com.ua/4-razryadnyy-7-segmentnyy-indikator-i-arduino.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}