по факту написанно более чем дофига библиотек для этого дисплея. и всёже меня всегда интересовало что на самом деле отправляется на дисплей при инициализации или при рисовке символа. для этого я решил перевести даташит для более простого восприятия и разобраться при помощи Arduino. я собрал достаточно простую схему на микроконтролере atmega328 и дисплея LSD1602 соеденил их по 4-х битному интерфейсу. и дабы чтобы было ещё проще разобраться, все пины подключены к одному порту микроконтроллера, это в будущем очень сильно снизит вес общей программы.
и так для начала нужно взглянуть в даташит переведённый мною
взглянем в осцилограмму, так как в ней нам нужно подчеркнуть очень важную вещь.
можно заметить что 8битные опирации разделились на два такта, тоесть нам нужно байт разделить на младший и старший потом отправить старший с одним тактом, а потом отправить младший со вторым тактом
а что отправлять можно увидеть в таблице из даташита
мы видим что после включения дисплей ждёт когда ему придёт команда (function set) на выбор ширины данных 8бит или 4 бита. потом так же следущая команда но уже исключительно 4х битная как бы подтверждает что мы будем общаться с ним по 4х битной шине. с одной лишь разницей что вторым тактом мы отправляем настроики дисплею. почему идёт повторение команды я незнаю, если кто знает напишите в коменты будет интересно узнать.
и так, ковыряя даташит в итоге я наклепал по байтовую программу для инициализации дисплея 1602
давайте разберём что вы там увидили))) по сути я просто отправляю байт в порт D, и так как нам при этом ещё нужно тактировать контакт E и указывать контактом RS команда это или данные то мы просто дублируем байт но уже с нолём в 3тьем разряде, на картинке можно отследить как это происходит. далее я решил упростить програму и немного её перестроил для лучшего восприятия скажем так.
но масив всёравно слишком большой да и непонятно где тактовый байт а где нет, так что стоит тактовые байты убрать и просто при каждой отправке дёргать пин E.
и так по сути нам остаётся лишь заполнить массив и на дисплее и мы увидим надпись "hello, world" и всё же парочка но!! нам нужно помнить что при отправке команды пин RS должен быть на нуле, а вот когда мы отправляем уже данные для отображения на нужно чтобы на пине RS была еденица
на картинке можно заметить что во всех байтах присуцтвует еденица на втором разряде куда у нас и подключён пин RS
покапавшись дальше можно и вовсе написать на дисплее "hello, world" без библиотеки и программа эта будет занимать более чем в два раза меньше места в микроконтроллере нежели с помощью библиотеки.
очень долго ковырясь в интернете, мне удалось написать код весом в 720 байт в отличае от стандартной билиотеки LiquidCrystal где код весит уже 1878 байт. но с некими ограничениями, такими как дисплей нужно подключать обязательно к пинам которые относятся с одному порту, в моём случае это PORTD и одно огромное ограничение это то что можно выводить только текст, нечего более. впринцепе я и не собирался писать библиотеку заново, а всего лишь хотел разобраться в протоколе и написать на дисплее "hello, world" занимая намного меньше памяти.
спасибо что дочитали до конца, если вы это зделали значит я надеюсь было интересно то как я потратил сутки своего времени ради интереса))
у кого получится меньше, покажите, интересно))