Подключение символьного lcd-дисплея 16х2 (hd44780)

AVR. Учебный курс. Подключение к AVR LCD дисплея HD44780

Сегодня разменял четверть века!

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

О том как подключить к AVR LCD дисплей я вам сейчас и поведаю.

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

Продается везде где только можно, стоит недорого (8х2 мне обошелся порядка 150 рублей), а также под него написана куча кода. Я же, как обычно, решил изобрести велосипед и сварганить свою собственную тру-библиотеку для работы с этим типом индикаторов. Разумеется на ассемблере, а на чем же еще? 😉

Подключение.
LCD на базе HD44780 подключается к AVR микроконтроллеру напрямую к портам. Есть два способа подключения — на 8 бит и на 4 бита. В восьмибитном режиме немножко проще закидывать байты — не нужно сдвигать байт, зато в четырех битном резко нужно тратить на целых четыре ножки контроллера меньше. Есть еще одна особенность работы в 8-битном режиме — к некоторым контроллерам можно подрубить этот дисплей как внешнее ОЗУ и засылать данные простыми командами пересылки. Лично я подключил его в режиме полного порта у меня один фиг выводы уже девать некуда было, так что не жалко.

  • Выводы DB7…DB0 это шина данных/адреса.
  • E — стробирующий вход. Дрыгом напряжения на этой линии мы даем понять дисплею что нужно забирать/отдавать данные с/на шину данных.
  • RW — определяет в каком направлении у нас движутся данные. Если 1 — то на чтение из дисплея, если 0 то на запись в дисплей.
  • RS — определяет что у нас передается, команда (RS=0) или данные (RS=1). Данные будут записаны в память по текущему адресу, а команда исполнена контроллером.

Со стороны питания все еще проще:

Подключение дисплея
Видимая и скрытая область экранной памяти
Структура адресации контроллера HD44780
Формирование символа в ячейке CGRAM

  • GND — минус, он же общий.
  • Vcc — плюс питания, обычно 5V
  • V0 — вход контрастности. Сюда нужно подавать напряжение от нуля до напряжения питания, тем самым задается контрастность изображения. Можно поставить переменный резистор, включенный потенциометром и крутить в свое удовольствие. Главное поймать значение максимального контраста, но чтобы не было видно знакомест (серый ореол из квадратов вокруг символа). Если же выставить слишком малый контраст, то символы будут переключаться лениво и задумчиво. Примерно как в калькуляторе у которого сели батарейки.
  • А — это вход Анода светодиодной подсветки. Короче плюс.
  • К — соответственно Катод, он же минус. Подсветка хавает примерно 100мА и поэтому нужно выставить туда токоограничительный резистор на 100 Ом. Кстати, многие ЖК дисплеи имеют на плате пятачки для припайки резисторов. Если прозвонить, то можно убедиться в том, что эти линии ведут на входы питания LCD, поэтому, впаяв резисторы, можно не заморачиваться на запитку подстветки, она будет подключена к питанию контроллера.

Логическая структура LCD контроллера HD44780

Контроллер имеет свой блок управления, который обрабатывает команды и память. Она делится на три вида:

DDRAM — память дисплея. Все что запишется в DDRAM будет выведено на экран. То есть, например, записали мы туда код 0x31 — на экране выскочит символ «1» т.к. 0х31 это ASCII код цифры 1.

Но есть тут одна особенность — DDRAM память гораздо больше чем видимая область экрана. Как правило, DDRAM содержит 80 ячеек — 40 в первой строке и 40 во второй, а на дисплей может двигаться по этой линейке как окошко на логарифмической линейке, высвечивая видимую область.

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

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

CGROM — таблица символов. Когда мы записываем в ячейку DDRAM байт, то из таблицы берется символ и рисуется на экране. CGROM нельзя изменить, поэтому важно, чтобы она имела на борту русские буквы. Если, конечно, планируется русскоязычный интерфейс.

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

Всего в CGRAM может быть 8 символов, соответственно CGRAM имеет 64 байта памяти. Эти программируемые символы имеют коды от 0х00 до 0х07.

Так что, закинув, например, в первые 8 байт CGRAM (первый символ с кодом 00) какую нибудь фигню, и записав в DDRAM нуль (код первого символа в CGRAM) мы увидим на экране нашу хрень.

Доступ к памяти.
Тут все просто. Мы командой выбираем в какую именно память и начиная с какого адреса будем писать. А потом просто шлем байты. Если указано, что записываем в DDRAM то на экран (или в скрытую область) полезут символы, если в CGRAM то байты полезут уже в память знакогенератора. Главное потом не забыть переключится обратно на область DDRAM

Система команд.
Система команд проста как мычание. О том, что передается команда контроллеру дисплея сообщит нога RS=0. Сама команда состоит из старшего бита, определяющего за что отвечает данная команда и битов параметров, указывающих контроллеру HD44780 как дальше жить.

