Подключение дисплея от Nokia 1100. Часть 2.

Подключение дисплея от Nokia 1100. Часть 2.

Итак, контроллер PCF8814 позволяет выводить на экран 96 пикселей по горизонтали и 65 пикселей по вертикали. Отсчет начинается от верхнего левого угла.

Данные об изображении записываются побайтно во внутреннюю память (DDRAM) контроллера PCF8814. Адресация по горизонтали (X) идет попиксельно и изменяется от 0 до 95, а по вертикали (Y) задается номер банка, который изменяется от 0 до 8. Адреса вне этих диапазонов не допускаются. Всего есть 9 банков по 96 байт. В девятом банке используется только 1 пиксель. В зависимости от включенного режима значащим является либо старший бит передаваемого байта, либо младший.

Адресация памяти

Адресация памяти

Адресация памяти может работать в двух режимах — горизонтальном и вертикальном. В горизонтальном режиме при записи каждого байты в память счетчик X увеличивается на единицу. При достижении предела по горизонтали (95) он сбрасывается в 0, а счетчик Y увеличивается на единицу.

При вертикальном режиме адресации при каждой записи байта в память на единицу увеличивается счетчик Y, при достижении предела (8) он сбрасывается в 0, а горизонтальный счетчик увеличивается на единицу. Картинка, приведенная ниже, подробно описывают способы адресации.

Режимы адресации

Режимы адресации

Контроллер PCF8814 может подключаться к микроконтроллеру с помощью:

  1. SPI по трем линиям
  2. SPI по четырем линиям
  3. шины I2C
  4. последовательного 3-х проводного интерфейса

В дисплее от Nokia 1100 реализовано подключение по 4-проводному SPI. В принципе, это неплохо, так как хоть и не экономит выводы микроконтроллера, но немножко разгружает программу работы с дисплеем. При подключении используются сигналы:

  1. SCLK — линия тактирования
  2. SDA — линия передачи данных и команд
  3. CS — линия, определяющая передачу команды или данных
  4. RST — линия аппаратного сброса

Дисплей от Nokia 1100 позволяет только записывать данные в память (DDRAM) контроллера дисплея. Чтение из памяти не реализовано, хотя сам контроллер PCF8814 это позволяет. Поэтому, что бы определить, что у вас записано в памяти дисплея, необходимо в микроконтроллере организовывать буфер с данными для дисплея и отслеживать то, что записано, по нему.

В общем, настоятельно рекомендую ознакомиться с даташитом на контроллер PCF8814 (в материалах к статье). Там описано много нюансов и режимов работы с контроллером, приведена система команд и т.д.

Я долго искал библиотеку для работы с этим контроллером, но ничего путного и работающего сразу не нашел. Поэтому пришлось слепить свою библиотеку из найденных кусков, адаптировав под AVR-GCC. В итоге дисплей заработал практически сразу же:

Работа экрана Nokia 1100

Работа экрана Nokia 1100

На фотке выше показана работа демонстрационной программы работы с дисплеем. Сама программа никаких сложностей не представляет. Вся работа реализована в библиотеке.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

#include "nokia1100_lcd_lib.h"    // Подключаем драйвер LCD-контроллера NOKIA1100

char Text[] PROGMEM = "FLASH MEMORY TEST";

int main(void)
{
    nlcd_Init();
    _delay_ms(100);

    nlcd_GotoXY(0,0);
    nlcd_PrintF(Text); // Выводим строку из программной памяти

    _delay_ms(4000);

    nlcd_GotoXY(0,0);

    nlcd_PrintF(PSTR("  Hello, world! ")); // Другой способ задания строк в программной памяти
    nlcd_PrintF(PSTR("----------------"));
    nlcd_PrintF(PSTR(" DigitalChip.ru "));
    nlcd_PrintF(PSTR("    present     "));
    nlcd_PrintF(PSTR(" NOKIA 1100 LCD "));
    nlcd_PrintF(PSTR("  demonstration "));
    nlcd_PrintF(PSTR("----------------"));

    while(1)
    {

        nlcd_GotoXY(4,7);
        nlcd_Print("It work!"); // Строка из ОЗУ (RAM)
        _delay_ms(1000);

        nlcd_GotoXY(4,7);
        nlcd_PrintF(PSTR("        ")); // Строка из программной памяти (Flash)
        _delay_ms(1000);
    }

}

