Подключение и использование LCD Nokia 3310 (5110) к AVR-микроконтроллеру

В данной статье я постараюсь рассказать о том, как подключить и начать работать с LCD дисплеями 3310 (5110) и микроконтроллерами семейства AVR на языке С.

С чего хотелось бы начать? 

Как правило, большинство проектов на микроконтроллерах, основной своей задачей являют обработку и последующий вывод какой либо информации в доступном и понятном виде  для человека. Это либо вывод данных на ПК, или на семи-сегментный индикатор. Неважно какое устройство Вы собираете. Будь то вольтметр, амперметр, термометр или любой другой …метр — основная его задача — показать нам результат его работы. Для реализации этой задачи существует множество семи-сегментных индикаторов, отличающихся цветом, схемой подключения и количеством разрядов. Но работая с ними, мы всегда ограничены набором сегментов при помощи которых можем выводить только часть алфавита и цифры.А ведь хотелось бы выводить и какой либо текст, фигуру, да еще и на русском языке…. Вот тут нам на помощь и приходят LCD экраны от самых популярных моделей мобильных телефонов 3310 (5110). При этом рынок просто кишит готовыми к использованию устройствами. Нет необходимости разбирать телефон и делать переходник для контактов. Стоимость же такого готового блока колеблется в районе 2-3 доллара. Пример лотов на TinyDeal или DealExtreme. Обратите внимание, если у вас в устройстве всего 1 индикатор — то он явно дешевле. Но ведь на экран с разрешением 84х48 пикселей мы можем выводить до 6 строк по 12 символов!

Согласно описанию, питается данное устройство от 2.7 до 3.3. вольта, имеет голубую подсветку и 8 контактов.

Первые 5 используются для управления микроконтроллером, 6 питание, 7 — подсветка, 8 -масса.

1. RST ——— reset
2. CE ———- chip selection
3. DC ———- data/commands choice
4. DIN ——— serial data line
5. CLK ——— serial Clock Speed
6. 3.3V ——— VCC
7. LIGHT ——- backlight control terminal
8. GND ——— power negative

Осталось только подключить дисплей к микроконтроллеру и при помощи кода на С связать оба устройства. В данной статье мы не станем изобретать колесо и воспользуемся готовыми библиотеками. Для упрощения задачи, я выложил архив в котором находятся библиотеки для работы с AVR GCC, библиотеки для того что бы добавить устройство LCD 5110 в протеус, готовый проект протеуса с подключенным дисплеем к микроконтроллеру Atmega8A файлик «Памятка.pdf» — в котором описаны основные функции по работе с библиотекой. Я не стал писать библиотеку с нуля, а тоже взял готовую но значительно ее изменил. В коде библиотеки указан адрес первоисточника.Из изменений — выбросил немного лишнего, переназвал и переиначил работу функций для более удобной работы и понимания, а так же добавил функцию перевода значения с плавающей точкой типа  float в строку. Отличие от стандартных sprintf и dtostr в размере (разница около 2 кб.)  

Я не буду описывать как добавить библиотеки для AVR Studio или ISIS Proteus, и сразу перейду к практике. Если же такие вопросы будут — посмотрите обучающее видео

Библиотека работает следующим образом:
1. Инициализируем экран
2. Формируем данные для передачи
3. Передаем данные.

Распиновка для подключения находится в файле n5110.h — по умолчанию для порта B. Но при необходимости достаточно изменить только следующие строки

 #define LCD_PORT                   PORTX #define LCD_DDR                    DDRX  // Распиновка порта #define LCD_DC_PIN                 PBX    // DC #define LCD_CE_PIN                 PBX    // SCE #define SPI_MOSI_PIN               PBX  // SDIN  #define LCD_RST_PIN                PBX    // RESET #define SPI_CLK_PIN                PBX  // SCLK 

Итак. Дисплей подключен.библиотеки подключены. Что же дальше?

Давайте напишем простейший код — в котором выведем на экран какую либо фигуру и 3 значения — статическое, сохраненное в переменной и число с плавающей точкой. (Используйте шпаргалку)

 //Atmega8A - используемый микроконтроллер #define F_CPU 8000000 #include  #include  #include  //объявим  библиотеку #include "n5110.h"  int main(void) { //Инициализируем дисплей Lcd_init(); //объявим переменные float f_data = 14.43; //дробное int i_data = 123; //целое char s_data[5] = "Hello"; //строка 	while(1) 	{ 		//согласно шпаргалке  		//очистим дисплей 		Lcd_clear(); 		//Lcd_prints для вывода статичных данных 		Lcd_prints(0, 0, FONT_1X,(unsigned char *)PSTR("Привет!")); 		//Lcd_print для вывода из переменной 		Lcd_print(0, 1, FONT_1X,(unsigned char *)s_data); 		//Lcd_printf для вывода дробного числа (преобразование float в string) 		//2 - число знаков после зяпятой 		Lcd_printf(0, 2, FONT_1X, f_data, 2); 		//Для вывода числа преобразуем его в строку при помощи встроенной  		//функции itoa(число, массив,система счисления) 		char buff[20]; 		itoa(i_data, buff, 10); 		Lcd_print(0, 3, FONT_1X,(unsigned char *)buff); 		//передадим данные	 		Lcd_update(); 		//подождем 2 секунды 		_delay_ms(2000); 		//очистим дисплей 		Lcd_clear(); 		//Нарисуем кружки 		for (int i=0;i<=10;i++) 		{ 			Lcd_circle(40, 24, i, PIXEL_ON); 		} 		//передадим данные 		Lcd_update(); 		//подождем 2 секунды 		_delay_ms(2000); 	} }

В итоге получим вот такие результаты:

   

В целом как видно из кода все достаточно просто! Осталось только выбрать что выводить и как! Будут вопросы — с радостью отвечу.