Таблица команд:

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Значение
1 Очистка экрана. Счетчик адреса на 0 позицию DDRAM
1 Адресация на DDRAM сброс сдвигов, Счетчик адреса на 0
1 I/D S Настройка сдвига экрана и курсора
1 D C B Настройка режима отображения
1 S/C R/L Сдвиг курсора или экрана, в зависимости от битов
1 DL N F Выбор числа линий, ширины шины и размера символа
1 AG AG AG AG AG AG Переключить адресацию на SGRAM и задать адрес в SGRAM
1 AD AD AD AD AD AD AD Переключить адресацию на DDRAM и задать адрес в DDRAM

Теперь поясню что значат отдельные биты:

  • I/D — инкремент или декремент счетчика адреса. По дефолту стоит 0 — Декремент. Т.е. каждый следующий байт будет записан в n-1 ячейку. Если поставить 1 — будет Инкремент.
  • S — сдвиг экрана, если поставить 1 то с каждым новым символом будет сдвигаться окно экрана, пока не достигнет конца DDRAM, наверное удобно будет когда выводишь на экран здоровенную строку, на все 40 символов, чтобы не убегала за экран.
  • D — включить дисплей. Если поставить туда 0 то изображение исчезнет, а мы в это время можем в видеопамяти творить всякие непотребства и они не будут мозолить глаза. А чтобы картинка появилась в эту позицию надо записать 1.
  • С — включить курсор в виде прочерка. Все просто, записали сюда 1 — включился курсор.
  • B — сделать курсор в виде мигающего черного квадрата.
  • S/C сдвиг курсора или экрана. Если стоит 0, то сдвигается курсор. Если 1, то экран. По одному разу за команду
  • R/L — определяет направление сдвига курсора и экрана. 0 — влево, 1 — вправо.
  • D/L — бит определяющий ширину шины данных. 1-8 бит, 0-4 бита
  • N — число строк. 0 — одна строка, 1 — две строки.
  • F — размер символа 0 — 5х8 точек. 1 — 5х10 точек (встречается крайне редко)
  • AG — адрес в памяти CGRAM
  • АD — адрес в памяти DDRAM

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

Задача:

  1. Включить дисплей.
  2. Очистить содержимое.
  3. Сдвинуть курсор на одну позицию.
  4. И записать туда «1».

Решение (последовательность команд):

Первым делом Инициализация дисплея без которой большая часть дисплеев на HD44780 просто откажется работать. Некоторые виды имеют дефолтные состояние (шина 8 бит, курсор в 0) и им только дисплей включить. Но все же ее лучше сделать, мало ли что там намудрил разработчик. Лишней не будет.

  • 00111000 Шина 8 бит, 2 строки
  • 00000001 Очистка экрана
  • 00000110 Инкремент адреса. Экран не движется
  1. 00001100 Включили дисплей (D=1)
  2. 00000001 Очистили дисплей. Указатель встал на DDRAM
  3. 00010100 Сдвинули курсор (S/C=0) вправо (R/L=1)
  4. 00110001 — это мы уже записали данные (ножка RS=1) код «1» 0х31

Жирным шрифтом выделен идентификатор команды, ну а остальное по таблице увидите.

Задача: создать свой символ. С кодом 01 и вывести его на экран.
Считаем, что дисплей у нас уже инициализирован и готов к приему данных.

Решение:

  1. 01001000      Выбираем в CGRAM адрес 0х08 — как раз начало второго символа (напомню, что на один символ уходит 8 байт)
  2. 00000001     Это пошли 8 байт данных.

    (RS=1)

  3. 00000010     Рисуем значок молнии, ну или
  4. 00000100     ССовскую Зиг руну, кому как
  5. 00001000     больше нравится.

  6. 00011111     Старшие три бита не действуют
  7. 00000010     Туда можно писать что угодно, на
  8. 00000100     результат влиять не будет.

  9. 00001000     Последний байт данных  
  10. 10000000      А это уже команда — переключение адреса на DDRAM и указатель на адрес 0000000 — первый символ в первой строке.
  11. 00000001      И снова данные (RS=1), код 01 — именно в него мы засунули нашу молнию.

Опа и он на экране!

Так, с логикой разобрались, пора вкуривать в физику протокола общения. Код я приведу несколько позже, когда вылижу свою библиотеку и заоптимизирую до состояния идеала. Пока же дам алгоритм, а его уж на любом языке программирования реализовать можно. Хоть на ассемблере, хоть на Сях, да хоть на Васике 🙂

Алгоритм чтения/записи в LCD контроллер HD44780
Направление, а также команда/данные определяются ножками, а чтение и запись осуществляется по переходу строба (вывод Е) из 1 в 0

Инициализация портов

  1. RS, RW, E — в режим выхода.
  2. DB7..DB0 в режим входа. Впрочем, можно их не трогать, дальше переопределим.

Ожидание готовности, чтение флага занятости.

  1. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  2. RS=0 (команда)
  3. RW=1 (чтение)
  4. E=1 (Готовьсь!!!)
  5. Пауза (14 тактов процессора на 8МГЦ хватало)
  6. Е=0 (Пли!)
  7. Читаем из порта. Если бит 7 (Busy flag) установлен, то повторяем все заново, пока не сбросится.

Запись команды

  1. Ожидание готовности
  2. RS=0 (команда)
  3. RW=0 (запись)
  4. Е=1 (Готовьсь!!!)
  5. Порт на выход
  6. Вывести в порт код команды
  7. Пауза
  8. Е=0 (Пли!)
  9. Орудие на плечо Порт на вход, на всякий случай.

