Внешний дисплей от Nokia2760

Давно уже лежит у меня данный дисплей, но до сих пор на него времени всё не хватало. А задача для него то уже придумана и только и ждет воплощения. И вот все прочие дела наконец были отброшены и результат не заставил себя долго ждать.

Сразу отвечу на вопрос: Даташита у меня НЕТ! Все работает и без него.


Характеристики

Как я уже писал, дисплей очень маленький и обладает следующими характеристиками:
  • Диагональ: 1 дюйм (20х16мм);
  • Разрешение заявленное: 96х68 пикселей (в телефоне заявлено 96х65 пикселей);
  • Размер: 24х24х3мм;
  • Глубина цвета: монохромный;
  • Подсветка: синяя (6-8В с резистором 47-300Ом);
  • Интерфейс: 3-х проводной SPI 9 бит;
  • Контроллер: ST7507 (Спасибо тов. WildCat);
  • Питание цифровой части: 1.8-3.3В;
  • Питание аналоговой части: 2.4-3.3В;
Не правда ли красавец? И по очень аппетитной цене.

Исходные данные

Очередной раз моя благодарность отправляется тов. Rossum’у, его поистине великий труд в изучении дисплеев очень помог.
Так же в данных одного из проектов был откопан моноширинный шрифт 5х7 который так же используется в дисплее от Nokia 3310.
Google же на этот раз дополнительной информации принес не много. Даташит так и не был найден. Жалко конечно, но зато есть возможность поковыряться самостоятельно.

Подключение

Распиновку дисплея можно узнать из Service Manual’а или же заглянув в проект NokiaSuperbreakout от Rossum’а:

UPD: Разъем такой же как у Nokia 6100 (распиновка не совпадает!), и ответная часть находиться так же.
К своей LPCXpresso я подключил к SPI выводам: SCLK-SCK, MOSI-MOSI, CS-SSEL, RESET-MISO (а почему бы и нет?). Питание на подсветку завел с отдельного преобразователя на MC34063. Хотя на отражение (без подсветки) всё видно наверное даже лучше.

Настраиваем SPI на 9 бит

Инициализация SPI для дисплеев у меня кочует из проекта в проект практически без изменений, а я никак её не помещу в библиотеку (других учу, а сам этого не делаю):
void SPI_init() {	// Раздел 13.2 UM10375
    LPC_SYSCON->PRESETCTRL &= ~(1<<0);
    LPC_SYSCON->PRESETCTRL |= (1<<0);
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<11);

    LPC_SSP->CPSR	=	0;	// отключим тактирование

    // Set P0.9 to SSP MOSI
    LPC_IOCON->PIO0_9	&= ~(7<<0);
    LPC_IOCON->PIO0_9	|= (1<<0);
    LPC_IOCON->PIO0_9	|= IOCON_COMMON_MODE_PULLUP;
    // Set 2.11 to SSP SCK (0.6 and 0.10 can also be used)
    LPC_IOCON->SCKLOC	= 1;
    LPC_IOCON->PIO2_11	&= ~(7<<0);
    LPC_IOCON->PIO2_11	|= (1<<0);
    LPC_IOCON->PIO2_11	|= IOCON_COMMON_MODE_PULLUP;
    // Set P0.2/SSEL to GPIO output and high
    LPC_IOCON->PIO0_2	&= ~(7<<0);
    LPC_IOCON->PIO0_2	|= (1<<0);
    LPC_IOCON->PIO0_2	|= IOCON_COMMON_MODE_PULLUP;
    LPC_GPIO0->DIR	|= 1<<2;
    LPC_GPIO0->DATA	|= 1<<2;

    LPC_SSP->CR0	=	( (8<<0)	// Размер данных 1000 - 9 бит
			 	| (0<<4)	// Формат фрейма 00 - SPI
			 	| (0<<6)	// Полярность 0 - низкий уровень м/у фрейм
			  	| (0<<7)	// Фаза 0 - по нарастанию
			  	| (8<<8)	// Делитель частоты шины на бит
			  	) ;

    LPC_SSP->CPSR =	2;	// пердделитель 2-254 (кратно 2)

    LPC_SSP->CR1	=	(1<<1);	// Разрешение работы 1 - разрешено
}

