Подключение модуля OPEN-SMART 1.8 INCH LCD к микроконтроллеру.

OPEN-SMART 1.8 INCH LCD.

Модуль Nokia5110 как дисплей для радиолюбителей всем хорош. Но у него есть один существенный недостаток, который нивелирует все его достоинства и, как по мне, не позволяет использовать его в коммерческих проектах. Дело в том, что соединение самого дисплея с несущей подложкой происходит через токопроводящую резинку, и т.к. всё делается не очень качественно, то любое, даже не большое смещение, вызывает артефакты на экране. Этого недостатка лишен модуль OPEN-SMART 1.8 INCH LCD, но не все так просто. О подключении его к МК, о его плюсах и минусах сейчас и поговорим.


Строго говоря, сравнивать OPEN-SMART 1.8 INCH LCD и Nokia5110 не очень корректно т.к. это совершенно разные дисплеи. И все же. В данном форм-факторе эти дисплеи используются как модули к разного рода «ардуинам», являются монохромными, подключаются через последовательный интерфейс SPI и в принципе, с небольшой переделкой, OPEN-SMART 1.8 INCH LCD может заменить нокиу.

Как можно было понять из вышесказанного у модуля OPEN-SMART 1.8 INCH LCD экран намертво «прикручен» к несущей подложке, это делает его очень привлекательным. Также он имеет экран большего разрешения, 128х64 против 84х48. Плюс, в нем реализованы фишки которых нет в Nokia, но которые способствуют разработке менее энергоемких устройств, а также делают вывод символов на экран более гибким. При всех своих достоинствах модуль OPEN-SMART имеет еще и очень привлекательную цену. Но с другой стороны есть и один существенный недостаток. OPEN-SMART 1.8 INCH LCD не имеет подсветки. Это не критично, но иногда она очень даже нужна и ее придется крафтить самостоятельно. Но. Все по порядку.


OPEN-SMART 1.8 INCH LCD управляется драйвером ST7567. Даташит на него можно свободно найти в интернете или скачать с прилагаемыми файлами. Питание модуля 3.3V. Как я понимаю это напряжение питания уже стало новым стандартом и де-факто вытеснило 5V. Поэтому надо уже понемногу переходить именно на него в своих проектах. Разрешение экрана, как я уже писал, составляет 128х64 точки. А габариты области отображения 38х19 мм. К примеру, у Nokia5110 они ненамного меньше 29х20мм. Для подключения модуля к МК используется последовательный интерфейс SPI с дополнительным сигналом дата/инструкция.

Итак, немного о том для чего какие выводы у дисплея:
GND – Общий;
3V3 – Питание 3.3v;
SDI – Вход данных;
SCK – Вход тактового сигнала;
DC – Вход сигнала данные/инструкция;
CS – Вход сигнала обращения к устройству;
RST – Вход сигнала аппаратного сброса;
NC – Вывод не используется.

Т.к. я не буду использовать аппаратный SPI, то куда подсоединять дисплей по большому счету не имеет значение. Все настраивается в библиотечном файле. Для тестирования дисплея я подсоединил его к ATmega8 работающей на частоте 8 МГц. от внутреннего генератора.

Теперь немного и коротко о наборе инструкций, которые понимает этот дисплей и которые можно использовать при последовательном подключении. Я разделил инструкции по некоторым категориям. В даташите они представлены в другом порядке:

--- Общие инструкции.
Display ON/OFF – Включение / выключение дисплея. Значение 0/1;
RESET – Программный сброс. Обнуляет некоторые значения, но не перегружает дисплей полностью;
NOP – Ничего не делать. Инструкция, передаваемая в контроллер дисплея указывающая ему, что делать ничего не надо. Видимо в каких-то специфических случаях данная инструкция бывает нужна;

--- Инструкции позиционирования.
SEG Direction – Направление чтения памяти по горизонтали. Т.е. начальная координата «Х» будет либо справа, либо слева. Значение 0/1;
COM Direction – Направление вывода по вертикали. Т.е. начальная координата «Y» будет либо внизу, либо вверху экрана. Значение 0/1;
Set Start Line – Устанавливает адрес начальной линии отображения (0…63). Очень интересная инструкция. Я ее подробней разберу ниже;
Set Page Address – Адрес по оси «Y». Значение от 0 до 7;
Set Column Address – Адрес по «Х». Значение от 0 до 127. Передается двумя полубайтами;

--- Инструкции питания.
Power Control – Повысители напряжения питания. Включает / выключает три бустера питания. Значение от 0 до 7. В моем случае, и как рекомендует даташит, для работы необходимо включить их все сразу;
Bias Select – Выбор делителя для регулирования внутреннего напряжения смещения /9 и /7. Значение 0/1. У меня для работы дисплея необходимо использовать значение «0» /9;
Set Booster – Усилитель источника питания (подключает внутренние конденсаторы) х4 или х5. Принимает значения 0/1. В моем случае при изменении данного параметра особых изменений не наблюдалось;
Regulation Ratio – Коэффициент регулирования источника питания влияющего на контрастность изображения. Значения от 0x20 до 0x27 (0x23 предпочтительно);

--- Инструкции отображения.
All Pixel ON – Включить пиксели. Значение 0/1. Работает в паре с Display ON/OFF для входа в режим энергосбережения;
Inverse Display – Инвертирует отображение пикселей дисплея. Значение 0/1;
Set EV – Регулировка контрастности значения от 0 до 63. При Regulation Ratio равным 0x23 значение Set EV около 45. О регулировке контрастности также будет подробней чуть ниже.


Более подробно о инструкциях нужно посмотреть в даташите.