Запись Данных

  1. Ожидание готовности
  2. RS=1 (Данные)
  3. RW=0 (запись)
  4. Е=1 (Готовьсь!!!)
  5. Порт на выход
  6. Вывести в порт код команды
  7. Пауза
  8. Е=0 (Пли!)
  9. Порт на вход, на всякий случай.

Чтение команды

  1. Ожидание готовности
  2. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  3. RS=0 (команда)
  4. RW=1 (чтение)
  5. Е = 1 (Готовьсь! В этот момент данные из LCD вылазят на шину)
  6. Пауза
  7. Считываем данные с порта
  8. E=0 (Ать!)

Чтение Данных

  1. Ожидание готовности
  2. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  3. RS=1 (Данные)
  4. RW=1 (чтение)
  5. Е = 1 (Готовьсь! В этот момент данные из LCD вылазят на шину)
  6. Пауза
  7. Считываем данные с порта
  8. E=0 (Ать!)

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

Запись:

  1. E=1
  2. Пауза
  3. Выставили в порт старшую тетраду
  4. E=0
  5. Пауза
  6. Е=1
  7. Пауза
  8. Выставили в порт младшую тетраду
  9. Е=0

Чтение

  1. E=1
  2. Пауза
  3. Читаем из порта старшую тетраду
  4. Е=0
  5. Пауза
  6. Е=1
  7. Пауза
  8. Читаем из порта младшую тетраду
  9. Е=0

Ждите код 🙂 Скоро будет 🙂
UPD:
А вот и код!

Источник: http://easyelectronics.ru/avr-uchebnyj-kurs-podklyuchenie-k-avr-lcd-displeya-hd44780.html

Подключение LCD(HD44780) к микроконтроллерам AVR

Дата публикации: 28 февраля 2011.

Рейтинг:  5 / 5

Внутреннее устройство LCD

Достоинством символьных многострочных LCD является то, что заботу о подаче требуемых напряжений на массив “ЖК-конденсаторов” берет на себя встроенный управляющий контроллер. На рис.1 показана структурная схема типового LCD с организацией 16х2, которая идентична для всех моделей независимо от фирмы-изготовителя.

Основу составляет специализированный контроллер, обычно выполненный в виде одной или двух микросхем-“капелек”, реже – в виде фирменной SMD-микросхемы. По назначению выводов и системе команд он совпадает с родоначальником серии – HD44780.

Общепринятое название таких микросхем “Dot Matrix Liquid Crystal Display Controller/Driver”, из чего следует их двойная функция – контроллер управляет интерфейсом, а драйвер “зажигает” сегменты.

Контроллер синхронизируется внутренним RC-генератором G1, имеющим частоту 250 ±50 кГц. Напряжение подсветки подается через выводы А и К на светодиоды, которые освещают ЖК-панель с торца или обратной стороны корпуса. Светодиоды включены матрицей и соединены параллельно-последовательно. В связи с этим напряжение подсветки довольно высокое 4,0…4,2 В.

Назначение и нумерация всех внешних выводов LCD унифицированы (рис.2). Это не зависит от количества строк и символов, будь то “8×1” или “16×2”. Даже контакты светодиодной подсветки 15, 16 имеются на всех LCD, хотя при ее физическом отсутствии они будут просто “висеть в воздухе”.

Небольшой нюанс. На печатной плате LCD порядок нумерации контактных площадок отличается от модели к модели. Например, встречаются следующие варианты: слева направо 1-16, справа налево 16-1, вперемежку 15, 16, 1-14.

Подсказку следует искать визуально по отмаркированным цифрам на печатной плате. Контакты 15, 16 обычно дублируются еще одной парой контактов с маркировкой А и К соответственно. Электрически они соединены параллельно.

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

Электрический интерфейс состоит из трех шин:

DB0-DB7 шина данных;

RS, R/W, E шина управления;
VCC, GND, Vo, A, K шина питания.

Внимание: перед подключением питания VCC и GND внимательно прочитайте описание на Ваш дисплей, т.к. контакты питания у некоторых дисплеев могут различаться.

Типовая схема подключения LCD к МК показана на рис.3. Именно она и будет использоваться для первой тестовой проверки LCD с выведением на экран знаменитой фразы “Hello, world!” (“Здравствуй, мир!”). Кнопка SB1 осуществляет начальный сброс. Переменным резистором R2 регулируют контрастность изображения. Его сопротивление непринципиально и может меняться от 5 до 20 кОм.

Рис. 3

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

Отрегулировать R2 следует на перегибе характеристики, как правило, с потенциалом ближе к общему проводу, когда слабо видны все точки знакомест на LCD. Неправильная установка контрастности может привести к ложному выводу о дефекте индикатора, хотя все, что надо сделать, это покрутить движок резистора.

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

Во-первых, LCD будет работать только на прием информации по всем 11 соединительным линиям шины данных и управления.

Во-вторых, экран LCD считается жестко привязанным к начальной позиции с фиксированными адресами знакомест.

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

Программное управление LCD

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

