LCD от Nokia 1202/1203/1280

Подключение разных дисплейчиков
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

LCD от Nokia 1202/1203/1280

Сообщение Fai »

Недавно вспомнил, что у меня лежит коробка с обломками от сотовых, там обнаружились несколько дисплеев, в т.ч. черно-белых. Правда, на них я особо инфо не нашел, зато в процессе поиска выяснил, что у некоторых более-менее современных сотовых есть ч/б жк, на которые достаточно много информации, и стоят недорого - я взял вышеуказанный за 100р. Разрешение 96*68, подключается просто, информацию заливать тоже просто (жаль только нет своего знакогенератора, надо писать все самому ручками), ожидать готовности после команд/данных не нужно (т.е. работа на частоте шины - это около 4МГц), подсветка на 1 свд, значит можно резистором прямо на питание - красота. Вот на нем и решил поэкспериментировать. Схема подключения - SPI 3 ноги, сброс на +питания, питать от 3.3В (лучше от 2.7В). Цоколевка ео есть в интернете, да и (почти) все видно из печатной платы, поэтому тут не привожу. SPI, к сожалению, нестандартный - 9 бит, так как убрали ногу Data/Command и повесили ее функцию на 9-й бит. Поэтому пишем свою реализацию - с одной стороны, можно будет подключить почти к любому мк, с другой - маленькая скорость вывода, вся процедура примерно 100 тактов забирает.
Всю программу приводить особо смысла нет, но если надо - скину.

Код: Выделить всё

d_write	;				; around 100
	movwf	temp
	movlw	9
	movwf	temp1
d_wr0
	clrf	lcdcon
	btfss	status,c
	bcf	lcdcon,mosi
	btfsc	status,c
	bsf	lcdcon,mosi
;
	rlf	temp,f
	bsf	lcdcon,sck
	decfsz	temp1,f
	goto	d_wr0
;
	bsf	lcdcon,cs
	return
Бит с в status используется для хранения данные/команда. С него же легко выводить побитно сдвигом.
Вызывается как-то так: (заодно приведу что нужно для инициализации)

Код: Выделить всё

lcd_init
	bcf	status,c	; instr send
	movlw	0xe2	; reset
	call	d_write
;
	bcf	status,c	; instr send
	movlw	0x3d	; voltage multiplication
	call	d_write
;
	bcf	status,c	; instr send
	movlw	1		; x4
	call	d_write
;
	bcf	status,c	; instr send
	movlw	0x2f	; power control on
	call	d_write
;
	bcf	status,c	; instr send
	movlw	0xa4	; power save off
	call	d_write
;
	bcf	status,c	; instr send
	movlw	0xaf	; module on
	call	d_write
;
Изображение
Тут дисплей с помощью сделанной на скорую руку платы-переходника подключен к макетно-отладочной плате с 16f877а (она полностью засветилась в моей теме с измерителем емкости). Т.к. дисплей на 3.3В, нужно согласовать уровни - но лучше сделать это не как везде советуют с помощью делителя из 2-х резисторов, а немного лучше - резистором и диодом шотки на +питания дисплея. Так универсальнее, т.к. можно будет (если необходимо) и дисплей, и МК питать от 1 источника напряжения. Только есть в этом 1 нюанс - стабилизатор должен стабилизировать не только ток относительно общего (обычные кренки), но и относительно бОльшего напряжения питания, чем стабилизируемое, иначе диоды бесполезны и просто поднимут напряжение питания ЖК до 4.7В. У меня такого стабилизатора не было, поэтому можно поставить нагрузку на общий для создания тока, заведомо большего, чем суммарный втекающий от 3-х диодов. Тогда все будет работать, только потреблять больше необходимого.
Как уже говорил, собственного знакогенератора у этого ЖКД нет, поэтому написал много констант на первую половину ASCII. Выглядит неплохо, только занимает кучу места (6 байт на 1 символ). Вверху дисплея - это эксперимент с большим шрифтом, 24*16 пикселов (точнее 21*12, 1 сверху, 2 снизу и под 2 под бокам строки пикселов пустые для визуального пробела)
Если кому интересно, могу скинуть сюда константы.
Дисплей должен потреблять примерно 0.2 мА (если верить даташиту), а я как-то неудачно придумал питание с не отключаемым стабилизатором (хоть и можно переключать питание дисплея до или после стабилизатора) и точно измерить не могу.

