Подключаем дисплей HX1230 к микроконтроллеру.
(Никаких Ардуин только хардкор)

Logo

На китайском рынке появился дисплейчик 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

Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.

Приложение:
Схема, даташит и программа.