Таблица 3

В таблице (см. выше) показана расшифровка наиболее употребляемых команд, посылаемых от МК в LCD, а на рис.4 – показаны команды для перехода на определенное знакоместо верхней или нижней строки экрана.

Время выполнения команд указано приблизительно. Оно определяется частотой внутреннего RC-генератора LCD, которая, в свою очередь, зависит от технологического разброса и температуры нагрева корпуса.

Рисунок 4

Различают команды прямого и косвенного действия. Первые из них занимают адреса 0x01-0x3F и не требуют передачи данных.

За вторыми (диапазон выше 0x3F) обязательно следует передача одного или нескольких байтов информации. Для примера на рис.

5 показаны временные диаграммы выполнения команды 0x80 “Установка курсора в первое знакоместо верхней строки экрана” и индикация в нем цифры “4” пересылкой кода данных 0x34.

Рисунок 5

Формировать диаграммы, показанные на рис.5, должен МК с учетом задержек из табл.3, необходимых контроллеру LCD на выполнение команд. Для повышения устойчивости работы экономить на задержках не надо. По крайней мере, при отладке программы они должны быть достаточно большими.

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

Далее показана Си-программа для тестовой проверки LCD по схеме, собранной на рис.3.

// Тестовая программа для LCD, шина 8 бит #include #include #define RS PC0 // RS подключаем к PC0 микроконтроллера #define EN PC2 // EN подключаем к PC2 микроконтроллера // Функция записи команды в LCD void lcd_com(unsigned char p) { PORTC &= ~(1

Источник: https://radioparty.ru/prog-avr/program-c/258-lcd-avr-lesson1

Подключение LCD дисплея hd44780 к Arduino

Всем привет! Сегодня мы будем подключать LCD дисплей к нашей ардуинке.

Ну начнем как полагается с железа! Вот стандартная распиновка дисплея на контроллере HD44780 16Х2 знакомест.

А вот стандартное подключение к Arduino

Все просто, нужен сам дисплей, Arduino и подстроечный резистор на 10Ком для регулировки контраста.

Для проверки дисплея можно подключить только вот эти контакты:

  • 1 контакт дисплея — Vss,  —> земля  GND
  • 2 контакт дисплея —  Vdd, —> питание  +5 В
  • 3 контакт дисплея —  Vo, —> управление контрастностью напряжением ⇨ выход потенциометра
  • 15 контакт дисплея — A, —> питание для подсветки  +5 В
  • 16 контакт дисплея —  K, —> земля для подсветки  GND

При таком подключении должен загорется первый ряд, вот так:

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

Полное подключение выглядит так:

  • 1 контакт дисплея — Vss, —> земля  GND
  • 2 контакт дисплея — Vdd, —>  питание  +5 В
  • 3 контакт дисплея — Vo, —> управление контрастностью напряжением выход потенциометра
  • 4 контакт дисплея — RS, —> выбор регистра пин 12 Arduino
  • 5 контакт дисплея — R/W, —> чтение/запись  земля (режим записи)
  • 6 контакт дисплея — E, —>  Enable  пин 11 Arduino
  • 7-10 контакт дисплея — DB0-DB3, —> младшие биты 8-битного интерфейса; не подключены
  • 11-14 контакт дисплея — DB4-DB7, —> старшие биты интерфейса  пины 5-2 Arduino
  • 15 контакт дисплея — A, —> питание для подсветки  +5 В
  • 16 контакт дисплея — K, —> земля для подсветки  GND

Ну а теперь софтовая часть! Запускаем Arduino IDE

Файл —> Образцы —> LiquidCrystal —> HelloWorld:

И видим код:

// подключаем библтотеку для работы с LCD:#include // команда инициализации пинов дисплеяLiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // запускаем дисплей, 2 строки по 16 символов  // выводим на дисплей хеллоу ворд  lcd.print(“hello, world!”);  // ставим курсор на вторую строку на нулевой столбец// нумерация строк с 0 (верхняя строка 0 нижняя 1)  // выводим на дисплей число секунд, прошедших с момента старта Arduino  lcd.print(millis() / 1000);

Компилируем, загружаем и получаем результат:

Давайте теперь рассмотрим стандартные процедуры библитеки LCD Arduino:

  • home() и clear()Первый метод возвращает курсор в начало экрана; clear() делает то же самое, заодно стирая всё, что было на дисплее до этого.
  • write(ch)Выводит одиночный символ ch на дисплей. Пример:
    lcd.write(0); // вывести символ с кодом 0; см. метод createChar()

     

  • cursor() и noCursor()Позволяют показать курсор на дисплее (символ подчёркивания) и скрыть его.
  • blink() и noBlink()Включить и выключить мигание курсора, если включено его отображение.
  • display() и noDisplay()Включить и выключить дисплей.
  • scrollDisplayLeft() и scrollDisplayRight()Прокрутить экран на один символ влево или вправо.
  • autoscroll() и noAutoscroll()Включить и выключить режим автопрокрутки. В этом режиме при выводе каждого следующего символа содержимое экрана будет смещено на один символ влево (или вправо, если включен режим вывода справа налево), а выводимый символ займёт место первого сдвинутого. Проще говоря, в этом режиме все последующие символы выводятся в одно и то же место, вытесняя текущее содержимое экрана.
  • leftToRight() и rightToLeft()Устанавливают направление вывода текста: слева направо и справа налево, соответственно.
  • createChar(ch, bitmap)Самая крутая функция: позволяет создать свой символ с кодом ch (от 0 до 7), пользуясь массивом битовых масок bitmap для задания тёмных и светлых точек. Пример:
      // Регистрируем собственные символы с кодом 0  lcd.createChar(0, symbol);// выводим на экран собственный символ

    Сегодня мы научильсь использовать LCD дисплей с Arduino!

