Как подключить экран Nokia 3110

Опубликовано: 27.10.2014 Автор: Александр

В этой записи хочу поделиться опытом и готовыми библиотеками для работы с графическим дисплеем от Nokia 3110 (5110) для подключения к микроконтроллерам STM32, а, в частности, к STM32F100. Однако, не составит труда переделать для работы с микроконтроллерами семейства STM32F4. Давайте для начала разберемся Как работает графический дисплей.

Nokia 3110 5110 STM32

Экран от Nokia 3110 представляет собой графический жидко-кристаллический дисплей с размером видимой части 84 на 48 точек. Управляется матрица контроллером PCD8544, даташит на него в конце статьи. Связь с контроллером осуществляется через последовательный интерфейс, что-то на подобии SPI.

Для управления дисплеем необходимо подключить следующие линии:

1) RST – Reset – линия сброса. Для сброса необходимо подать сюда 0. В рабочем режиме линия должна быть подтянута к Vcc.
2) CE – Chip Enable – линия выбора устройства на шине данных.  При передачи данных дисплею – опустить к общему (лог.0). В режиме ожидания – к Vcc.
3) DC – Data/Command – выбор типа данных – передача команды (лог.0) или информации в память дисплею (лог.1).
4) Din – Data in – линия данных.
5) Clk – Clock – линия для такта.
6) Vcc и Gnd – линии для питания.

Хочу обратить внимание, что дисплею и уровни на входе должны быть 3.3В, хотя встречаются и на 5В. Этот момент необходимо уточнять в каждом конкретном случае.

Итак, подключаем согласно этому к отладочной плате STM32F100: RST – PA0, CE – PA1, DC – PA2, Din – PA3, Clk – PA4.

Вся матрица экрана разделена на 6 строк (банков) и 84 столбца, т.е. получается 84 байта в ряду. Передача информации происходит побайтно. Передается вначале старший бит.

Nokia 3110 5110 адресация

А вот так выглядит адресация в памяти дисплея:

Nokia 3110 5110

И, конечно, контроллер поддерживает автоматическое смещения указателя адреса при непрерывной передачи данных. Есть два варианта: горизонтальное смещение и вертикальное. Будем использовать горизонтальное (в клеточках – номер байта при непрерывной передачи):

Nokia 3110 5110

Теперь перейдем к разбору как оживить дисплей. Я использовать буду CooCox IDE, но это не принципиально. Как обычно, для удобства, я сделал структуру, в которой указываются линии подключения дисплея, внешняя функция задержки и указатель на переменную, где хранится информация о точках на экране.

где m это матрица для хранения информации о точках экрана:

Для инициализации интерфейса необходимо вызвать N5110_Init() и передать указать на структуру:

Хочу обратить внимание, что все настройки портов и пинов выполнятся автоматически. При использовании других контроллеров (не F100), необходимо будет переделать эту функцию.

Ну и все, дисплей готов к работе. Опишу небольшое API моей библиотеки:

Стоит уделить внимание N5110_Refresh(). Эта функция перерисовывает экран по той информации, что содержится в переменной m. Поэтому, можно напрямую изменять ее и потом перерисовывать экран, так можно немного оптимизировать анимацию.

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

Файлы:
1) Проект в CooCox IDE Nokia 5110 LCD vs STM32
2) Даташит на контроллер дисплея PCD8544
3) Видео на YouTube Nokia 5110 LCD vs STM32

 

В рубриках: Как в технике, Электроника
Метки: ,
Поделиться записью:

13 Комментариев к “Как подключить экран Nokia 3110”

  1. Михаил:

    Хорошо Вам… У меня не работает… STM32F103C8T6. Что в проге изменить?
    Что такое green_on() ?

    • green_on(), green_off(), blue_on(), blue_off() эио функции для включения или выключения светодиодов на плате дискавери (там зеленый и синий они на портах С.8 и С.9).
      А что именно не работает? Как проявляется? Код компилируется?

      • Михаил:

        Спасибо за ответ. Дисплейчик зевёлся.
        Как в Вашем коде изменить пины подключения дисплея? Мне нужно так:
        #define LCD_PORT GPIOB
        #define LCD_DC_PIN GPIO_Pin_14
        #define LCD_CE_PIN GPIO_Pin_13
        #define LCD_RST_PIN GPIO_Pin_12
        #define LCD_SDIN_PIN GPIO_Pin_15
        #define LCD_SCLK_PIN GPIO_Pin_11

      • Михаил, смотрите в main.c, там есть структура LCD типа N5110_TypeDef, в ней задаются порт и пин для каждой линии. Нужно в коде примера поменять на это:
        N5110_TypeDef LCD = {
        {GPIOB, GPIO_Pin_12},
        {GPIOB, GPIO_Pin_13},
        {GPIOB, GPIO_Pin_14},
        {GPIOB, GPIO_Pin_15},
        {GPIOB, GPIO_Pin_11},
        Delay_US,
        &m
        };

        Это должно рабоать.

      • Михаил:

        Всё работает, спасибо.
        Функция N5110_WriteDec выводит только 3 цифры. Так и надо? А как вывести десятичное число?

      • Михаил:

        4 цифры. Но с десятичными надо разбираться…

  2. Віктор:

    Стаття дуже хороша і пізнавальна! Публікуйте побільше, будемо дуже вдячні.

  3. MyPublicWiFi:

    Далее захотел подключить дисплей от Нокии 3110 и выводить данные на него. Дисплей подключен и работает нормально, тестовые программы на нём выполняются. Но при попытке отразить на дисплее данные, получаемые от блока часов на экране отображаются символы псевдографии, а часов как таковых нет.

  4. Alojamiento:

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

    • Да, действительно такое есть у этих экранов. Но это практически у всех так. Рекомендуется использовать защитное стекло, чтобы защитить саму матрицу.

  5. Alex:

    Библиотека рабочая, благодарю! Но на двух разных индикаторах (один как ваш на видео, другой – с запараллелеными выводами на противоположных краях платы) функция N5110_WriteCharInv() работала странно – выводимый символ оказывался после последнего выведенного символа, а не в указанных координатах. Сделал эту функцию также, как и N5110_WriteChar(), только переставил местами вызовы N5110_ClearPixel() и N5110_DrawPixel() – стало нормально. Заодно и N5110_WriteStringInv() сделал.

  6. Классная статья

  7. Омад:

    Спасибо за библиотеку. Она и в правду рабочая… Работает без каких либо проблем… Спасибо….