В одной из своих разработок мне потребовалось использовать небольшой монохромный графический LCD экран для вывода информации. Технической информации по нему, кроме распиновки, в интернете найти не удалось, зато вариантов графической библиотеки для дисплея от Nokia 3310 обнаружилось минимум варианта три. На мое счастье эти дисплеи оказались очень похожими.
Краткое описание LCD Siemens C55/A55/A52
В дисплее стоит контроллер PCF8812, или очень на него похожий. Максимальное разрешение для контроллера - 102 х 65 точек. Разрешение LCD Siemens C55 - 101 х 64 точки. В дисплее они используются совершенно непонятным для меня образом: вместо 102 точек отображаются только 101, а один столбец просто не использован (но при адресации памяти контроллера всё-равно существует), что при программировании вызывает некоторые ньюансы. Отстутствие одной строки не так критично и на удобстве программирования не сказывается.
При использовании дисплея следует учесть одну тонкость, оговоренную в даташите на контроллер мелким шрифтом: сигнал сброса должен быть активизирован _ДО_ подачи питания, либо не позже, чем 1 мкс после. То есть, сначала обнуляем RST, а потом подаем VDD!
Физический интерфейс у дисплея проблем не вызывает: классический SPI, работающий только на ввод. Инициализация и вывод информации (когда уже знаешь, как оно должно быть!) тоже просты до безобразия. Картинка четко видна без подсветки. По сравнению с Nokia 3310 - точки мельче, зато их число несколько больше.
Железо
Дисплей подключается к Arduino по следующей схеме:
Если верить даташиту на PCF8812 допустимо использование питания 5V. К выводам 7 и 6 дисплея подключается конденсатор емкостью 4.7 мкФ.
Софт
Для работы дисплея подключаем библиотеку U8glib v1.15. Она отличается от стандартной:
- внесены изменения в инициализацию дисплея.
- добавлен русский язык 5x7.
Для подключения используем директиву #include, а для настройки необходимо раскоментировать строку с нашим дисплеем. В данном случае U8GLIB_PCF8812. Чтобы использовать русский шрифт вставляем строку u8g.setFont(u8g_font_my5x7rus). Внутри имеются примеры. Вот один из них:
#include "U8glib.h"
U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
u8g.print("Hello World!");}
void setup(void) {
}
void loop(void) {
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
delay(500);
}
Оригинальная версия библиотеки u8glib_arduino_v1.16
|