Источник: http://it-chainik.ru/podklyuchenie-lcd-displeya-hd44780-k-arduino/

Символьные LCD дисплеи. Часть1

Введение

Символьные ЖК можно встретить в кофеварках, лазерных принтерах, детских игрушках и может быть даже в тостерах. Контроллер Hitachi HD44780 стал промышленным стандартом для этих типов дисплеев. Это пособие, использующее DIP переключатели и несколько других компонентов, научит вас основам управления HD44780 совместимым дисплеем.

Схема расположения выводов

Мы будем использовать 16-символьный 2-строчный дисплей. Он использует контроллер ST7065C, совместимый с HD44780. На рисунке внизу показан ЖК модуль и схема расположения выводов.

https://www.youtube.com/watch?v=cCiYBnVlHfM

Последние 2 контакта (15 и 16) необязательные и используются только если дисплей имеет подсветку.

На схеме внизу показан ЖК модуль с подключенными основными проводами. Вы, наверное, заметили, что контакт 5 (RW) соединен с общим проводом. Этот контакт служит для управления чтением или записью в дисплей. Так как чтение из дисплея почти никогда не используется, большинство людей просто соединяют этот контакт с общим проводом.

Потенциометр, подключенный к контакту 3, регулирует контрастность ЖК дисплея.

Передача данных и команд

Данные и команды посылаются модулю по 8 линиям данных (контакты 7…14) и линии RS (контакт 4).
Линия RS указывают модулю, к чему относятся 8 бит: к данным или к команде. Данные или команда считываются по спаду сигнала на линии Enable (контакт 6). Это означает, что когда уровень на линии Enable переходит из высокого в низкий, значения линий D0…D7 и RS считываются.

Чтобы послать данные или команду дисплею, вы должны:

  1. Установить на линии Enable высокий уровень
  2. Установить нужные значения на RS и D0…D7
  3. Установить на линии Enable низкий уровень

Между этими операциями должно быть небольшое время ожидания, но здесь рассматривать это я не буду.

Модули дисплеев на основе HD44780 могут работать также в режиме 4-битного интерфейса. В этом режиме данные или команды передаются модулю, используя два 4-битных полубайта. Детально мы обсудим это ниже.

Команды и символы

Ниже приведены таблицы инструкций и символов. 

Инструкция RS R/W Код инструкции Описание Время выполнения(fOSC=270 кГц)
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
Очистка дисплея 1 Очистка дисплея и установка адресаDDRAM в 00H. 1.53 мс
Возврат 1 Установка адреса DDRAM в 00H, сброс сдвигов.Содержимое DDRAM не меняется.

1.53 мс

Установкарежима ввода 1 l/D SH Выбор направленя сдвига курсора или экрана, разрешение сдвига дисплея. Действие выполняется во время операциичтения или записи. 39 мкс Выбор режимаотображения 1 D C B Включение/выключение дисплея (D), включение/выключение курсора ON/OFF (C), включение мерцания символав позиции курсора (B). 39 мкс Сдвиг курсораили дисплея 1 S/C R/L – – Перемещеие курсора или дисплея безизменения содержимого DDRAM. 39 мкс Установкапараметров 1 DL N F – – Установка ширины шины данных (DL: 8 бит /4 бит), числа строк дисплея (N: 2 строки/1 строка), и размер матрицы символов(F: 5×11 точек / 5×8 точек) 39 мкс Установкаадреса CGRAM 1 AC5 AC4 AC3 AC2 AC1 AC0 Присваивает адресу CGRAM значениесчетчика адреса. 39 мкс Установкаадреса DDRAM 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 Присваивает адресу DDRAM значениесчетчика адреса. 39 мкс Чтение флага«занято» и адреса 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 Чтение флага «занято» (BF), указывающего на то, что контроллер занят выполнениеминструкции и чтение адреса счетчика. 0 мкс Запись данных в CGили DD RAM 1 D7 D6 D5 D4 D3 D2 D1 D0 Запись данных во внутреннюю память(DDRAM/CGRAM). 43 мкс Чтение данных из CGили DD RAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0 Чтение данных из внутренней памяти(DDRAM/CGRAM). 43 мкс

Кликните для увеличения

 Сборка схемы

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

Схема устройства показана ниже.

Кликните для увеличения

На фотографии ниже показано устройство на макетной плате без ЖК модуля. Я так же добавил небольшой источник питания на основе L7805 (с правой стороны платы).

