Найти в Дзене
miti-mti

протокол LSD1602. разбор до нолей и едениц. Arduino в помощь

фото LSD1602
фото LSD1602

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

схема подключения LCD1602 по 4-х битной шине
схема подключения LCD1602 по 4-х битной шине

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

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

осцилограма 4х битной шины
осцилограма 4х битной шины

можно заметить что 8битные опирации разделились на два такта, тоесть нам нужно байт разделить на младший и старший потом отправить старший с одним тактом, а потом отправить младший со вторым тактом

а что отправлять можно увидеть в таблице из даташита

страница из даташита
страница из даташита

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

и так, ковыряя даташит в итоге я наклепал по байтовую программу для инициализации дисплея 1602

по байтовая инициализация дисплея
по байтовая инициализация дисплея

давайте разберём что вы там увидили))) по сути я просто отправляю байт в порт D, и так как нам при этом ещё нужно тактировать контакт E и указывать контактом RS команда это или данные то мы просто дублируем байт но уже с нолём в 3тьем разряде, на картинке можно отследить как это происходит. далее я решил упростить програму и немного её перестроил для лучшего восприятия скажем так.

инициализация масивом
инициализация масивом

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

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

и так по сути нам остаётся лишь заполнить массив и на дисплее и мы увидим надпись "hello, world" и всё же парочка но!! нам нужно помнить что при отправке команды пин RS должен быть на нуле, а вот когда мы отправляем уже данные для отображения на нужно чтобы на пине RS была еденица

написали букву H
написали букву H

на картинке можно заметить что во всех байтах присуцтвует еденица на втором разряде куда у нас и подключён пин RS

покапавшись дальше можно и вовсе написать на дисплее "hello, world" без библиотеки и программа эта будет занимать более чем в два раза меньше места в микроконтроллере нежели с помощью библиотеки.

-9

очень долго ковырясь в интернете, мне удалось написать код весом в 720 байт в отличае от стандартной билиотеки LiquidCrystal где код весит уже 1878 байт. но с некими ограничениями, такими как дисплей нужно подключать обязательно к пинам которые относятся с одному порту, в моём случае это PORTD и одно огромное ограничение это то что можно выводить только текст, нечего более. впринцепе я и не собирался писать библиотеку заново, а всего лишь хотел разобраться в протоколе и написать на дисплее "hello, world" занимая намного меньше памяти.

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

у кого получится меньше, покажите, интересно))