Эх, настроили на 9 бит и 4 МГц. Гм…, в теории должно быть FPS ~500. Что бы максимально приблизиться к этой цифре, передачу данных осуществляется в фоне:
void SPI_send(uint16_t value) {
    while ((LPC_SSP->SR & ((1<<1) | (1<<4))) != (1<<1)); 
    LPC_SSP->DR = value;
}

Подробнее что к чему было описано в уроке, не станем задерживаться на этом здесь.

Инициализация дисплея

SPI нам нужен для дисплея, а дисплей перед общением с ним лучше сбросить. Сброс простецкий, но из-за криворукости лишний раз переключим функцию вывода SSEL:
void LCD_reset(void) {
    // Настройка для вывода Reset дисплея
    LPC_IOCON->PIO0_8	&= ~(7<<0);	// сброс текущей функции порта ввода-вывода
    LPC_IOCON->PIO0_8	|= IOCON_COMMON_MODE_PULLUP;
    LPC_GPIO0->DIR	|= 1<<8;
    LPC_GPIO0->DATA	|= 1<<8;
    // Настройка для вывода Select
    LPC_IOCON->PIO0_2	&= ~(7<<0);	// Временно отключаем спецфункцию вывода выбора SPI
    delay_ms(100);
    // Сброс дисплея
    LPC_GPIO0->DATA	&= ~(1<<2);	// ncs = 0
    LPC_GPIO0->DATA	&= ~(1<<8);	// nrst = 0
    delay_ms(100);
    LPC_GPIO0->DATA	|= 1<<8;	// nrst = 1
    LPC_GPIO0->DATA	|= 1<<2;	// ncs = 1
    delay_ms(100);
    // Возврат спецфункции
    LPC_IOCON->PIO0_2	|= (1<<0);	// использовать как вывод SSEL
}

Добавляем сюда инициализацию из NokiaSuperbreakout и получаем следующее:
void LCD_init()
{
	SPI_init();
	LCD_reset();
	SPI_send(0xE2);
	delay_ms(10);
	SPI_send(0xAF);
	SPI_send(0xA4);
	SPI_send(0x2F);
	SPI_send(0xB0);
	SPI_send(0x10);
	SPI_send(0x00);
}

После этого спокойно можно последовательно выводить данные на дисплей, как это делается в оригинале.

Вывод текста на дисплей

Вывод идет, так же как и для 3310, построчно столбиками по 8 пикселей, младший бит выводится вверху. Разница только в том, что 2760 инверсный: 0 соответствует черной точке, 1 её отсутствию. Последняя 9-я строка получается неполноценная. От неё доступны только младшие 4 бита.
Ну а раз работает всё так же, то возьмем вывод текста от 3310 для этого дисплея:
#include "font5x8.h"
void LCD_DrawChar(char c) {
	int i;
	unsigned char *ptr = &font[5*(unsigned int)c];
	for(i = 0; i < 5; i++) {
		SPI_send(0x100|~ptr[i]);
	}
	SPI_send(0x1FF); // пробел
}

void LCD_DrawString(const char *c) {
	while(*c) LCD_DrawChar(*c++);
}

Теперь весь дисплей можно заполнить символами. Что тоже нам не очень интересно, мы ведь привыкли указывать другим, что им делать. Так что без установки позиции курсора никуда:
void LCD_SetPos(uint8_t x, uint8_t row) {
	if(row > 9) row = 0;
	if(x > 96) x = 0;
	SPI_send(0xB0|(row));	// Номер строки
	SPI_send(0x10|(x>>4));	// Старшие 4 бита номера столбца
	SPI_send(0x0F&(x));	// Младшие 4 бита номера столбца
}

