Подключение дисплея на базе контроллера PCD8544 к микроконтроллеру AVR


Автор: Погребняк Дмитрий

Самара, 2014.


О дисплеях



Популярные в своё время сотовые телефоны фирмы Nokia, такие модели, как 3210 3310 3315 3330 3350 3410 5110 5120 5130 5160 6150 6210, обладали монохромными графическими дисплеями, с экраном 84x48 точек, на базе контроллера PCD8544.


Модуль с дисплеем Nokia 5110
Модуль с дисплеем Nokia 5110

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


Сейчас на ebay можно за порядка 100 рублей (вместе с доставкой) купить такой дисплей, установленный на печатную плату 45х45мм, которая также обеспечивает подсветку.



О подключении таких дисплеев, на базе контроллера PCD8544, и пойдёт речь ниже.


О контроллере


Контроллер PCD8544 разработан фирмой PHILIPS. Документацию на него можно скачать здесь


Одной из особенностей этого контроллера является то, что информация может быть только выведена на дисплей, но не считана с него. В частности, это накладывает два ограничения:

- Нет возможности узнать состояние дисплея, в т.ч. и вообще факт его присутствия программными средствами. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой.

- Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений.


В то же время, контроллер обеспечивает крайне низкое энергопотребление: менее 300мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1.5мкА в режиме отключения.


Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется.


Сам же контроллер работает при напряжении 2,7 – 3,3 Вольта.


Подключение


Подключение модуля дисплея на базе PCD8544
Подключение модуля дисплея на базе PCD8544


Как упоминалось выше, контроллер работает на напряжении 2,7 – 3,3 Вольта. Это значит что сопряжённый микроконтроллер должен либо работать на том же напряжении, либо же как-то согласовать уровни на выводах, например, при помощи делителей.


Кроме «земли» и «питания», к контроллеру дисплея должны идти 5 линий:

* SCLK - тактовый импульс для передачи данных.

* SDIN - передаваемые данные.

* D/C̅ - выбор типа передаваемых данных: высокий уровень - графические данные, низкий - инструкция.

* S̅C̅E̅ - выбор чипа. Передача данных осуществляется при низком уровне на этой линии. При высоком уровне данные игнорируются.

* R̅E̅S̅ - сброс. При низком уровне происходит аппаратный сброс контроллера.


Поскольку, согласно спецификации (см п.8.1) аппаратный сброс является необходимым для инициализации дисплея, линия R̅E̅S̅ также должна быть подключена.


В принципе, линия S̅C̅E̅ может быть притянута постоянно к земле, но в этом случае, если по какой либо причине контроллер дисплея потерял синхронизацию с МК, это никак не удастся обнаружить. При подключении к МК, рекомендую притягивать эту линию к высокому уровню подтягивающим резистором 100-500кОм, чтобы исключить реакцию контроллера на помехи, пока МК находится в состоянии сброса.


Обратная сторона модуля
Обратная сторона модуля

Передача осуществляется по протоколу SPI, но только в одном направлении. При работе с микроконтроллерами AVR, удобно использовать UART в режиме SPI-master, когда включен только передатчик. Режим SPI-3 (CPHA=1, CPOL=1). Это значит, что пока обмен отсутствует, на линии SCLK должен присутствовать высокий уровень, а чтение данных с линии SDIN контроллер осуществляет по нарастающему фронту на линии SCLK в течение 100нс. При этом они должны быть выставлены минимум за 100 нс до нарастания фронта. Передача осуществляется по 8 бит, сначала старший.


Уровень на линии D/C̅ определяет, как трактовать полученные данные. Высокий уровень означает, что переданные данные должны быть выведены на дисплей, низкий уровень – что передана команда. Контроллер читает значение на этой линии вместе с последним (младшим) битом каждого переданного байта данных. При использовании асинхронной аппаратной передачи с этим могут возникнуть трудности. Перед установкой уровня необходимо дождаться завершения передачи предыдущего байта.


