Подключение LCD NOKIA 3310 к MSP430F2274
Я всегда очень радуюсь присланным статьям. Это значит, что есть люди, которые готовы делиться знаниями и опытом с народом. В этот раз статья от эмбедд-брата Kortez. Огромное спасибо ему! —BSVi
Сие повествование о том как подключить LCD экран от NOKIA 3410/3310 к микроконтроллерам серии MSP430, а в частности к MSP430f2274 (на целевой плате из набора EZ430-RF2500).
Знакомство с микроконтроллерами, как и у всех, у меня началось с «подмигивания» светодиодом. Это очень быстро надоело и я начал искать более информативные девайсы для представления информации. Под руку подвернулась моя старая палёная нокия. Немного погуглив, выяснилось, что не один я хотел использовать экран от этого телефона, но готового проекта для моего МК я не нашёл. Да и интересно было самому разобраться, как работают с дисплеями и шрифтами на самом низком уровне.
Основные плюсы.
-
Питание 3.3 вольта. Такое же как и на микроконтроллере, что избавляет от преобразования напряжения.
-
Миниатюрность. Экран не требует практически никакой обвязки кроме одного конденсатора, который регулирует контраст.
-
Интерфейс обмены с МК — SPI. Даже если у МК нет SPI, его можно без проблем реализовать программно.
-
Доступность документации. Контроллер дисплея используется PCD8544. разрешение матрицы 48х84 пикселя.
-
Скорость интерфейса SPI по документации составляет 4 мегабита, но на практике мне удавалось работать и на скоростях почти в три раза быстрее номинала. (ай-яй-яй —BSVi)
Подробно рассмотрим распиновку дисплея.
VDD |
Питающее напряжение 2.7 – 3.3 вольта |
SCK |
Тактовый сигнал SPI |
SDIN |
Линия данных SPI |
D/C |
Этот пин выбирает устанавливает – является передаваемый байт командой или данными. 1 – данные, 0 – команда. |
SCE |
Чип селект. При нуле на SCE — чип дисплея принимает данные с входящей линии, при единице – находится в состоянии высокого импеданса, то есть отключён от линии.(сигнал ноль-активен) |
GND |
Земля |
VOUT |
Отвечает за контраст, по умолчанию должен быть подключён к земле через конденсатор 4.7uF |
RES |
Сигнал сброса внутренних регистров контроллера экрана и видеопамяти. Данный сигнал ноль-активен |
Немного теории о том, как организована работа контроллера этого экрана. Весь экран разбит на банки – горизонтальные полосы толщиной в 8 бит и длинной в ширину экрана (48px). Всё время производится непрерывный вывод информации из видеопамяти непосредственно на матрицу: вывод по умолчанию “прямой” (единица в видеопамяти соответствует чёрному пикселю). Меняя байты видеопамяти экрана, вы меняете и само изображение. Для вывода информации в общем случае необходимо установить курсор в нужный банк и в нужную позицию по иксу. Делается это следующим образом:
-
Выставляем на лини D/C ноль (режим команд)
-
передаём по SPI байт с командой. 0х40+номер банка (0…5)
-
передаём по SPI байт с командой. 0х80+иксовая координата (0…83)
-
выставляем на лини D/C единицу (режим вывода изображения)
-
передаём по SPI байт с частью изображения который сразу же отображается на экране
-
указатель автоматически смещается на единицу вправо, если Х=83 то переходит на Х=0 следующего банка, а если и БАНК = 5 то переходит на БАНК0 Х0.
Примечание. Движение курсора и расположение банков можно настраивать.
Главное — хорошо начать работу с дисплеем – то есть его правильно инициализировать. Приведу функцию инициализации из своего кода.
Всех вышеописанных манипуляций должно хватить для использования экрана практически в любых целях.
Минусы.
-
Отсутствие подсветки, которую, при желании, можно самому сделать. (ага, я делал для TIC120 — еще то развлечение —BSVi)
-
Нет возможности совершать какие-либо логические операции с данными поступающими на вывод по SPI и данными уже хранящимися в видеопамяти. Как следствие не возможности управлять каждым пикселем. Для этого необходимо хранить в памяти МК видеопамять экрана, выполнять с ней разные логические операции а потом синхронизировать её с видеопамятью экрана.
-
В верхней части экрана, где расположен контроллер, была наклейка, которая отвалилась. После этого у экрана начались глюки, как оказалось при прямом попадании солнечных лучей на контроллер он перестает работать. Вот и фотка – тому доказательство
В библиотеке находится шрифт, в котором присутствуют также русские буквы и ДОСовская псевдографика.
Библиотека для работы с LCD. При написании библиотеки неоценимую помощь в написании предоставил всезнающий BSVi! Выкладываю архив с уже готовым рабочим иаровским проектом, в котором используется моя библиотека.
Документация по контроллеру экрана
С удовольствием попытаюсь ответить на возникшие вопросы 🙂
Правда ли, что при инициализации дисплея нужно учитывать особенность подачи сигнала сброса? То есть, в течение 100 милисекунд (максимум) после включения питания обязательно замкнуть RESET на ноль? Можно ли сначала замкнуть на ноль RESET, а потом подать питание?
Или нужно «зажать» RESET на ноль до включения питания, а потом после подачи питания ещё 100 миллисекунд «деражать» на нуле?
Да, в идеале необходимо после подачи питания выдержать RESET в нуле 100ms, что бы сбросить в начальные состояния внутренние регистры контролера экрана. Можно опускать RESET на ноль как до так и после.
Добрый день.
А с экранчиками от NOKIA 1100 никто дела не имел.
А то мои попытки подключить его к MSP430F2013 успехами пока не увенчались и я в печали по этому поводу.
Примеры для пика и СМТ8 в сети есть, а вод для MSPшек нету совсем ничего.
Такого экрана не было. По характеристика очень похож на 3310. Контроллер в 1100 дисплее используется PCF8814, документация в инете присутствует. Вот ссылка на PDF: https://mylcd.sourceforge.net/files/pcf8814.pdf
Доброго времени суток.
Решил тоже поиграться с экранчиком от нокиа написал вот такой код:
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1=8;
DCOCTL=96;
UCA0CTL1 |= UCSWRST; // ????? USART
UCA0CTL0 |= UCSYNC + UCMSB + UCMST + UCCKPH;
UCA0CTL1 |= UCSSEL_2; // spi ??????????? ?? SMCLK
UCA0BR0 = 1; // 16Mhz/4 = 4Mbit
UCA0BR1 = 0x00;
UCA0MCTL = 0;
P1SEL = BIT1 + BIT2 + BIT4;
P1SEL2 = BIT1 + BIT2 + BIT4;
P1OUT=0;
UCA0CTL1 &= ~UCSWRST; // ?????? USART
IE2 = UCA0TXIE;
__bis_SR_register(GIE); // ????????? ????? ??????????? ?????????? ??????????
P2OUT=BIT0;
while(i<10)
{
i++;
//spitx(txb);
ekran();//IE2 |= UCA0TXIE;
if (i==10) {i=1;};
}
return 0;
}
он должен выводить букву "п".
контролер исправно посылает данные. проверил тактирование и передачу данных подключив диод на соотвествующую ногу. экран молчит. экран правда китайский. не у кого нет никаких соображений по этому поводу?
да контролер G2553
да забыл написать функцию ekran
#include «io430.h»
int i;
void ekran(void)
{
P2OUT=BIT0;UCA0TXBUF=0x44;
UCA0TXBUF=0x89;
P2OUT=BIT3+BIT0;UCA0TXBUF=0x8;
UCA0TXBUF=0x1;
UCA0TXBUF=0x1;
UCA0TXBUF=0x1;
UCA0TXBUF=0x8;
}