В общем-то не такие уж они и страшные, эти графические жкд. Только вот для вывода чего-то посложнее обычного текста (5*7 + по 1 пикселу зазор справа и снизу, итого 6*8, как у модульных символьных дисплеев) придется постараться, так как многие дисплеи не позволяют считывать положение "курсора", т.е. работаю только на вход.
Если кто заинтересуется - пишите, расскажу про управление и инициализацию более подробно.
Последний раз редактировалось Fai 06 июл 2014, 11:32, всего редактировалось 2 раза.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: LCD от Nokia 1202/1203/1280

Сообщение rhf-admin »

Программу нужно, я давно хотел по этой теме статью написать, но дисплей для экспериментов не нашёл. Надо ещё раз в магазинах поискать.
С уважением, администрация сайта.
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

Re: LCD от Nokia 1202/1203/1280

Сообщение Fai »

Прикрепил в архиве .asm и печатку в .lay, если вдруг понадобится. В программе же немного изменил процедуру вывода - сделал ее линейной, без цикла. Места занимает больше, но выполняется за 80 тактов вместо 100. Старую часть просто закомментировал. Вывод символов думаю понятен - retlw константа в цикле, чуть позже напишу процедуру, которая принимает на вход код символа, и выводит его на текущее место.
По дисплею: контроллер STE2007, даташит легко находится, поэтому тут не привожу. Логическое утройство - байт данных выводится вертикально, начиная с левого верхнего угла, нулевой бит сверху, и так строкой до конца слева направо (но можно отразить по вертикали и горизонтали), потом следующая строка вниз с нулевого столбца и т.д. Таких блоков по горизонтали всего 8 по 1 байту в высоту и 1 в 4 младших бита в самом низу, старшие 4 бита игнорируются. Единица в данных соответствует включенной точке, но весь дисплей можно инвертировать. Координаты курсора задаются как номер блока (0-8) и номер столбца (0-95). Так же можно сдвигать весь дисплей вверх, применять различные логические операции для строк (еще не пробовал как это работает). При первом включении в оперативе дисплея мусор, а команды на очистку всего нет, поэтому придется очищать вручную.
Измерил ток потребления, как даташит и обещал, 200мкА, при 3.3В. При снижении напряжения до 2.5В плавно увеличивается до 350мкА. В выключенном состоянии пару мкА. Еще можно изменить частоту обновления дисплея (65-80Гц), может ток уменьшится. Так же, можно изменять программно контрастность и вводить термокомпенсацию. Подсветка достаточно освещает уже при 3мА.
LCD.7z
(11.3 КБ) 1321 скачивание
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

Re: LCD от Nokia 1202/1203/1280

Сообщение Fai »

Как и обещал, сегодня на работе написал процедуру для вывода символа в текущее место. Работает примерно так: так как внутри логического блока в 256 байт для retlw помещается только 32 символа (для кратности, так проще), надо входной код разбить на верхние 3 бита ( их будем складывать с PCH/pclath перед вызовом), и нижние 5 бит, которые потом умножим на 6, т.к. 6 байт на 1 символ. А дальше просто 6 раз вызвать отправку по 1 байту констант.
Заодно добавил 2 понятные процедуры для изменения страницы (page, 0-8) и столбца (column, 0-95).
Получилось как-то так:
Изображение
Вся программа в архиве.
lcd_main.7z
(3.07 КБ) 1135 скачиваний
Ах, да, поигрался с частотой обновления, напряжением умножителя и прочими напряжение-изменяющими командами. Точно работает контрастность, весьма плавно можно настраивать. При смене частоты обновления не происходит ничего, даже ток потребления не меняется. Попытка уменьшения опорного напряжения питания после умножителя тоже ни к чему не приводит, такое ощущение, что контроллер жестко привязан (мб контрольными точками или маской металлизации при окончательных процессах травления кристалла) к конкретному стеклу, благо он многофункционален. Ну да ладно, главное работает.

