LCD Nokia 3410

    Давно собирался рассказать об "удобном во всех отношениях средстве отображения информации", т.е. о LCD дисплее от Nokia3410. Это графический чёрно-белый ЖК дисплей, с разрешением 96х65 точек, имеет последовательный интерфейс SPI с максимальной скоростью обмена 4 мбит/с. Напряжение питания +2.7в...+3.6в, потребляемый ток меньше миллиампера. Есть возможность программного перевода в режим низкого энергопотребления (отключение).
     Непосредственно на стекле экрана находится управляющий контроллер. В сотовом телефоне экран помещается в пластмассовую рамку:
экран Nokia 3410

    Рамка не является обязательным элементом конструкции, экран работает и без неё :). Но пластмассу рамки можно использовать для крепления дисплея, например просверлив где удобно соответсвующие отверстия. Всё лишнее, естественно, надо будер обрезать, например так:

     На втором рисунке видна планка с контактами, красной точкой отмечен первый вывод. Чуть левее красной точки находится пластмассовый штырёк, который в телефоне используется для позиционирования разъёма. Для подсоединения проводов к контактам надо постараться сделать (найти) разъём, но в крайнем случае можно припаять проводки прямо к контактам. При этом нужно быть крайне осторожным дабы не перегреть контакты и не испортить стекло.

Интерфейс

    Для управления экраном требуется 5 линий. Обозначения выводов приведены в таблице:
ВыводНазваниеФункция
1VDDПитание +2.7...+3.3В
2SCLKСинхронизация
3 SDINДанные
4D/CРежим: данные(HIGH)/команда(LOW)
5SCEВыбор кристалла (LOW)
6GNDЗемля
7VOUTВнутреннее напряжение
8RESСброс (LOW)

    Между выводом 7 VOUT и землёй дожен быть подключен конденсатор ёмкостью 1..10 мкФ(керамика или электролит) - фильтр для внутреннего источника питания LCD. Сразу после подачи питания экран необходимо сбросить, подав на вывод RES "0". Это нужно сделать обязательно, иначе можно повредить контроллер!
    После сброса (перевод RES "0"->"1") контроллер готов к записи. Чтение из контроллера не предусмотрено. Применяется стандартный SPI протокол: на вывод SCE подаётся активный низкий уровень, и по линии SDIN вводятся биты данных. Защёлкивание бита осуществляется по переднему фронту SCLK, сдвиг по заднему, данные передаются старшим битом вперёд (MSB). Если во время передачи последнего бита из восьми на выводе D/C логическая "1", то запись производится в память данных, иначе в управляющие регистры.

Дисплей и память данных

    В контроллере реализована матрица памяти 102x??? бит (так и не сосчитал), но на экран выводится только 96х65 точек. Всё поле экрана поделено по вертикали на 8 строк по 8 пикселей каждая (всего 64 точки) плюс девятая строка, которой оставлен только 1 пиксель.
    Каждому столбцу (Xi) данной строки (Yj) соответствует 1 байт памяти, причем верхнему пикселю соответствует нулевой бит (LSB). Выбрав номер строки и столбца (см.ниже), передаём байт в память данных, и он отображается на экране столбиком 8х1. После записи байта автоматически увеличивается на единицу указатель адреса столбца или (строки), в зависимости от настройки (Function Set, бит H). Если снова отослать байт в память данных, то он отобразится в той-же строке (том-же столбце) но со сдвигом на 1 пиксель вправо (8 пикселей вниз). Если при записи достигнут конец строки y=yi; x=101 то происходит переход на следующую строчку y=yi+1; x=0. Аналогичное правило работает и для столбцов.
    Чтобы быть уверенным, что запись произойдёт в нужную область экрана, вышеуказанный автоматический перевод строк (столбцов) лучше не применять, а следить за позицией программно. В частности, это позволит писать программы, быстро перекомпилируемые для Nokia3310, у которого только 84х48 точек.

Регистры

    Для задания режима работы служат несколько управляющих регистров. Запись в них происходит при "0" на выводе D/C.

Команда D/C Байт (D7...D0) Описание
Write Data 1 dddd dddd запись данных в память дисплея
Function set 0 0010 0PVH управление питанием, способ ввода, выбор расширенных инструкций

    Первая команда - просто передача байта в память экрана, dddd dddd - просто байт данных. Команда Function Set изменяет 3 управляющих бита контроллера:
  • P - PowerDown; P=1 - кристалл включен; P=0 - кристалл в режиме низкого эн.потребления
  • V - адресация; V=1 - после записи байта увеличивается указатель адреса строк; V=0 - столбцов
  • Н - набор инструкций; H=0 - обычный; H=1 - расширенный
Набор инструкций для H=0:

Команда D/C Байт (D7...D0) Описание
Display Control 0 0000 1D0E режимы отображения
Set Y 0 0100 0YYY установить адрес строки
Set X 0 1XXX XXXX установить адрес столбца

    Команда Display Control включает следующие режимы отображения:
  • D=0, E=0 - дисплей пустой
  • D=1, E=0 - обычный режим ("0" - светлая точка, "1"-тёмная)
  • D=0, E=1 - все элементы включены
  • D=1, E=1 - режим инверсии ("1" - светлая точка, "0"-тёмная)
Набор инструкций для H=1:

Команда D/C Байт (D7...D0) Описание
Temperature Control 0 0000 01TT установить температурный коэффициент
Bias System 0 0001 0BBB выбрать систему питания
Set Vop 0 1VVV VVVV включить напряжение питания дисплея

    Значение и аргументы команд с H=1 объяснять долго и сложно, поэтому предлагаю воспользоваться чисто дилетанским приёмом. Ставьте: TT=00, BBB=011, VVVVVVV=100 1000, и всё будет! Тем, кто с таким подходом не согласен - читайте даташиты.
    Не приведённые выше коды команд являются резервированными и их использование недопустимо.

Инициализация

Следующий код на псевдо-С показывает алгоритм инициализации дисплея:
	bit_dc=0;
	bit_cs=1;
	bit_reset=0;    // сброс
	delay(500);     // в микросекундах
	bit_reset=1;        
	delay(500);

	bit_cs=0;
	bit_dc=0;           // запись в регистры
	Send_SPI(0x21);     // включить питание, расшир. команды
	Send_SPI(0x13);     // bias=3
	Send_SPI(0xC8);     // включить внутренний источник, Vop=0x48;
        
	Send_SPI(0x20);     // обычный набор инструкций
	Send_SPI(0x0c);     // нормальный режим отображения D=1 E=0
 	bit_cs=1;
	
	/* После сброса X=0 и Y=0, а в памяти - случайный мусор  */
	
	bit_cs=0;                         
	bit_dc=1;                         // запись в память экрана
	for(i=0;i<909;i++) Send_SPI(0);   // Очиска от случайного мусора.
 	bit_cs=1;
	
	// далее следует выбрать X и Y и можно начинать рисование ...
	

Заключение

Даташит на экран я так и не нашёл, но есть документация на кристалл PCD8544, который стоит в экранах от 3310. Разница в числе точек, и, вероятно, в расширенных командах, но в целом интерфейс очень похож. Если кто найдёт даташит к "родному" для 3410 кристаллу - прошу писать мне.