Подключение LCD NOKIA 3310 к MSP430F2274

Опубликовано в рубрике "Исходники", 17 сентября, 2010.

Я всегда очень радуюсь присланным статьям. Это значит, что есть люди, которые готовы делиться знаниями и опытом с народом. В этот раз статья от эмбедд-брата Kortez. Огромное спасибо ему! —BSVi

Сие повествование о том как подключить LCD экран от NOKIA 3410/3310 к микроконтроллерам серии MSP430, а в частности к MSP430f2274 (на целевой плате из набора EZ430-RF2500).

 nokia3310

Знакомство с микроконтроллерами, как и у всех, у меня началось с «подмигивания» светодиодом. Это очень быстро надоело и я начал искать более информативные девайсы для представления информации. Под руку подвернулась моя старая палёная нокия. Немного погуглив, выяснилось, что не один я хотел использовать экран от этого телефона, но готового проекта для моего МК я не нашёл. Да и интересно было самому разобраться, как работают с дисплеями и шрифтами на самом низком уровне.

Основные плюсы.

  1. Питание 3.3 вольта. Такое же как и на микроконтроллере, что избавляет от преобразования напряжения.
  2. Миниатюрность. Экран не требует практически никакой обвязки кроме одного конденсатора, который регулирует контраст.
  3. Интерфейс обмены с МК — SPI. Даже если у МК нет SPI, его можно без проблем реализовать программно.
  4. Доступность документации. Контроллер дисплея используется PCD8544. разрешение матрицы 48х84 пикселя.
  5. Скорость интерфейса SPI по документации составляет 4 мегабита, но на практике мне удавалось работать и на скоростях почти в три раза быстрее номинала. (ай-яй-яй —BSVi)

     

display

 

Подробно рассмотрим распиновку дисплея.

VDD

Питающее напряжение 2.7 – 3.3 вольта

SCK
(в документации SCLK)

Тактовый сигнал SPI

SDIN

Линия данных SPI

D/C

Этот пин выбирает устанавливает – является передаваемый байт командой или данными. 1 – данные, 0 – команда.

SCE

Чип селект. При нуле на SCE — чип дисплея принимает данные с входящей линии, при единице – находится в состоянии высокого импеданса, то есть отключён от линии.(сигнал ноль-активен)

GND

Земля

VOUT

Отвечает за контраст, по умолчанию должен быть подключён к земле через конденсатор 4.7uF

RES

Сигнал сброса внутренних регистров контроллера экрана и видеопамяти. Данный сигнал ноль-активен

 

Немного теории о том, как организована работа контроллера этого экрана. Весь экран разбит на банки – горизонтальные полосы толщиной в 8 бит и длинной в ширину экрана (48px). Всё время производится непрерывный вывод информации из видеопамяти непосредственно на матрицу: вывод по умолчанию “прямой” (единица в видеопамяти соответствует чёрному пикселю). Меняя байты видеопамяти экрана, вы меняете и само изображение. Для вывода информации в общем случае необходимо установить курсор в нужный банк и в нужную позицию по иксу. Делается это следующим образом:

  1. Выставляем на лини D/C ноль (режим команд)
  2. передаём по SPI байт с командой. 0х40+номер банка (0…5)
  3. передаём по SPI байт с командой. 0х80+иксовая координата (0…83)
  4. выставляем на лини D/C единицу (режим вывода изображения)
  5. передаём по SPI байт с частью изображения который сразу же отображается на экране
  6. указатель автоматически смещается на единицу вправо, если Х=83 то переходит на Х=0 следующего банка, а если и БАНК = 5 то переходит на БАНК0 Х0.

Примечание. Движение курсора и расположение банков можно настраивать.

clip_image002

 

Главное — хорошо начать работу с дисплеем – то есть его правильно инициализировать. Приведу функцию инициализации из своего кода.

1void LcdInit (void)
2{
3 P2OUT &= ~(LCD_nRES + LCD_nSCE + LCD_Dc);
4 P2DIR |= LCD_nRES + LCD_nSCE + LCD_Dc;
5 P2OUT |= LCD_nRES;
6
7 // включение экрана и обычного набора инструкций
8 LcdSendCom(LCD_FUNCTION_SET);
9
10 // включение обычного режима отображения D=1 E=0 (0x0C)
11 LcdSendCom(LCD_DISPLAY_CONTROL + LCD_MODE_1);
12
13 // функция очистки экрана, так как после инициализации
14 // в видеопамяти будет случайный мусор
15 LcdClearMemory();
16}


Всех вышеописанных манипуляций должно хватить для использования экрана практически в любых целях.

Минусы.

  1. Отсутствие подсветки, которую, при желании, можно самому сделать. (ага, я делал для TIC120  — еще то развлечение —BSVi)
  2. Нет возможности совершать какие-либо логические операции с данными поступающими на вывод по SPI и данными уже хранящимися в видеопамяти. Как следствие не возможности управлять каждым пикселем. Для этого необходимо хранить в памяти МК видеопамять экрана, выполнять с ней разные логические операции а потом синхронизировать её с видеопамятью экрана.
  3. В верхней части экрана, где расположен контроллер, была наклейка, которая отвалилась. После этого у экрана начались глюки, как оказалось при прямом попадании солнечных лучей на контроллер он перестает работать. Вот и фотка – тому доказательство

В библиотеке находится шрифт, в котором присутствуют также русские буквы и ДОСовская псевдографика.

Библиотека для работы с LCD. При написании библиотеки неоценимую помощь в написании предоставил всезнающий BSVi! Выкладываю архив с уже готовым рабочим иаровским проектом, в котором используется моя библиотека.


Документация по контроллеру экрана


С удовольствием попытаюсь ответить на возникшие вопросы :-)




Комментарии
  1. webkirov написал(а) 21 сентября, 2010 в 1:15

    Правда ли, что при инициализации дисплея нужно учитывать особенность подачи сигнала сброса? То есть, в течение 100 милисекунд (максимум) после включения питания обязательно замкнуть RESET на ноль? Можно ли сначала замкнуть на ноль RESET, а потом подать питание?

    webkirov Reply:

    Или нужно «зажать» RESET на ноль до включения питания, а потом после подачи питания ещё 100 миллисекунд «деражать» на нуле?

    Kortez Reply:

    Да, в идеале необходимо после подачи питания выдержать RESET в нуле 100ms, что бы сбросить в начальные состояния внутренние регистры контролера экрана. Можно опускать RESET на ноль как до так и после.

  2. teslen написал(а) 13 июня, 2011 в 2:02

    Добрый день.
    А с экранчиками от NOKIA 1100 никто дела не имел.
    А то мои попытки подключить его к MSP430F2013 успехами пока не увенчались и я в печали по этому поводу.
    Примеры для пика и СМТ8 в сети есть, а вод для MSPшек нету совсем ничего.

    Kortez Reply:

    Такого экрана не было. По характеристика очень похож на 3310. Контроллер в 1100 дисплее используется PCF8814, документация в инете присутствует. Вот ссылка на PDF: http://mylcd.sourceforge.net/files/pcf8814.pdf

  3. qase написал(а) 11 октября, 2012 в 13:13

    Доброго времени суток.
    Решил тоже поиграться с экранчиком от нокиа написал вот такой код:
    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

    qase Reply:

    да забыл написать функцию 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;

    }

Создать новую ветку комментариев


Вы должны войти или зарегистрироваться чтобы оставить комментарий.