Максимальная частота, на которой может осуществляться обмен с PCD8544 – 4 МГц. При программном формировании импульсов это, обычно не является проблемой, но при использовании аппаратной передачи, в случае если частота работы МК превышает 8МГц, следует ограничить максимальную скорость передачи.


Кроме линий передачи данных, на модуле с дисплеем обычно присутствует вход управления подсветкой, соединённый с катодом светодиодов. Аноды же через ограничивающие резисторы подключены к линии питания. Для постоянно работающей подсветки можно данный вход подключить напрямую, или через резистор к «земле». Для управления от МК подсветка может быть подключена через транзистор. Поскольку подсветка потребляет менее 20мА, при подключении к МК AVR возможно также подключать её напрямую к выводу МК.


Пример кода взаимодействия с дисплеем

#include <avr/io.h>

#define PCD8544_SCK (1 << 0)
#define PCD8544_DI (1 << 1)
#define PCD8544_DC (1 << 2)
#define PCD8544_SCE (1 << 3)
#define PCD8544_RES (1 << 4)

void pcd8544_send_byte(uint8_t data) {
  PORTD &= ~PCD8544_SCE; // Низкий уровень на линии SCE
  for (uint8_t i = 0; i < 8; i++) {
    PORTD &= ~PCD8544_SCK; // Низкий уровень на линии SCK
    if (data & 0x80) {
      PORTD |= PCD8544_DI; // Передача 1
    } else {
      PORTD &= ~PCD8544_DI; // Передача 0
    }
    data <<= 1;
    PORTD |= PCD8544_SCK; // Высокий уровень на линии SCK
  }
  PORTD |= PCD8544_SCE; // Высокий уровень на линии SCE
}

void display_data(uint8_t data) {
  PORTD |= PCD8544_DC; // Высокий уровень на линии DC: данные
  pcd8544_send_byte(data);
}

void display_cmd(uint8_t data) {
  PORTD &= ~PCD8544_DC; // Низкий уровень на линии DC: инструкция
  pcd8544_send_byte(data);
}

Команды контроллера


См. раздел 8 спецификации

Команды передаются контроллеру дисплея, когда на линии D/C̅ низкий уровень.

Контроллер работает с двумя наборами команд: обычным и расширенным.


Команда 00100PVH присутствует в обоих наборах команд. Значение бита H определяет какой набор команд будет использоваться: 0 – обычный, 1 – расширенный. Установленный бит P означает режим отключения (power-down). V – выбирает режим адресации: 1 – вертикальная, 0 – горизонтальная.


Обычный набор команд


Обычный набор команд выбирается после передачи 00100PV0 (см. выше)

В нём присутствуют команды:


Команда 00001D0E - выбирает режим работы дисплея. E – признак инверсии изображения. D – признак вывода изображения. Если D = 0, дисплей либо полностью очищен (E = 0), либо полностью чёрный (E = 1)


Команда 01000yyy, или 0x40 + y - выбор номера строки (страницы) на которую выводится изображение. Где y = 0 – самая верхняя строка, 5 – самая нижняя. Строка имеет высоту 8 пикслей.


Команда 1xxxxxxx, или 0x80 + x - выбор горизонтальной позиции в текущей строке, куда будет выводиться изображение. Где x = 0 – самая левая позиции, 83 – самая правая.


Расширенный набор команд


Расширенный набор команд выбирается после передачи 00100PV1 (см. выше)

В нём присутствуют команды:


Команда 000001tt, или 0x04 + t - выбор одного из четырёх режимов температурной коррекции. В зависимости от режима будет по-разному изменяться напряжение дисплея в зависимости от температуры.


Команда 00010bbb, или 0x10 + b - выбор одного из восьми режимов расчёта смещения уровней для управления LCD. Для обычных дисплеев от Nokia рекомендуется режим 00010011, или 0x13