Еще возникли мысли подключить его к пк через usb-rs232 переходник (и через мк, естесственно), и сливать различную служебную инфу, типа загрузки процессора, температуры и т.д.
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

Re: LCD от Nokia 1202/1203/1280

Сообщение Fai »

Пока не дали очередное задание на работе, продолжаю мучить дисплей. Написал процедуру рисования графика 64*64 точки (значение переменной делится на 4). На первом рисунке - результат работы ранней версии (синус - набор констант retlw, сделанный в екзеле). Но точки плохо смотрятся, особенно на случайных графиках, поэтому дописал так, чтобы следующее значение рисовалось с линией от предыдущего. Получилось, как на рисунке 2. Как побочный эффект - возможность рисовать гистограмму типа как на рисунке 3.
Но рисовать графики по готовым точкам не интересно :) поэтому прорисовка была зациклена с опросом ацп и сдвигом всех значений влево после каждой прорисовки. Результат записи случайной помехи на рисунке 4. Так как время опроса, по сути определяется временем вывода на экран, получилось примерно 5 опросов в секунду (рисование всего графика это примерно 194мс). Тут и до осциллографа недалеко :) Делов-то, добавить триггер, и запись в память как событие триггера обнаружится. Потом медленно выводить на экран записанное в память, и т.д. Так и сделал: триггер ждет положительного перехода через 127, как такой переход обнаруживается - начинается запись до 64 точек, потом вывод, потом снова ожидание триггера. На 5 рисунке сигнал от тестового генератора 1кГц, на дисплее 250мкс/точка, на 6 - примерно та же самая помеха, только 1мс/точка, как видно, это стандартная помеха 50Гц.
Изображение Изображение
В принципе, можно увеличить частоту генератора мк с 4 до 20МГц, немного оптимизировать все, и получить около 20кГц частоту выборок, с внешним ацп с параллельным выходом можно до 100кГц довести, получится небольшой портативный осциллограф-пробник :)
Во вложении программа, реализующая осциллограф, часть простого зацикленного опроса ацп закомментирована, хотя в ней мало чего интересного.
lcd_main.7z
(4.77 КБ) 1078 скачиваний
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

Re: LCD от Nokia 1202/1203/1280

Сообщение Fai »

Тут вспомнил, что я тогда еще и с когда-то купленными ОЛЕД - дисплеями экспериментировал (0,96'', 128*64 точки), да забыл фотки результатов выложить, исправим:

Изображение

Оба имеют одинаковый контроллер - SSD1306, чаще всего разведен на I2C, белый имеет встроенный стабилизатор питания на 3.3В, что удобно, у сине-желтого был неправильно поставлен резистор на аппаратный сброс, из-за чего я имел много головной боли с нормальной инициализацией на неделю, пока не понял, в чем причина. Так что, если кто-то будет покупать, ищите такие белые дисплеи с синей платой, они разведены весьма качественно. К тому же белый живет дольше синего. Управляется дисплей легко, на контроллер есть даташит, там все расписано достаточно подробно. Практической применимости у него маловато ввиду его размера, зато ради освоения самое то - цена (была) рублей 200.

Так же пробовал вывод картинок и шрифтов, получилось примерно следующее:
Изображение Изображение