Конечно, для моноширинного шрифта было бы лучше позиционировать по ширине символа, что впрочем делается простым умножением.
Вот теперь пожалуй всё готово, можно пользоваться:


Заключение

Дисплей оказался настолько простым в подключении, насколько и маленьким в размерах. При всём при этом он обладает довольно хорошим разрешением, что позволяет ему вместить большое количество информации (8 строк по 16 символов). Однако из-за этого мы получаем довольно мелкий текст (раза в 2 меньше 3310). Выход из этой ситуации естественно есть, достаточно просто взять шрифт крупнее.
Скорость вывода меня вполне устраивает, отклик дисплея в районе 0.2с (что по моему субъективному мнению быстрее, чем у 3310).
Потребление не замерял. Заявлено 0.5мА в активном режиме. Если для кого-то это принципиальный вопрос, то можете замерить сами.
Самая потребляющая часть – подсветка — может быть успешно отключена, на отражение видно прекрасно. Но её присутствие только в плюс дисплею в темное время.

В прикрепленном архиве отладочный проект. Вот несколько скринов его выполнения (2-х метровые файлы не поместили, так что только так):


Видео (качество не лучшее получилось).
  • +2
  • 27 сентября 2011, 09:43
  • angel5a
  • 2
Файлы в топике: nokia2760.zip, DSC03013.JPG

Комментарии (35)

RSS свернуть / развернуть
Провода просто припаяны к разъему кабеля дисплея?
0
  • avatar
  • tank
  • 27 сентября 2011, 10:23
Конкретно тут разъем отпаян и провода припаяны к шлейфу. Так разъем такой же как у 6100 (распиновка другая только). и ответная часть как и для 6100 может быть снята с шлейфа.
0
Спасибо за статью. У меня лежит штуки три таких. Дожидаются своего часа :)
0
А можно фотографию припаянных контактов? Интересно, насколько они паяемые.

Про даташит — у Nokia 1100 и 2100 тоже 96х65, можно предположить, что в этом стоит такой же драйвер — PCF8814.

И еще, можешь выложить сервис мануал?
0
С фотками, сервисмануалами и вопросами на недельку-другую прийдется подождать.
Я подпаисался мгтф0.07 — легко, зачистить его куда сложнее.
Инициализация у дисплеев одинаковая, на сколько я знаю.
0
Можно попорбовать покормить его теми командами, которые описаны в даташите к PCF8814 и применимы к 1100/2100. Наверняка сработает.
0
Я подпаисался мгтф0.07 — легко, зачистить его куда сложнее.
Легко зачищается одноразовым медицинским скальпелем с тонким лезвием: отрезок провода ложится на дощечку и перекатывается легким нажатием скальпеля на 1-2 оборота. Главное не слишком сильно нажимать, а то можно подрезать несколько жил.
0
Когда-то давным — давно(в 1975 — я тогда работал радиомонтажником) мы зачищали его с помощью обжигалки — нихромовой петли, накаливающейся докрасна (током с напряжением 6 В). Обжигался изумительно и чисто — только нужен воздухоотсос или нужно принять меры, чтобы не дышать дымом.
0
  • avatar
  • mzw
  • 29 сентября 2011, 10:21
to mzw: фосген вам во счастье!?(его фторопласт при нагреве выделяет)

мой вариант зачистки для МГТФ:
electro-hobby.ucoz.ru/index/0-23
0
Фосген как раз не выделяется, т.к. это хлорорганика, а хлора в фторопласте нет. Зато выделяется куча фторорганики, в том числе на порядок более токсичные соединения. Именно поэтому mzw уточнил, что необходимо вытяжное оборудование для удаления продуктов разложения фторопласта.
0
А это смотря какой фторопласт — они разные бывают. Например, PCTFE — Политрифторхлорэтилен.
0
Мы вроде говорим про МГТФ, а он вроде в PTFE.
0
А, точно, фторопласт-4 же и есть ПТФЭ.