Линии данных и Register Select соединены с общим проводом через резисторы 10 кОм, и когда переключатель замкнут, на этих линиях устанавливается высокий уровень. Линия Enable, с другой стороны, всегда подтянута к высокому уровню, а когда кнопка нажата, переходит в низкий. Для подавления дребезга к кнопке на линии Enable подключен конденсатор 10 нФ.

Перед тем как подключить ЖК модуль к плате, вам понадобится припаять 16-контактный разъем, как показано на рисунке ниже.

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

Если показанное ниже изображение на дисплее вы не видите, покрутите потенциометр контраста. Это изображение отображается по умолчанию на неинициализированном ЖК дисплее.

Работа в 8-битном режиме

Для взаимодействия с дисплеем и вывода текста нам необходимо

  1. Инициализировать дисплей
  2. Установить режим ввода и
  3. Послать последовательность символов в дисплей

Таким образом, для вывода текста нам потребуется включить устройство и затем ввести последовательность Данных/Команд, нажимая Enable после каждой порции данных или команды.

RS D7 … D0 Описание
0 0 1 1 – 1 0 0 0 Функция set, 8 бит, 2 строки, 5×7
0 0 0 0 – 1 1 1 1 Дисплей Включен, Курсор включен, Курсор мигает
0 0 0 0 – 0 1 1 0 Режим ввода, Увеличение позиции курсора,Не сдвигать текст вертикально
1 0 1 0 0 – 1 0 0 0 H
1 0 1 1 0 – 0 1 0 1 e
1 0 1 1 0 – 1 1 0 0 l
1 0 1 1 0 – 1 1 0 0 l
1 0 1 1 0 – 1 1 1 1 o
1 0 0 1 0 – 0 0 0 0 пробел
1 0 1 0 1 – 0 1 1 1 w
1 0 1 1 0 – 1 1 1 1 o
1 0 1 1 1 – 0 0 1 0 r
1 0 1 1 0 – 1 1 0 0 l
1 0 1 1 0 – 0 1 0 0 d

Управление в 4-битном режиме

Главное преимущество 4-битного режима в том, что требуется меньше линий данных. В этом режиме линии с D3 по D0 замкнуты на землю, а данные/команды передаются 4-битными полубайтами.

RS D7 … D0 Описание
0 0 1 0 – 0 0 0 0 Установить 4 битный режим (заметьте: занимает 1 полубайт)
0 0 1 0 – 0 0 0 0 Функция set, 8 бит
1 0 0 0 – 0 0 0 0 2-й полубайт
0 0 0 0 – 0 0 0 0 Дисплей Включен, Курсор включен, Курсор мигает
1 1 1 1 – 0 0 0 0 2-й полубайт
0 0 0 0 – 0 0 0 0 Режим ввода, Приращение адреса курсора, Текст не сдвигать
0 1 1 0 – 0 0 0 0 2-й полубайт
1 0 1 0 0 – 0 0 0 0 H
1 1 0 0 0 – 0 0 0 0 2-й полубайт
1 0 1 1 0 – 0 0 0 0 e
1 0 1 0 1 – 0 0 0 0 2-й полубайт
1 0 1 1 0 – 0 0 0 0 l
1 1 1 0 0 – 0 0 0 0  2-й полубайт
1 0 1 1 0 – 0 0 0 0 l
1 1 1 0 0 – 0 0 0 0  2-й полубайт
1 0 1 1 0 – 0 0 0 0 o
1 1 1 1 1 – 0 0 0 0 2-й полубайт
1 0 0 1 0 – 0 0 0 0 пробел
1 0 0 0 0 – 0 0 0 0 2-й полубайт
1 0 1 0 1 – 0 0 0 0 w
1 0 1 1 1 – 0 0 0 0 2-й полубайт
1 0 1 1 0 – 0 0 0 0 o
1 1 1 1 1 – 0 0 0 0 2-й полубайт
1 0 1 1 1 – 0 0 0 0 r
1 0 0 1 0 – 0 0 0 0 2-й полубайт
1 0 1 1 0 – 0 0 0 0 l
1 1 1 0 0 – 0 0 0 0 2-й полубайт
1 0 1 1 0 – 0 0 0 0 d
1 0 1 0 0 – 0 0 0 0 2-й полубайт

Это очень легко!

В следующей части мы обсудим как связать модуль с микроконтроллером и сделаем за вас всю тяжелую работу.

Оклнчание читайте здесь

protostack.com

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

Проекты на микроконтроллерах AVR – Работа с дисплеем 16×2 на контроллере HD44780 в Bascom-AVR

 Работа с дисплеем 16×2 на контроллере HD44780 в Bascom-AVR

 Жидкокристаллические дисплеи на контроллере HD44780 (а также совместимом с ним KS0066) очень распространены благодаря простому методу работы с ними, а так же небольшой цене. В зависимости от исполнения дисплея, они позволяют выводить от 8-и до 40-ка символов в каждой строке, строк может быть одна, две или четыре. Чаще всего встречаются 8*2 (восемь символов*две строки), 16*2 и 20*4.  

 Для примера рассмотрим распиновку индикатора 16*2 (у всех дисплеев на контроллере HD44780 она похожа)

