На китайском рынке появился дисплейчик HX1230 который позиционируется как альтернатива Nokia 5110. Вот о подключении этого модуля к МК и его особенностях мы немного поговорим. |
---|
Забегая вперед, скажу, что этот дисплейчик мне понравился, но, не тем, что у него большое разрешение или маленькие габариты, а тем, что его матрица намертво «прикручена» к подложке и у него нет проблем с плохим контактом между ними.
Как не странно, но у этих дисплеев одинакова только область отображаемой информации. Примерно 29х20 мм. На этом и заканчивается всё их сходство.
Теперь коротко о различиях.
Начнем, конечно, с разрешения экрана. В Nokia 5110 разрешение 84х48 точек, а в HX1230 побольше - 96х68. Это и хорошо и не очень. Хорошо тем, что, очевидно, на экране можно уместить больше информации. Но есть и обратная сторона. Она заключается в том, что отображаемые символы мельче и для комфортной работы с дисплеем его надо держать чуть ближе к лицу. К тому же если для индикации выделять оперативную память равную памяти дисплея, то будет занято аж 864 байта. А если учесть, что в 8-ой Меге оперативки всего-то 1 килобайт, это может стать узким местом для полноценной работы, даже не очень сложных, программ. Также в НХ1230 есть один нюанс. Он связан с разрешением по оси (Y). Не трудно заметить, что 68 на 8 без остатка не делится. Поэтому в этом дисплее не девять полноценных строк, а восемь с половиной. Т.е. нижняя строка усечена и отображает только данные, находящиеся в младших нибблах нижней строки дисплея. Это отлично видно на фото.
Теперь подсветка. В НХ1230 она осуществляется с помощью одного диода и как следствие не такая яркая как у 5110. Но функцию она свою выполняет и при этом потребляет чуть меньше энергии.
Внешние габариты у НХ1230 также отличаются в меньшую сторону 36,5х38 мм. против 43х46 мм. (Это у конкретно сравниваемых модулей). Уменьшение габаритов повлекло за собой и сокращение мест крепления индикатора. В угоду минимизации для крепления у НХ1230 осталось всего два отверстия в нижней части.
С внешними отличиями вроде разобрались, пора переходить к подключению. Просто так заменить эти дисплеи один на другой не получится хотя бы из-за того, что передача указателя команда/дата в НХ1230 происходит совсем не так как в Nokia 5110. В НХ1230 эта команда передается первым битом в пакете, а не состоянием отдельного вывода. Но все по порядку.
Т.к. для передачи такого пакета данных использовать аппаратный SPI затруднительно, то нет смысла привязываться к конкретным выводам МК. Поэтому используем понравившиеся четыре вывода на одном порту. Точнее три вывода для инициализации и передачи данных на одном порту, а для подсветки можно выбрать и другой.
Как всегда, начнем с того, что определим какие выводы у дисплея за что отвечают.
VCC – питание (+3.3...5v).
CE – Включение дисплея для приема информации. Активный уровень - низкий. Для простоты подключения и уменьшения используемых выводов МК
замыкаем его на общий (GND). Но если хотите подключить дисплей по-взрослому, то придется для этого сигнала выделять еще один вывод МК
и немного модифицировать подпрограмму пересылки данных.
RST – Сброс. Необходим только в процессе инициализации.
DIN – Линия приема данных.
CLK – Тактовый сигнал.
BL – подсветка.
GND – общий.
N/C – вывод не используется.
Пакет пересылаемых данных представляет собой девять бит. При этом первым идет указатель команда (0) / дата (1), а за тем 8 бит данных передаваемых от старшего бита к младшему. Передача каждого бита сопровождается сигналом CLK. При этом во время передачи на линии СЕ должен быть постоянный низкий уровень. У меня он достигается аппаратно.
Перед тем как мы разберем работу некоторых подпрограмм, я еще раз выскажу свое мнение о том, что подключать такие дисплеи к МК, выделяя под них оперативную память, равную памяти дисплея, не рационально. Также как не рационально забивать Flash ненужными для конкретной программы библиотеками знаков. А значит, не будет никакой динамической памяти, а для отображения используем метод наложения одного знака на другой в отведенных местах на дисплее.
В приложенных файлах содержится тестовая программа (HX1230.c), библиотека работы с модулем (Lib_HX1230_ATmega.c) в которой содержатся только основные программы, а также три шрифта (Lib_HX1230_number_8x5.c, Lib_HX1230_number_16x8.c, Lib_HX1230_number_24x15.c) которые можно видеть на фотографии выше.
Для корректной работы подпрограмм необходимо указать порты и выводы, которые использовались для подключения дисплея.
//дисплей #define LCD_DDR DDRD //Управление портом #define LCD_PORT PORTD //Порт подключения #define LCD_RST 2 //Пин Сброс #define LCD_DIN 1 //Пин Данные #define LCD_CLK 0 //Пин Тактирование //подстветка #define LED_DDR DDRD //Управление портом подсветки #define LED_PORT PORTD //Порт подсветки #define LCD_LED 3 //Пин подсветки
Пересылка данных в дисплей осуществляется программными средствами. Это позволяет не использовать аппаратный SPI и не привязывается к определенным выводам МК, что сильно облегчает работу по разработке схемы и трассировке платы.
Пересылка данных в дисплей:
void send_data_HX1230 (unsigned char data, unsigned char dc){ unsigned char c_temp = ONE_BYTE; //счетчик пересылаемых данных //пересылка бита команда/дата if(dc)LCD_PORT |= (1<<LCD_DIN); else LCD_PORT &= ~(1<<LCD_DIN); LCD_PORT |= (1<<LCD_CLK); NOP; //ждем один такт LCD_PORT &= ~(1<<LCD_CLK); //пересылка данных for(c_temp; c_temp > ZERO; c_temp--){ if(data & (1<<7)) LCD_PORT |= (1<<LCD_DIN); else LCD_PORT &= ~(1<<LCD_DIN); LCD_PORT |= (1<<LCD_CLK); data <<= ONE_STEP; //сдвигаем на шаг влево LCD_PORT &= ~(1<<LCD_CLK); }; }//END send_data_HX1230()
Подпрограмма принимает два байта (данные и указатель). В счетчик пересылаемых данных записывается количество бит для пересылки (8) после чего проверяется указатель и в зависимости от этого на выходе DIN выставляется необходимый уровень. После чего происходит запись передаваемого бита в дисплей. На вывод CLK подается высокий уровень, пропускается один такт и на выводе CLK снова устанавливается низкий уровень. После того как указатель передан, запускается цикл пересылки данных. В зависимости от состояния седьмого бита в передаваемом байте на выходе DIN устанавливается необходимый уровень и подается тактовый сигнал. Данные в передаваемом байте сдвигаются на один шаг влево и цикл повторяется, пока весь байт не будет записан в дисплей.
Еще раз обращу внимание на то, что для упрощения я подключил вывод СЕ к земле. Поэтому в подпрограмме пересылки отсутствуют строки о работе с этим сигналом.
Теперь рассмотрим подпрограмму инициализации. Капитан Очевидность предупреждает, что ее необходимо включать в блок настроек МК до начала основного цикла.
void lcd_init_HX1230 (void){ LED_DDR |= (1<<LCD_LED); //инициализация порта подсветки LCD_DDR |= (1<<LCD_CLK)|(1<<LCD_RST)|(1<<LCD_DIN); //инициализация порта дисплея //Сброс дисплея LCD_PORT |= (1<<LCD_RST); pausa_HX1230(); //пауза LCD_PORT &=~(1<<LCD_RST); //сбрасываем дисплей pausa_HX1230(); LCD_PORT |=(1<<LCD_RST); pausa_HX1230(); //Настройка дисплея lcd_HX1230_PowerUp(); //включение дисплея lcd_clean_HX1230(); //Очистка экрана }//END lcd_init_HX1230()
Здесь также нет ничего новаторского. Сначала инициализируем необходимые порты, потом проводим манипуляции с сигналом сброса, затем запускаем подпрограмму, которая устанавливает рабочие параметры модуля, и в завершении очищаем экран. Отдельно хочу обратить внимание на то, что при рабочей частоте МК 8 МГц устанавливать счетчик паузы меньше 1500 единиц не стоит. У меня на меньших значениях дисплей не запускался.
Также есть смысл рассмотреть подпрограмму включения дисплея потому как в ней не все понятно. Я не смог найти даташит на английском языке, поэтому некоторые настройки, для меня, пока остаются неизвестны.
void lcd_HX1230_PowerUp (void){ send_data_HX1230(0x2f, LCD_COM); //(0010хххх) назначение непонятно lcd_HX1230_Contrast(LCD_CON); //контраст от 0 до 31 lcd_HX1230_inverted(LCD_POS); //отображение (0xa6 - «позитив» 0xa7 - «негатив») send_data_HX1230(0xa4, LCD_COM); //(1010010х) назначение непонятно send_data_HX1230(0xaf, LCD_COM); //включение дисплея (0xaf – включен, 0xae - выключен) send_data_HX1230(0x40, LCD_COM); //(01хххххx) назначение непонятно lcd_position_HX1230(LCD_ZERO); //нулевое положение курсора } //END lcd_HX1230_PowerUp()
Непонятное назначение некоторых настроек не мешают работать с дисплеем. Конечно, можно провести пару часиков изучая их, но это на любителя. Я же просто подожду, когда выйдет нормальный Даташит, и разберусь в том, что сейчас, по крайней мере, для меня, покрыто завесой тайны. А пока, буду использовать модуль, как он есть. И да. С помощью этих библиотек можно подключать этот дисплей как к Мегам, так и к Тиням. Разницы никакой нет.
Ну, вроде и всё, что я хотел сказать по поводу этого дисплея. Остальные подпрограммы, представленные в библиотеке вы можете разобрать самостоятельно. В целом модуль действительно можно считать хорошей альтернативой Nokia5110. Он более универсален и качественно выполнен. На мой взгляд, единственным его недостатком можно считать меньшее количество мест крепления. Но это не существенно, а для малогабаритных устройств, наоборот является преимуществом.
А на сегодня всё. Удачи.
17.05.20
Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.
Приложение: Схема, даташит и программа.