Библиотека позволяет выводить на экран только символы размером 5×8 пикселей. Зазор в 1 пиксель между символами добавляется автоматически. Поэтому, на экран можно вывести 8 строк по 16 символов. Работа с графикой в библиотеке не реализована (пока не возникало необходимости). В будущем, возможно напишу следующую версию библиотеки, в которой будут функции для работы с графикой. Но это в перспективе.

Особенность моей библиотеки в том, что линии управления дисплеем должны быть подключены к одному и тому же порту микроконтроллера, хоть и к любым пинам порта. В исходниках демонстрационного проекта — это PortC. Настройка библиотеки осуществляется в заголовочном файле nokia1100_lcd_lib.h. Укажите порт подключения управляющий линий и куда они подключены. Все прокомментировано, поэтому сложностей составить не должно.

Пример настройки библиотеки из демонстрационного проекта:

//******************************************************************************
// Настройка библиотеки

// Порт, к которому подключен LCD-контроллер NOKIA 1100
#define PORT_LCD PORTC
#define PIN_LCD  PINC
#define DDR_LCD  DDRC

// Номера выводов порта, к которым подключены выводы LCD-контроллера
#define SCLK_LCD_PIN    3
#define SDA_LCD_PIN     2
#define CS_LCD_PIN      1
#define RST_LCD_PIN     0

// Применять полный набор символов.
//#define FULL_CHARSET

В библиотеку входит файл nokia1100_lcd_font.h, в котором, как следует из названия, содержится шрифт. В нем реализована таблица ASCII с кодами символов от 30 до 127, т.е. специальные символы, цифры и латинский алфавит.

Если вы в своем проекте применяете кириллицу, то нужно раскомментировать дефайн FULL_CHARSET . Это включит в прошивку дополнительные символы шрифта с кириллицей, но и потребление памяти программ увеличится. Частично включенные символы от символа «А» до символа «п» соответствуют кодировке CP866, далее — несоответствие ниодной кодировке. Поэтому при работе с кириллицей следует уделить внимание кодировке символов кириллицы.

ASCII-таблица с кодировкой CP866

ASCII-таблица с кодировкой CP866

Вот прототипы реализованных в библиотеке функций:

void nlcd_Init(void);
void nlcd_Clear(void);
void nlcd_SendByte(char mode,unsigned char c);
void nlcd_Putc(char c);
void nlcd_Print(char * message);
void nlcd_PrintF(char * message);
void nlcd_GotoXY(char x,char y);
void nlcd_Inverse(unsigned char mode);

Из названий функций, я думаю, понятно что они делают.

На этом, пожалуй все. Если есть вопросы, буду рад ответить в комментариях к посту.

Ну, и напоследок небольшое видео с демонстрацией работы.

YouTube video

Дополнительные ссылки

Вливайтесь в обсуждение

  85 комментариев

Добавить комментарий

Отправляя комментарий, вы автоматически принимаете правила комментирования на сайте.

Правила комментирования на сайте:

  1. Не следует писать исключительно заглавными буквами. Это дурной тон.
  2. Запрещены комментарии не относящиеся к тематике сайта и самой статье.
  3. Запрещены реплики оскорбляющие других участников проекта. Давайте будем взаимовежливы.
  4. Запрещены нецензурные слова, идиоматические выражения, призывы к межнациональной и межконфессиональной розни.
  5. Запрещено обсуждение наркотических веществ и способов их применения.
  6. Запрещены комментарии с призывами к нарушению действующего законодательства РФ (Уголовного и Административного кодекса).
  7. Запрещены ссылки на сторонние ресурсы без согласования с владельцем сайта.
  8. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова.

Следует учитывать следующее - все комментарии проверяются на предмет отсутствия спама. При обнаружении признаков спама, в оставленном Вами комментарии, сам комментарий будет незамедлительно удален, а Ваш IP-адрес будет добавлен в черный список без предупреждения!

Учетные записи пользователей, рассылающих спам, блокируются/удаляются без права последующего восстановления.