У каждого дисплея на контроллере HD44780 для подключения имеется 14 выводов + 2 вывода для подсветки (если она имеется):

  1. Земля, GND
  2. Напряжение питания, Vcc (+5V)
  3. Настройка контрастности, Vo
  4. Выбор регистра, R/S
  5. Чтение/запись, R/W
  6. Сигнал разрешения чтения/записи, E
  7. Bit 0, D0 
  8. Bit 1, D1
  9. Bit 2, D2
  10. Bit 3, D3
  11. Bit 4, D4 
  12. Bit 5, D5
  13. Bit 6, D6
  14. Bit 7, D7 
  15. Питание подсветки для дисплеев с подсветкой, LED +
  16. Питание подсветки для дисплеев с подсветкой, LED –

Данные в дисплей загружаются по шине данных (D0-D7), при этом контроллер поддерживает как 8-и, так и 4-х битное подключение.

4-х битное подключение экономит ножки микроконтроллера и чаще всего достаточно для многих задач (при 8и битном подключении можно быстрее загружать данные в контроллер дисплея, но нам пока это ни к чему, поэтому не будем его рассматривать). Для 4-х битного подключения используются 4 последних бита шины (D4-D7).

В качестве примера будем использовать дисплей 20х4, подключенный к микроконтроллеру ATmega8 по 4х битному интерфейсу по схеме ниже

 Дисплей требует для питания 5 вольт, делителем на резисторе R1 настраивается контрастность отображаемых символов, вывод R/W подключается к земле (т.е. выбрана постоянная запись в дисплей). Подключать оставшиеся выводы можно к любым свободным ножкам микроконтроллера. Конфигурация ножек для подключения дисплея у микроконтроллера ATmega8 будет выглядеть следующим образом:

$regfile = “m8def.

dat”                        'выбранный тип микроконтроллера
$crystal = 1000000                            'частота работы 1 МГц

Config Lcd = 20 * 4                           'указываем какой у нас дисплей

'и конфигурируем ножки для подключения

Config Lcdpin=Pin,Db4=PortB.3, Db5=PortB.2, Db6=PortB.1, Db7=PortB.0,E=PortB.4,Rs=PortB.5

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

CLS – очистка дисплея

LCD – вывести данные на дисплей (пример: Lcd “Hello world” выведет надпись Hello world)

Locate – установка места на индикаторе с которого начнется выводится текст (пример: Locate 1,5 установит курсор на 5-е знакоместо первой строчки и текст выводимый командой LCD будет начинаться отсюда)

CURSOR ON / OFF / BLINK / NOBLINK – включает или отключает отображение и мигание курсора, по умолчанию он включен (пример: отключим курсор командой Cursor Off)

А теперь напишем вот такую небольшую программку, которая выведет надпись на дисплей:

$regfile = “m8def.

dat”      'выбранный тип микроконтроллера
$crystal = 1000000          'частота работы 1 МГц

Config Lcd = 20 * 4         'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.

5

Cursor Off                  'выключим отображение курсора
Cls                         'очистим дисплей

Lcd “LCD 20*4 HD44780”      'выводим текст в первой строке
Locate 2 , 8                'переводим курсор на вторую строку, восьмое знакоместо
Lcd “AVRproject.

ru”         'выводим текст

End

в результате на дисплее получим следующее:

 Также в Bascom-AVR есть еще несколько дополнительных команд для работы с дисплеями:

UPPERLINE – возвращает курсор на самую верхнюю строчку дисплея.

LOWERLINE – перевод курсора на вторую строку

THIRDLINE – перевод курсора на третью строку

FOURTHLINE – перевод курсора на четвертую строку 

HOME – также возвращает курсор на верхнюю строчку, но в отличии от команды UPPERLINE эта команда может принимать дополнительные значения: если после нее поставить букву L, T или F то курсор переместится в начало строчки, название которой начинается с соответствующей буквы (пример:  для того чтобы переместить курсор в начало третьей строки, нужно написать команду HOME T )

пример кода для вывода информации на дисплей с использованием этих команд:

$regfile = “m8def.

dat”      'выбранный тип микроконтроллера
$crystal = 1000000          'частота работы 1 МГц

Config Lcd = 20 * 4         'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.

4,Rs=Portb.

5

Cursor Off                  'выключим отображение курсора
Cls                         'очистим дисплей

Lcd “*** HD44780  LCD ***”  'выводим текст в первой строке
Lowerline                   'переходим на вторую строку
Lcd “Line number 2”         'выводим текст
Thirdline                   'переходим на третью строку
Lcd “AaBbCcDdEeFfGgHfIiJj”  'выводим на третьей строке
Fourthline                  'переходим на четвертую строку
Lcd “1234567890”            'печатаем на четвертой строчке

End                         'конец программы

SHIFTLCD LEFT / RIGHT – сдвигает текст в строке на которой находится курсор на одну позицию влево или вправо. 

SHIFTCURSOR LEFT / RIGHT – сдвигает курсор на одну позицию влево или вправо 

и пример того как использовать сдвиг текста:

$regfile = “m8def.

dat”    'выбранный тип микроконтроллера
$crystal = 1000000        'частота работы 1 МГц

Dim A As Byte             'переменная для организации цикла

