Подключение дисплея на базе контроллера PCD8544 к микроконтроллеру AVR
О дисплеях
О контроллере Подключение Команды контроллера Обычный набор команд Расширенный набор команд Инициализация дисплея Вывод графической информации Исходный код прошивки для AtmelStudio 6 Автор: Погребняк Дмитрий Самара, 2014. О дисплеяхПопулярные в своё время сотовые телефоны фирмы Nokia, такие модели, как 3210 3310 3315 3330 3350 3410 5110 5120 5130 5160 6150 6210, обладали монохромными графическими дисплеями, с экраном 84x48 точек, на базе контроллера PCD8544.
Времена этих телефонов прошли, но дисплеи не канули в Лету, они оказались чрезвычайно удобным и дешёвым вариантом для вывода графической и текстовой информации, при использовании в сочетании с микроконтроллерами. Сейчас на ebay можно за порядка 100 рублей (вместе с доставкой) купить такой дисплей, установленный на печатную плату 45х45мм, которая также обеспечивает подсветку. О подключении таких дисплеев, на базе контроллера PCD8544, и пойдёт речь ниже. О контроллереКонтроллер PCD8544 разработан фирмой PHILIPS. Документацию на него можно скачать здесь Одной из особенностей этого контроллера является то, что информация может быть только выведена на дисплей, но не считана с него. В частности, это накладывает два ограничения: - Нет возможности узнать состояние дисплея, в т.ч. и вообще факт его присутствия программными средствами. Это требует точного соблюдения таймингов при выводе информации. К счастью контроллер может работать на достаточно большой скорости и это не является проблемой. - Невозможно работать с изображением в режиме «чтение-изменение-запись». Вывод сложного изображения, где потребуется совмещение разной графической информации, может быть осуществлён только с использованием внеэкранного буфера, или предварительного полного расчёта совмещения изображений. В то же время, контроллер обеспечивает крайне низкое энергопотребление: менее 300мкА (с типичными дисплеями Nokia) в рабочем режиме, и около 1.5мкА в режиме отключения. Контроллер имеет встроенный генератор повышенного напряжения, поэтому отдельно подводить напряжение для питания дисплея не требуется. Сам же контроллер работает при напряжении 2,7 – 3,3 Вольта. Подключение
Как упоминалось выше, контроллер работает на напряжении 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): В зависимости от выбора способа коррекции напряжения, это значение изменяется в зависимости от температуры. Чтобы не повредить дисплей при низких температурах, рекомендуется чтобы это значение не превышало 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/). 13 ms; mod: Mon, 11 Jan 2021 09:39:36 GMT; gen: Fri, 15 Nov 2024 08:54:57 GMT |