Подключение ЖК-дисплея

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

Так что пришлось мне написать к нему несколько классов, обеспечивающих вывод текста в формате 4 строки по 20 символов, и нарисовать символы для знакогенератора. Русскую кодовую страницу я кстати так и не сделал.

Итак, в качестве ЖК-дисплея я купил недорогой WG12232E-TML-NA. Меня он привлёк не только своей ценой, но и тем, что к нему в сети оказалось несложно найти всю необходимую документацию, чтобы его можно было не только подключить, но и написать программу для управления этим устройством.

Схема:

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

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

Код скетча можно скачать по этой ссылке.

Надо заметить, что в коде есть ошибка. Дело в том, что для генерации тактовых импульсов с частотой 2 КГц, подаваемых на вход CL, я использовал 8-разрядный таймер, а он с такой частотой работать на самом деле не может в принципе, для этого нужно было бы использовать 16-разрядный. Поэтому он подаёт импульсы с меньшей частотой (около 1 кГц). Тем не менее, почему-то работает и так, а почему, я не выяснял.

Дело в том, что если посмотреть на схему, то несложно заметить, что для подключения ЖК-дислея к Arduino оказались задействованы все его логические выводы. И поэтому например, чтобы перепрограммировать микроконтроллер, дисплей приходится каждый раз отключать. Поэтому я не стал развивать этот проект дальше, а сделал ЖК-модуль с TWI-интерфейсом на базе микроконтроллера ATmega32, у которого не 28 выводов, как у ATmega168 или ATmega328р, а 40 и соответственно портов ввода-вывода не три, а четыре.

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

Не говоря уже о том, что для генерации тактовой частоты используется 16-разрядный таймер, и подключив наушник к выводу CL можно послушать как микроконтроллер пищит с частотой 2 КГц. Кстати, именно решив из любопытства послушать этот сигнал, я и обнаружил, что у меня в этом месте ошибка.