У безымянного LCD 16x2 снизу шестнадцать ножек, и в первый раз я поступил логично, как мне тогда казалось: нашёл пины данных и воткнул все восемь в цифровые выводы Uno с нулевого по седьмой, а оставшиеся распихал по интуиции. Экран не подал ни единого признака жизни — даже квадратов не было. Оказалось, я угадал примерно половину, а с 4-битным режимом не угадал вовсе: из шестнадцати ножек реально работают четыре силовых и шесть сигнальных, остальное — запасные линии данных, которые в классической схеме вообще не подключают. Урок о том, как я собрал эту схему во второй раз — уже с даташитом в руках.
Разложим всё по полочкам: кто есть кто на этой гребёнке, зачем нужны RS и E, почему RW вечно прижат к земле и откуда берётся контраст. Отдельно поговорим о порядке монтажа — он экономит больше времени, чем любой скетч. К концу урока вы соберёте схему, которая повторяет официальный пример HelloWorld из Arduino IDE, и проверите её тестовым скетчем: по фразе на каждую половину экрана, плюс счётчик секунд как маркер живого цикла.
Шестнадцать ножек: кто есть кто
Ножки на модуле идут слева направо в строгом порядке: VSS, VDD, V0, RS, RW, E, D0–D7, A, K. Первые три — питание и контраст, последние две — подсветка. Средняя компания — управление: RS выбирает регистр, E стробирует обмен, восемь линий D0–D7 несут данные. Нумерация с единицы прямо на плате — не перепутайте с нумерацией пинов Arduino, они не связаны ничем, кроме проводов. И ещё одна ловушка: модули продаются и с 14, и с 16 выводами — последние два как раз подсветка, и её отсутствие иногда путают с мёртвым экраном.
Данные можно возить байтами или половинками. В 8-битном режиме байт уходит целиком по D0–D7 — плюс управляющие, итого десять сигнальных проводов. В 4-битном байт режется на две тетрады: старшая, потом младшая, обе едут по D4–D7. Контроллер не замечает этой двойной работы: обмен всё равно быстрее, чем глаз успевает моргнуть. Экономия в четыре провода и занятых пина платы перевешивает, поэтому библиотеки десятилетиями живут в 4-битном режиме, а D0–D3 остаются висеть в воздухе. Плата при этом освобождает целых четыре пина — по меркам Uno это роскошь.
Как это выглядит на уровне линий: RS низкий — по шине идёт команда, RS высокий — символ для отрисовки. По фронту импульса на E контроллер считывает тетраду с D4–D7. Линия RW задаёт направление: чтение или запись. Дисплею читать у нас нечего — мы не опрашиваем его состояние, — поэтому RW садят на землю намертво, и шина становится линией только записи. Внутренности этого протокола мы уже разбирали в уроке что внутри символьного дисплея, там же про адреса строк.
| Вывод LCD | Куда подключить на Uno | Назначение |
|---|---|---|
| 1. VSS | GND | земля |
| 2. VDD | 5V | питание логики |
| 3. V0 | движок потенциометра 10 кОм | контраст |
| 4. RS | пин 12 | команда или символ |
| 5. RW | GND | только запись, всегда |
| 6. E | пин 11 | строб обмена |
| 7–10. D0–D3 | не подключаются | не нужны в 4-битном режиме |
| 11–14. D4–D7 | пины 5, 4, 3, 2 | данные, две тетрады на байт |
| 15–16. A, K | 5V и GND | питание подсветки |
Контраст — единственная настройка, которой нет ни в одном скетче. Вывод V0 — это вход физического напряжения: подведите к нему движок потенциометра на 10 кОм, собранного делителем между 5V и GND, и крутите, пока буквы не станут чёткими. Выкрученный не туда потенциометр даёт два диагноза: пустой экран или сплошная заливка — и оба мимикрируют под поломку. Поэтому первое включение я делаю ещё до всякого кода: подал питание, покрутил движок, убедился в квадратах — железо живо. Подсветка обычно уже разведена перемычкой на модуле, но если вашей плате нужен внешний резистор на линию A, я ставлю 220 Ом; если подсветка светит неровно или модуль заметно греется — беру 330. Цветовую маркировку таких резисторов мы разбирали в уроке про резисторы и их код.
Откуда взялась связка пинов 12, 11, 5, 4, 3, 2? Это не требование железа — конструктор LiquidCrystal принимает любые свободные цифровые выводы в порядке RS, E, D4, D5, D6, D7. Просто официальный пример HelloWorld из состава IDE использует именно их, поэтому почти каждая схема в интернете повторяет эту раскладку. Я сознательно придерживаюсь канона: когда через год открываешь чужой или свой старый проект, совпадение с типовой схемой экономит минут пять на сверке. Классическому варианту подключения посвящён и урок LiquidCrystal без I2C: классика по 4 проводам — он смотрит на ту же схему со стороны кода.
Единственное жёсткое правило: не трогайте пины 0 и 1. Они заведены на аппаратный UART, и если дисплей сядет на них, Serial-монитор перестанет работать, а прошивка начнёт сбоить от подключённой периферии. Мы начинали работу с Serial-монитором именно на этих пинах — отдать их дисплею значит потерять главный отладочный канал. То же правило касается пинов 10–13, если в планах есть SD-карта или дисплей на SPI — но это уже забота будущих проектов. Позже, когда вы доберётесь до millis вместо delay, свободные пины пригодятся ещё и для датчиков — экономьте их заранее.
Тестовый скетч: дышат ли обе строки
#include <LiquidCrystal.h> // RS -> 12, E -> 11, D4 -> 5, D5 -> 4, D6 -> 3, D7 -> 2LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Provodka: OK"); lcd.setCursor(0, 1); lcd.print("Stroka 2: OK");} void loop() { // пусто: текст уже нарисован и держится сам}Про сам монтаж — то, что не видно ни в одном скетче. Я собираю в два захода: сначала силовая часть — земля, питание, делитель контраста — и проверяю экран ещё до включения в Uno: должны проступить квадраты. Потом шесть сигнальных, каждый провод веду от вывода дисплея к пину платы не разрывая взгляд, и только потом вставляю USB. Макетка с парными рядами прощает почти всё, но не перепутанные линии — если сомневаетесь, идите по таблице сверху вниз, отмечая смонтированное карандашом. Десять ножек, десять отметок — и схема собрана без единой сверки задним числом.
Отдельная благодарность джампер-проводам: старые провода с разбитыми контактами подводят в самый неподходящий момент. У меня правило: дисплейные линии — только свежие провода с целыми ножками. Обрыв в тетраде данных даёт ровно тот симптом с половиной экрана, который мы разбирали в note выше, и охота за ним отнимает вечер.
Скетч намеренно печатает по одной фразе в каждой строке и больше ничего не делает. Если обе фразы видны — схема жива целиком: и питание, и контраст, и все шесть сигнальных линий. Если видна только первая — под подозрением тетрады данных: старшая половина байта прошла, младшая потерялась, значит, ищите обрыв на D4–D7. Если не видно ничего, хотя питание и квадраты были — вернитесь к RS и E.
В симуляторе провода не перепутаешь, зато можно отработать сам ритуал диагностики: сначала запускаем тест двух строк, потом вешаем счётчик секунд, который подтверждает, что loop крутится, а не завис на инициализации. Такой же приём — «оживляж» в углу экрана — я потом ставлю во все приборы: с ним сразу видно разницу между зависшей платой и просто молчащим датчиком.
И про Serial-часть: секунды печатаются парами t=число, чтобы лог читался и глазами, и графиком. Если в вашей сборке первая строка живая, а вторая не обновляется, — вернитесь к таблице распиновки: шесть сигнальных линий, шесть проводов, один из них обязательно потерялся.
- 1. Сколько сигнальных проводов занимает LCD 16x2 в 4-битном режиме?
- 2. Куда подключают линию RW при классическом подключении дисплея?
- 3. Что задаёт вывод V0?
- 4. В каком порядке конструктор LiquidCrystal принимает номера пинов?
- 5. Вся первая строка залита квадратами, вторая пустая, контраст крутили. Первое действие?
- Шестнадцать ножек LCD: VSS/VDD/V0 — питание и контраст, RS/RW/E — управление, D0–D7 — данные, A/K — подсветка
- 4-битный режим: байт едет двумя тетрадами по D4–D7, итого шесть сигнальных проводов; D0–D3 остаются свободными
- RW сажают на землю навсегда: дисплей только записывает, читать из него нечего
- Контраст — потенциометр 10 кОм на V0: пустой экран или заливка почти всегда лечится отвёрткой, а не кодом
- Каноническая раскладка LiquidCrystal(12, 11, 5, 4, 3, 2) — из официального примера; пины 0 и 1 не трогать: там аппаратный UART
- Тест схемы — по фразе в каждой строке; залита первая строка целиком — проверять RS, E и тетрады данных
Частые вопросы по теме урока
- Сколько сигнальных проводов занимает LCD 16x2 в 4-битном режиме?
- RS, E и четыре линии данных D4–D7. Линия RW прижата к земле и проводом не считается, D0–D3 не подключаются вовсе. Шесть
- Куда подключают линию RW при классическом подключении дисплея?
- Дисплей работает только на запись, поэтому RW садят на GND намертво. Если оставить её в воздухе, уровень будет плавать и команды станут непредсказуемыми. На землю
- Что задаёт вывод V0?
- V0 — аналоговый вход контраста: на него подают напряжение с движка потенциометра 10 кОм между 5V и землёй. Никакой код его не заменяет. Контраст
- В каком порядке конструктор LiquidCrystal принимает номера пинов?
- Сначала два управляющих провода, потом четыре линии данных в порядке возрастания. В примере LiquidCrystal(12, 11, 5, 4, 3, 2) RS — 12-й пин, E — 11-й. RS, E, D4, D5, D6, D7
- Вся первая строка залита квадратами, вторая пустая, контраст крутили. Первое действие?
- Залитая строка — питание есть, инициализация не прошла: контроллер не получил стартовую последовательность. Ищите обрыв или перепутанные сигнальные линии. Проверить цепь RS и E и порядок подключения D4–D7