Config Lcd = 20 * 4       'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.

5

Cursor Off                'выключим отображение курсора
Cls                       'очистим дисплей

Locate 1 , 11             'устанавливаем курсор на первой строке, десятом знакоместе
Lcd “Bascom-AVR”          'выведем текст

'цикл сдвига влево
For A = 1 To 10           'повторяем этот цикл пока переменная А не достигнет значения 10
 Shiftlcd Left            'сдвинем текст влево
 Waitms 300               'задержка 300 миллисекунд
Next A                    'увеличиваем значение переменной А на 1

'цикл сдвига вправо
For A = 1 To 10           'повторяем цикл пока переменная А не достигнет значения 10
 Shiftlcd Right           'теперь сдвинем текст вправо
 Waitms 300               'задержка 300 миллисекунд
Next A                    'увеличиваем значение переменной А на 1

'продолжаем выполнение  программы
Wait 1                    'задержка 1 секунда

Home F                    'устанавливаем курсор на нижнюю строчку

Lcd “END PROGRAM”         'и выводим надпись

End                       'конец программы

результат на видео ниже:

Источник: http://AVRproject.ru/index/rabota_s_displeem_16x2_na_kontrollere_hd44780_v_bascom_avr/0-52

Обзор LCD-дисплея 1602A – RobotChip

Жидкокристаллический дисплей (Liquid Crystal Display) сокращенно LCD построен на технологии жидких кристаллов.

При проектировании электронные устройства, нам нужно недорогое устройство для отображения информации и второй не менее важный фактор наличии готовых библиотек для Arduino.

Из всех доступных LCD дисплеев на рынке, наиболее часто используемой является LCD 1602А, который может отображать ASCII символа в 2 строки (16 знаков в 1 строке) каждый символ в виде матрицы 5х7 пикселей. В этой статье рассмотрим основы подключения дисплея к Arduino.

Технические параметры 

Описание дисплея

LCD 1602A представляет собой электронный модуль основанный на драйвере HD44780 от Hitachi. LCD1602 имеет 16 контактов и может работать в 4-битном режиме (с использованием только 4 линии данных) или 8-битном режиме (с использованием всех 8 строк данных), так же можно использовать интерфейс I2C. В этой статье я расскажу о подключении в 4-битном режиме.

Назначение контактов:
  VSS:   «-» питание модуля
  VDD:  «+» питание модуля
  VO:    Вывод управления контрастом
  RS:     Выбор регистра
  RW:   Выбор режима записи или чтения (при подключении к земле, устанавливается режим записи)
  E:       Строб по спаду
  DB0-DB3: Биты интерфейса
  DB4-DB7: Биты интерфейса
  A:      «+» питание подсветки
  K:      «-»  питание подсветки

На лицевой части модуля располагается LCD дисплей и группа контактов.

На задней части модуля расположено два чипа в «капельном» исполнении (ST7066U и ST7065S) и электрическая обвязка, рисовать принципиальную схему не вижу смысла, только расскажу о резисторе R8 (100 Ом), который служит ограничительным резистором для светодиодной подсветки, так что можно подключить 5В напрямую к контакту A. Немного попозже напишу статью в которой расскажу как можно менять подсветку LCD дисплея с помощью ШИП и транзистора.

Подключение LCD 1602A к Arduino (4-битном режиме)

Необходимые детали:
  Arduino UNO R3 x 1 шт.
  LCD-дисплей 1602A (2×16, 5V, Синий) x 1 шт.
  Провод DuPont, 2,54 мм, 20 см, F-F (Female — Female) x 1 шт.
  Потенциометр 10 кОм x 1 шт.
  Разъем PLS-16 x 1 шт.
  Макетная плата MB-102 x 1 шт.
  Кабель USB 2.0 A-B x 1 шт.

Подключение:
Для подключения будем использовать макетную плату, схема и таблица подключение LCD1602a к Arduino в 4-битном режиме можно посмотреть на рисунке ниже.

Подключение дисплея к макетной плате будет осуществляться через штыревые контакты PLS-16 (их необходимо припаять к дисплею). Установим модуль дисплея в плату breadboard и подключим питание VDD (2-й контакт) к 5В (Arduino) и VSS (1-й контакт) к GND (Arduino), далее RS (4-й контакт) подключаем к цифровому контакту 8 (Arduino).

RW (5-й контакт) заземляем, подключив его к GND (Arduino), затем подключить вывод E  к контакту 8 (Arduino). Для 4-разрядного подключения необходимо четыре контакта (DB4 до DB7). Подключаем контакты DB4 (11-й контакт), DB5 (12-й контакт), DB6 (13-й контакт) и DB7 (14-й контакт) с цифровыми выводами Arduino 4, 5, 6 и 7.

Потенциометр 10K используется для регулировки контрастности дисплея, схема подключения LCD дисплея 1602а, показана ниже

Для этого эксперимента библиотека уже входит в среду разработки IDE Arduino и нет необходимости ее устанавливать. Скопируйте и вставьте этот пример кода в окно программы IDE Arduino и загрузите в контроллер.

Источник: http://blog.rchip.ru/obzor-lcd-displeya-1602a/

Ссылка на основную публикацию
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}