Дисплей с синей подсветкой это Nokia 2660/2760/6085, он маленький (на первых 2-х фотках масштаб примерно одинаков), имеет дурацкую синюю подсветку, к тому же там 2 диода послеовательно, то есть просто так от 5В с резистором ничего не выйдет, я поставил конденсаторный удвоитель для подсветки. Контроллер как у Nokia 1202/1203/1280. Имхо, практического применения практически нет.
Картинка конвертируется в массив констант программой BitmapToLCD, правда у нее выход для С, поэтому я написал программу в Lazarus для конвертации ее выхода в строки вида

Код: Выделить всё

	movlw	0xFF
	call	g_write
Программа принимает на вход цветное изображение, конвертирует его в ч/б с dithering или без, обрезает, в общем делает всю необходимую подготовку. Шрифты больших цифр для часов я делал в Paint, потом конвертировал в код.

Выкладывать код пока не буду, так как это все было ~10 месяцев назад, где что уже не помню, но если кому-то будет интересно - посмотрю, если я эти программы еще не переписал, экспериментируя над чем-либо еще.
Аватара пользователя
vintik
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 05 окт 2015, 22:43

Re: LCD от Nokia 1202/1203/1280

Сообщение vintik »

Приветствую всех на форуме.

Как раз сейчас занимаюсь с LCD от nokia 1280. Жаль, что не набрел на Ваш форум раньше, сэкономил бы много времени и нервов :)
Fai, спасибо Вам за информацию по ЖК дисплеям, - она очень полезна.
Использую МК PIC 16F1786 и делюсь своим вариантом передачи данных.

Код: Выделить всё

;---------------------------------------------------------------
ONE_BYTE_TX			; Передача одного байта.
	banksel	LATB		;
	bcf	CS		; Передача данных ON.
	banksel	LATA		;
	rrf	D_C_bit,w		; [0] - идентификатор команды.
	rlf	LATA,f		;
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	rlf	spi_buf,w	;
	movwf	LATA		; CLK_LO
	lslf	spi_buf,f	;
	bsf	LATA,1		; CLK_HI
	nop			;
	clrf	LATA		; CLK_LO
	nop			;
	bsf	CS		; Передача данных OFF.
	return			;
;---------------------------------------------------------------
Правда есть недостаток, R0 и RA1 работают на выход, остальные выводы порта должны работать на вход.
Аватара пользователя
vintik
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 05 окт 2015, 22:43

Re: LCD от Nokia 1202/1203/1280

Сообщение vintik »

Покрутил программку, вроде можно и на один порт навесить CS, DATA, и CLK. Правда, если использовать для высокого уровня CS,- подтягивающий резистор.
Вложения
пример.rar
вариант передачи одного байта по шине SPI (50 cycles)
(348 байт) 709 скачиваний
Аватара пользователя
vintik
Читатель
Читатель
Сообщения: 4
Зарегистрирован: 05 окт 2015, 22:43

Re: LCD от Nokia 1202/1203/1280

Сообщение vintik »

Ну и, логическим завершением вариант со схемой согласования уровней 5В->3В
Передача байта выполняется за 47 циклов. При частоте генератора МК 32МГц, частота тактирования получилась 2МГц.
Правда пришлось пожертвовать одним выходом порта, оставшиеся выходы могут работать только на вход.
Вложения
пример2.rar
(74.22 КБ) 734 скачивания
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

Re: LCD от Nokia 1202/1203/1280

Сообщение Fai »

Незачто :) Рад, что пригодилось.
У меня, в общем-то, сначала была похожая идея, передавать данные в порт подобным образом:

Код: Выделить всё

	bcf	status,c
	rlf	lcd_data,f
	rlf	lcd_port,f
При этом DATA у дисплея висит на ноге 0, остальные - на другом порте. Теоретически, все бы работало, но в итоге в моей отладочной плате было проще все на 1 порт повесить. Еще у меня есть пара мыслей, как задействовать аппаратный SPI, передавая сначала вручную бит D/C, или можно было бы UART в 9бит режиме попробовать...но пока нет времени на эксперименты, тем более мне пришла отладочная плата MSP-EXP430FR5739 8-)
Ответить