Итак, контроллер PCF8814 позволяет выводить на экран 96 пикселей по горизонтали и 65 пикселей по вертикали. Отсчет начинается от верхнего левого угла.
Данные об изображении записываются побайтно во внутреннюю память (DDRAM) контроллера PCF8814. Адресация по горизонтали (X) идет попиксельно и изменяется от 0 до 95, а по вертикали (Y) задается номер банка, который изменяется от 0 до 8. Адреса вне этих диапазонов не допускаются. Всего есть 9 банков по 96 байт. В девятом банке используется только 1 пиксель. В зависимости от включенного режима значащим является либо старший бит передаваемого байта, либо младший.
Адресация памяти может работать в двух режимах — горизонтальном и вертикальном. В горизонтальном режиме при записи каждого байты в память счетчик X увеличивается на единицу. При достижении предела по горизонтали (95) он сбрасывается в 0, а счетчик Y увеличивается на единицу.
При вертикальном режиме адресации при каждой записи байта в память на единицу увеличивается счетчик Y, при достижении предела (8) он сбрасывается в 0, а горизонтальный счетчик увеличивается на единицу. Картинка, приведенная ниже, подробно описывают способы адресации.
Контроллер PCF8814 может подключаться к микроконтроллеру с помощью:
- SPI по трем линиям
- SPI по четырем линиям
- шины I2C
- последовательного 3-х проводного интерфейса
В дисплее от Nokia 1100 реализовано подключение по 4-проводному SPI. В принципе, это неплохо, так как хоть и не экономит выводы микроконтроллера, но немножко разгружает программу работы с дисплеем. При подключении используются сигналы:
- SCLK — линия тактирования
- SDA — линия передачи данных и команд
- CS — линия, определяющая передачу команды или данных
- RST — линия аппаратного сброса
Дисплей от Nokia 1100 позволяет только записывать данные в память (DDRAM) контроллера дисплея. Чтение из памяти не реализовано, хотя сам контроллер PCF8814 это позволяет. Поэтому, что бы определить, что у вас записано в памяти дисплея, необходимо в микроконтроллере организовывать буфер с данными для дисплея и отслеживать то, что записано, по нему.
В общем, настоятельно рекомендую ознакомиться с даташитом на контроллер PCF8814 (в материалах к статье). Там описано много нюансов и режимов работы с контроллером, приведена система команд и т.д.
Я долго искал библиотеку для работы с этим контроллером, но ничего путного и работающего сразу не нашел. Поэтому пришлось слепить свою библиотеку из найденных кусков, адаптировав под AVR-GCC. В итоге дисплей заработал практически сразу же:
На фотке выше показана работа демонстрационной программы работы с дисплеем. Сама программа никаких сложностей не представляет. Вся работа реализована в библиотеке.
#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, далее — несоответствие ниодной кодировке. Поэтому при работе с кириллицей следует уделить внимание кодировке символов кириллицы.
Вот прототипы реализованных в библиотеке функций:
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);
Из названий функций, я думаю, понятно что они делают.
На этом, пожалуй все. Если есть вопросы, буду рад ответить в комментариях к посту.
Ну, и напоследок небольшое видео с демонстрацией работы.
Подключение дисплея Nokia 1100. Часть 1.
Вливайтесь в обсуждение
  85 комментариев