Команда 1vvvvvvv, или 0x80 + v - выбор напряжения на генераторе повышенного напряжения для LCD. При v = 0 генератор отключен. Выходное напряжение рассчитывается по формуле (см. спецификацию п.8.9):

VLCD = 3.06 В + v * 0.06 В

В зависимости от выбора способа коррекции напряжения, это значение изменяется в зависимости от температуры. Чтобы не повредить дисплей при низких температурах, рекомендуется чтобы это значение не превышало 8.5 Вольт, т.е. v <= 90.

Для обычных дисплеев Nokia это нормальное рабочее значение этого параметра примерно равно 56, т.е. команда принимает вид 10111000, или 0xB8.


Инициализация дисплея


Инициализация должна быть выполнена в течении 30мс после появления питания.


Дисплей инициализируется следующей последовательностью:

1. Выполнить аппаратный сброс, установив на линии R̅E̅S̅ низкий уровень минимум на 100нс;

2. Включить дисплей и выбрать расширенный набор команд, послав 0x21;

3. Установить схему смещения напряжения, команда 0x13;

4. Установить режим температурной коррекции, команда 0x04;

5. Включить генератор повышенного напряжения на уровне 6.42 Вольта, команда 0xB8;

6. Вернуться в стандартный набор команд, послав 0x20;

7. Включить вывод графической информации на дисплей командой 0x0C.


После этой последовательности дисплей готов к работе.


Пример кода инициализации

void display_init() {
  PORTD &= ~PCD8544_RES; // Низкий уровень на линии RES
  PORTD |= PCD8544_RES;  // Высокий уровень на линии RES

  display_cmd(0x21);	// расширенный набор команд
  display_cmd(0x80 + 56);	// напряжение смещения
  
  display_cmd(0x04);	// Режим температурной коррекции 0
  display_cmd(0x13);	// схема смещения 1:48
  display_cmd(0x20);	
  display_cmd(0x0c);	// Нормальное отображение
}

Вывод графической информации


Дисплей имеет размер 84х48 пикселей. Информация выводится вертикальными блоками высотой 8 пикселей, значения которых определяются значениями бит в выводимом байте. Младший бит кодирует верхний пиксель.

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


Команды 01000yyy и 1xxxxxxx определяют координаты курсора - строку и позицию, в которых будет отображены следующие 8 бит данных. После того как байт выведен, курсор смещается на соседнюю позицию.

Если командой 00100PVH выбран горизонтальный режим адресации (V = 0), то курсор смещается вправо и следующий байт данных будет отображён на соседней позиции справа. Когда достигнут правый край экрана, курсор перемещается на начало следующей строки. Если же выбрана вертикальная адресация (V = 1), то курсор смещается вниз, на следующую строку, а после последней строки курсор смещается на одну горизонтальную позицию вправо и устанавливается на верхнюю строку.


Пример кода

// Выбирает страницу и горизонтальную позицию для вывода
void display_setpos(uint8_t page, uint8_t x) {
  display_cmd(0x40 | (page & 7));
  display_cmd(0x80 | x);
}

/* Очищает экран, устанавливает курсор в левый верхний угол */
void display_clear() {
  display_setpos(0, 0);
  for (uint8_t y = 0; y < 6; y++) {
    for (uint8_t x = 0; x < 84; x++) {
      display_data(0);
    }    
  }
  display_setpos(0, 0);
}

Исходный код прошивки для AtmelStudio 6

Исходный код прошивки для микроконтроллера ATmega8A доступен для скачивания здесь: zip-файл, 150 кБ.


Помещённый здесь код, а также шрифты являются свободными. То есть, допускается их свободное использование для любых целей, включая коммерческие, при условии указания ссылки на автора (Погребняк Дмитрий, http://aterlux.ru/).





0 ms; mod: Sat, 12 Aug 2017 08:10:38 GMT; gen: Tue, 24 Oct 2017 05:34:29 GMT