02.03.2012
Подключение дисплея от 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);

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

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

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

[stextbox id=»info» caption=»Дополнительные ссылки»] Подключение дисплея Nokia 1100. Часть 1.[/stextbox]

[stextbox id=»download» defcaption=»true» collapsing=»false» collapsed=»false» mode=»css»]NOKIA1100_demo.c
nokia1100_lcd_lib.h
nokia1100_lcd_lib.c
nokia1100_lcd_fnt.h

Прошивка демо-проекта — откомпилированный проект

Даташит на контроллер PCF8814
Таблица ASCII и дополнительные кодировки
Программа генерации шрифтов 5×8
[/stextbox]

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

  83 комментария

  • Владимир

    4 года назад

    Всё! Проблема решена. Решение нашёл тут: http://aonijospot11.appspot.com/majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=654&sid=54718f8cbbd8364efe505a2416bee957
    Цитата:
    Разобрался я с той проблемой. Пришлось залезть в исходники VirtualWire и посмотреть что к чему.
    Короче, библиотека устанавливает типы выводов для RX(приёма) и PTT(push-to-talk), даже если мне нужно только отправлять данные и PTT у меня не используется. А заданные по-умолчанию они совпадают с используемыми для ethernet-шилда, вот они и конфликтовали.

    В итоге вместо:
    Код:
    vw_set_tx_pin(PIN_RF);
    vw_setup(2000);

    Поставил для инициализации:
    Код:
    vw_set_tx_pin(PIN_RF);
    vw_set_rx_pin(A1); // не используемый выход
    vw_set_ptt_pin(A2); // не используемый выход
    vw_setup(2000);

  • Рамиль

    4 года назад

    в функции «nlcd_SendByte()» в цикле for стоит делай на 3 миллисекунды. Это по мне очень много! На видео видно как долго обновляется текст на дисплее. Это получается при отправке каждого бита мы теряем 3 миллисекунды. Подключал дисплей от нокиа 1100 к STM32F215 там растота ядра 120МГц, вот при такой частоте приходилось использовать делай на 1 микросекунд на каждый бит. Когда использовал контроллер с частотой 4МГц, попробовал убрать всякие задержки — отлично работает! Очень быстро всё работает.

  • Таки я не очень понял — дисплей 1110 будет работать с библиотекой 1100?

  • Владимир Мешков

    4 года назад

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

    In file included from sketch_mar05m.ino:5:0:
    sketch_mar05m:39: error: invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]
    In file included from sketch_mar05m.ino:7:0:
    C:\Users\WORK\Documents\Arduino\libraries\lib1100/nokia1100_lcd_lib.h:65:6: error: initializing argument 1 of ‘void nlcd_PrintF(unsigned char*)’ [-fpermissive]
    void nlcd_PrintF(unsigned char * message);
    ^
    variable ‘Text’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

    и подсвечивает вот эту строчку
    char Text[] PROGMEM = «FLASH MEMORY TEST»;

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

  • Владимир

    4 года назад

    Привет. Прицепил дисплей 1100 к ардуине, Atmel Studio ругается вот так:

    Compiling ‘Sketch6’ for ‘Arduino Nano w/ ATmega328’
    nokia1100_lcd_lib.c:In function ‘nlcd_Clear’
    nokia1100_lcd_lib.c:65:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
    nokia1100_lcd_lib.c:use option -std=c99 or -std=gnu99 to compile your code
    nokia1100_lcd_lib.c:In function ‘nlcd_SendByte’
    nokia1100_lcd_lib.c:87:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
    nokia1100_lcd_lib.c:In function ‘nlcd_Putc’
    nokia1100_lcd_lib.c:107:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
    Error compiling

    Программист из меня никакой, подскажите что делать.

  • Здравствуйте. Поменял с PORTC на PORTD, дисплей ничего не отображает. Ноги контроллера PD0-PD3. Не пойму что не так.

    #define PORT_LCD PORTD
    #define PIN_LCD PIND
    #define DDR_LCD DDRD

    //
    #define SCLK_LCD_PIN 3
    #define SDA_LCD_PIN 2
    #define CS_LCD_PIN 1
    #define RST_LCD_PIN 0

  • Включил Nok6510 отображает сдвинуто и без контраста совсем(еле видно в свете фонаря). Контроллер pcf8814. Подключил по вашей схеме:управление через 4к7, vdd и vddi -3v3, вывод vout через конденсатор 1mkf в землю,увеличение емкости не влияет, отсутствие емкости делает отдельные пиксели символов более контрастнее, а остальные совсем становятся невидимыми.
    Как выкрутить контраст? Ещё не могу понять верно ли выбрано питание, т.к. там одно, в другом месте другое.

  • Автор, мне на другом сайте ответили. Контрастность регулируется регистром Vop(смотреть таблицу в доке на pcf8814). Я взял ваш пример+CVAR библиотеку. В библиотеке, думается, косяки с задержками, и в функции вывода, задержки большие, заменил delay_ms(3) на delay_US,работает. Vop было 0x20 , стало 0x22, без подсветки на lcd nok6510 все видно.

  • Евгений

    1 год назад

    Я один такой тупой или где взять данную библиотеку то (avr / io.h)???
    Везде говорится о ней, но негде её скачать. Пииииз ПАМАГИТЕ!!

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

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

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

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

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

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