
TIC107 - текстовый двухстрочный 16x2 дисплей с управлением по I2C-интерфейсу. Производится по заказу компании ООO «ГАММА-Санкт-Петербург» Достоинства этого экрана - сравнительно низкая стоимость и более простое подключение и управление (если сравнивать с другими 16x2 экранами на основе контроллера HD44780). Недостаток - сложно достать. Экран управляется контроллером PCF2119
Экран имееет 7 выводов вверху плюс две пары крепежных выводов внизу. Назначение верхних выводов следующее (нумерация слева-направо):
1 - SCL, сигнал шины I2c
2 - POR, сброс драйвера. Подключается к выходу микроконтроллера, подача высокого уровня осуществляет сброс
контроллера дисплея
3 - SDA, сигнал шины I2c
4 - VDD1, питание +5В
5 - VDD2/VDD3, питание +2.2..4.0В
6 - VSS, земля
7 - VLCD, керамический конденсатор 0.1 мкФ на землю
Схема подключения экрана к МК:
Дисплей имеет фиксированный адрес на шине IC2 - 0x74.
Обе отображаемые строки хранятся в DDRAM-памяти. Вот карта памяти экрана из даташита:
Первая строка хранится по адресу 0×00 - 0×27, вторая - по адресу 0×40 - 0×67. Видимая часть ограничена первыми 16 символами, что соответствует адресам 0×00 - 0x0F и 0×40 - 0x4F.
Инициализация выполняется следующим образом:
#define TIC107_ADDR 0x74 // адрес I2C экрана
#define TIC107_PIN_PORT 2 // номер пина, к которому подключен вывод POR (сброс) экрана
#define TIC107_PORT_PORT C // номер порта
/**
* Формирует положительный импульс сброса
*/
inline static void LCD_Reset() {
PORT(TIC107_PORT_PORT) |= _BV(TIC107_PIN_PORT);
_delay_ms(5);
PORT(TIC107_PORT_PORT) &= ~_BV(TIC107_PIN_PORT);
_delay_ms(10);
}
/**
* Выполняет инициализацию экрана
*/
inline static void LCD_Init() {
i2c_init();
DDR(TIC107_PORT_PORT) |= _BV(TIC107_PIN_PORT);
LCD_Reset();
i2c_Start();
i2c_SendAddress(TIC107_ADDR);
i2c_SendByte(0b00000000); // Co=0, RS=0
i2c_SendByte(0b00110100); // DL=1, M=1, SL=0, H=0
i2c_SendByte(0b00001100); // D=1, C=0, B=0
i2c_SendByte(0b00000110); // I/D=1, S=0
i2c_SendByte(0b00110101); // DL=1, M=1, SL=0, H=1
i2c_SendByte(0b00000011); // L=1
i2c_SendByte(0b00000100); // P=0, Q=0
i2c_SendByte(0b00001000); // IM=0, IB=0
i2c_SendByte(0b00010000); // TC1=0, TC2=0
i2c_SendByte(0b01000010); // S1=1, S0=0 (4x)
i2c_SendByte(0b10000000 | 23); // V=0 (Va)
i2c_Stop();
}
После инициализации надо настроить контрастность экрана (255-максимальная контрастность):
void LCD_Contrast(uint8_t val) {
i2c_Start();
i2c_SendAddress(TIC107_ADDR);
i2c_SendByte(0b00000000); // Co=0, RS=0
i2c_SendByte(0b00110101); // DL=1, M=1, SL=0, H=1
i2c_SendByte(0b10000000 | val); // V=0 (Va)
i2c_Stop();
}
После этого экран полностью проинициализирован, и можно отображать на нем символы и строки
/**
* Устанавливает позицию для вывода данных
* x - номер столбца (0..15)
* y - номер строки (0, 1)
*/
void LCD_GotoXY(uint8_t x, uint8_t y) {
i2c_Start();
i2c_SendAddress(TIC107_ADDR);
i2c_SendByte(0b00000000); // Co=0, RS=0
i2c_SendByte(0b00110100); // DL=1, M=1, SL=0, H=0
uint8_t addr = y == 0 ? 0 : 0x40;
i2c_SendByte(0b10000000 | (addr+x)); // set DDRAM address
i2c_Stop();
}
/**
* Выводит символ в текущую позицию курсора
*/
void LCD_PrintChar(char ch) {
i2c_Start();
i2c_SendAddress(TIC107_ADDR);
i2c_SendByte(0b01000000); // Co=0, RS=1
i2c_SendByte(ch+128);
i2c_Stop();
}
/**
* Выводит строку в текущую позицию курсора
*/
void LCD_PrintLine(char *str) {
i2c_Start();
i2c_SendAddress(TIC107_ADDR);
i2c_SendByte(0b01000000); // Co=0, RS=1
for (uint8_t i = 0; ; i++) {
char ch = str[i];
if (!ch) {
break;
}
i2c_SendByte(ch+128);
}
i2c_Stop();
}
Для отображения символов латинского алфавита, цифр и основных символов надо к их ASCII-коду прибавить 128. После такой трансформации таблица символов выглядит следующим образом (код символа растет слева-направо и сверху-вниз):
Символы кириллицы присутствуют не в полном объеме - отсутствуют буквы, которые имеют аналоги по начертанию в латинском алфавите. Для формирования строк с кириллицей я написал небольшой онлайн-конвертер. Введите в поле ниже нужную строку и нажмите Enter.
По ссылкам ниже можно скачать даташит на контроллер PCF2119, исходный код и библиотеку Eagle.