Теперь немного о том, как все это работает. На мой взгляд самая важная подпрограмма - процедура передачи данных от МК драйверу дисплея. Так как этот процесс строго определен моя версия не будет оригинальной но...

//(6) Send Data Подпрограмма пересылки данных без подключения к SPI
	void send_data_ST7567 (unsigned char data, unsigned char dc){ 
		unsigned char c_temp = ONE_BYTE;	//счетчик пересылаемых данных 	
		//вход		
		LCD_PORT |= (1<<LCD_SCK);		//Устанавливаем единицу на пин тактирования
		LCD_PORT &= ~(1<<LCD_CS);		//Устанавливаем флаг обращения к дисплею 
		//Установка флага данные/команда   
		if(dc) LCD_PORT |= (1<<LCD_DC); 	
		else LCD_PORT &= ~(1<<LCD_DC);		
		//пересылка данных начиная со старшего бита
		for(c_temp; c_temp > ZERO; c_temp--){   
			LCD_PORT &= ~(1<<LCD_SCK);	//Опускаем линию такта	
			//устанавливаем передаваемый бит	
			if(data & (1<<LAST_BIT_ONE_BYTE)) LCD_PORT |= (1<<LCD_SDI);
			else LCD_PORT &= ~(1<<LCD_SDI);
			data <<= ONE_STEP;		//сдвигаем на шаг влево   
			LCD_PORT |= (1<<LCD_SCK);	//поднимаем линию такта                          
		}; 
		//выход	
		LCD_PORT |= (1<<LCD_CS);		//Снимаем флаг обращения к дисплею		
	}

Думаю, что дополнительных пояснений не требуется, но укажу только на два момента. Судя по временной диаграмме до того, как будет установлен низкий уровень на выводе CS необходимо установить высокий уровень на выходе тактирования SCK. И второй момент заключается в том, что флаг D/C (дата/команда) хоть и устанавливается до пересылки данных, но читается драйвером дисплея только при передачи последнего бита.

Теперь немного о инициализации дисплея. Тут, как говориться, нет никаких подводных камней. Специфика, да, но чего-то непонятного нет.

//Подпрограмма инициализации дисплея
	void lcd_init_ST7567(void){
		//инициализация выводов порта подключения дисплея
		LCD_DDR |= (1<<LCD_SCK)|(1<<LCD_RST)|(1<<LCD_SDI)|(1<<LCD_DC)|(1<<LCD_CS);	
		//Аппаратный сброс дисплея.
		LCD_PORT |=(1<<LCD_RST);   		
		pausa_int_ST7567(LCD_PAUSA);  	 
		LCD_PORT &=~(1<<LCD_RST);     	
		pausa_int_ST7567(LCD_PAUSA);   	
		LCD_PORT |=(1<<LCD_RST);     	
		//передача команд инициализации           
		send_data_ST7567 (BIAS_SEL_9, LCD_COM);	//Выбор смещения питания Bias Select /9
		send_data_ST7567 (SEG_DIR_F, LCD_COM);	//Выбор направления по горизонтали 
		send_data_ST7567 (COM_DIR_B, LCD_COM);	//Выбор направления по вертикали 
		send_data_ST7567 (REG_RATIO, LCD_COM);	//Изменение коэффициента регулирования источника питания
		set_ev_ST7567(45);			//Начальная контрастность 
		send_data_ST7567 (POV_CON_ON, LCD_COM);	//Повысители питания выключены все сразу (обязательно)
		set_booster_ST7567(ZERO); 	 	//усилитель источника питания х4 или х5 
		send_data_ST7567 (LCD_POS, LCD_COM);	//Режим отображения (позитивный)
		set_start_line_ST7567(ZERO);		//Установка адреса верхней строки экрана значение от 0 до 63  
		lcd_clean_ST7567();			//Проводим очистку экрана	
		send_data_ST7567 (LSD_ON, LCD_COM);	//Включение дисплея Display ON 
	}

По большому счету команды в которых передается ноль можно и не прописывать т.к. при сбросе и так все обнуляется, но для верности думаю будет лучше прописать все. А дальше уже смотреть по обстоятельствам.


Также необходимо отметить один очень важный момент. Каждая строка этого дисплея «живет» своей жизнью. Этим я хочу сказать то, что по достижении конца строки, счетчик указателя на ячейку памяти не перескочит на нулевую позицию следующей строки, а перейдет на нулевую позицию той же строки. Следовательно залить память дисплея закидывая поочередно байты не удастся. Заполнять память придется построчно.

Вы конечно же заметили то, что линия, уходя за правый край дисплея не торопится выйти из-за левого края. Это все потому, что достигнув координаты Х = 127, счетчик не перескакивает в координату Х=0. Он продолжает считать дальше пока не дойдет до 255 и только после этого перескочит в начальную координату. Ниже видео, подтверждающее этот нюанс.

Теперь еще немного о двух интересных возможностях дисплея. Во-первых, о возможности изменять контрастность, а во-вторых прокручивать дисплей по кругу как «цилиндр».

На следующем видео показано, как меняется яркость пикселей дисплея в зависимости от изменения параметра контрастности Set EV.

А вот на этом видео видно, как меняется рисунок, отображенный на дисплее в зависимости от изменения параметра Set Start Line. Применяя этот параметр можно центровать изображение, привязанное к строкам по Y. Очень удобно.

Ну вот вроде и все что я хотел рассказать об этом дисплее. В приложенных файлах моя библиотека, даташит и тестовая программа.

А на сегодня всё. Удачи.

11.01.2022


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

Приложение:
Даташит, Схема подключения, Тестовая пограмма и библиотека для OPEN-SMART 1.8 INCH LCD