(Политрифторхлорэтилен как диэлектрик применяется в технике сильных токов)
0
Вчера купил себе STM8S-Discovery. Первое что сделал (для удобства отладки) — подключил дисплей, но только от 3310. SPI реализовал программно, что позволяет подключить его туда, куда хочу)). Питание 3,3 в с платы. При портировании кода инициализации из старого проекта AVR, проблем не возникло никаких. Общее впечатление — влюбился в STM!
0
А что с картинкой, которая справа от картинки с распиновкой должна была показываться?
Странный у нее адрес адрес в коде: img src=«schematic.png»/ — без сайта, сразу файл.
0
  • avatar
  • juray
  • 10 октября 2011, 05:13
то есть там вот так: img src=«http: // schematic.png» — это я пробелы вставил, а то автоформатирование съело всю красоту этого линка.
0
Это из черновика заготовка была для картинки распиновки. Не удалил просто.
0
Спасибо за статью.
Нарисовал-отобразил АНГЕЛОЧКА!
Могу куда положить, если интересно.

пс.
Данные можно не инвертировать, а установить режим инверсии с дисплее. Потом залить $00 и рисунок цифры получатся синими на темном фоне…
Как то так, прикольно.
Спасибо.
0
тоже поигрался с этим дисплейчиком. Может кому интересно, в исходном материале не нашел
sendcmd(0xae); // disable display
sendcmd(0x90); // контраст 0x90 max, 0x9f min
sendcmd(0xC8); // mirror Y axis (about X axis)
sendcmd(0xA6); // «черным по белому»
sendcmd(0xA6); // «белым по черному»
sendcmd(0xA1); // зеркалит развертку по Х
0
  • avatar
  • S64
  • 23 ноября 2011, 22:03
Расскажите, как подключить подсветку
0
На LED+ LED- подаете порядка 7В (лучше с резюком) ток до 20мА. хоть кренку на понижение, хоть mc34063 ставь, хоть шим+ключ+дроссель.
0
Спасибо!!!
0
хорошо бы этот дисплейчик к avr прикрутить…
0
А ф чом сопстна проплема =)
0
Проблема тут в недостаточности для меня информации и незнании работы интерфейса spi. Как я понял используется 9-битный формат кадра. Старшим битом идет признак команды или данных а засоответственно код команды либо данных. Так вот на сколько мне известно spi у avr не будет работать в режиме 9 бит. Либо я чего-то недопонимаю??
0
Ну так если девяти битовый СПИАЙ интерфейс, то его можно софтверно реализовать. Можно первый бит софтом, а остальное HW SPI.
0
Или как тов lleeloo сказал, либо полностью софтверно, на Rossum's Posterouse есть spiBB функции под лпц и авр (смотрите в томике про диспы от мобилок, там давал линк). Либо гляньте протокол на 1202 вв нем тоже 9битный интерфейс. Так же была статья в сообществе по подключению по USART интерфейсу (синхронный режим 9 бит) для стм32, можете попробывать портировать на авр.
0
его еще можно І2С
0
каким это макаром? код в студию.
0
контролер уж очень похож на Ste2007, по крайней мере команды инициализации 100%,
если надо могу выложить и быдлокод =), здесь можно посмотреть про него чуть-чуть
alex-exe.ru/radio/microcontrollers/lcd-nokia2760/
0
Ни в указанной статье, ни в статье про 1100, на которую ссылается указанная, нет ни слова про I2C. Где вы видели что он может работать по I2C?
0
я не говорил что в статье про это написано, вы смотрели даташит на STE2007?
0
еще можно использовать модель в протеусе от нокиа 1100, я проверял работает и запускал дисплей 2760 руководствуясь приведенным даташитом
0
Было бы неплохо взглянуть на него, и на схему подключения.
0
не знаю как сюда что-то загрузить
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.