Главная » Микроконтроллеры
Призовой фонд
на ноябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Тестер компонентов LCR-T4
Паяльник
4. 200 руб.
От пользователей

Похожие статьи:


Подключение и использование 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);
	}
}

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

   

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

Прикрепленные файлы:

Теги:

Опубликована: 0 1
Я собрал 0 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 2 чел.

Комментарии (33) | Я собрал (0) | Подписаться

-1
Павел Царь #
А как можно подключить LCD nokia 6230i к МК амеге8, подскажите если можно?
Ответить
0

[Автор]
kobzar #
Не подскажу... Да и смысл на такой камень такой дисплей. Там другое разрешение,цвета... Да и популярность и доступность с ценой у него явно не на высоте. Так - штучный товар. Потому особо инфы и нет.
Ответить
0
Alyes #
Для сименс A-50 пойдет? Внешне LCD похожи...
Ответить
0

[Автор]
kobzar #
Ну в целом подойдет любой, который на основе контроллера PCD8544. А у семена совершенно другой расклад. Подключить безусловно можно... Но опять же как и в случае с 6230i не ширпотреб, потому готовых наработок мало. Методы и принципы подключения у них одинаковые - но код будет разным.
Ответить
0
Vezd #
Сколько вольт подавать на вывод 7. LIGHT ------- backlight control terminal для подсветки? Нужно ли при этом подключать какие-либо другие выводы, кроме земли?
Ответить
0

[Автор]
kobzar #
Кракозябры вместо русских букв
Ребята - спешу сообщить что найден метод борьбы с кракозябрами вместо русских символов, при работе с ЖК.
Дело в том, что у некоторых из вас, проект создается в кодировке UTF-8 а наша библиотека работает только с ср1251
Фикс:
1.Открываем проект
2. File - Advanced Save Options
3. Вместо кодировки UTF-8 выбираем Cyrillic(Windows) - cp1251
Сохраняем, сохраняем проект - компилируем!
Ответить
0
si4karuk #
Как перенести дисплей на другой какой-то порт?
Ответить
0
DmitryS #
Почему то после "Привет" выводится еще 123 и в протеусе и в железе
Прикрепленный файл: IMG_20150409_145850.jpg
Ответить
0
ZAV1972 #
char s_data[5] = "Hello"; //строка Грубая ошибка в коде нету места для оканчания строки ....нужно сделать char s_data[6] = "Hello";
Ответить
0

[Автор]
kobzar #
Ответил в форуме.
Но в целом выводится ровно то, что есть примере
123 -это вывод целочисленного int с преобразованием в строку (itoa)
Ответить
0
Сергей24 #
Как перенести дисплей на другой какой-то порт?

Пробовал менять здесь:
#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
не получилось.
Ответить
0

[Автор]
kobzar #
С этой либой никак!
Вам нужна другая с програмным SPI - эта только для аппаратной версии
Ответить
0
SuperMuh #
Возможно ли подключить дисплей с этой библиотекой к Атмеге16?
Ответить
0
SuperMuh #
Все, вопрос снят. Разобрался - в этих МК немного различаются назначения портов, пришлось поискать инфу и все родить самому. Надо обязательно подключить SDIN (дисплея) к MOSI (МК) и SCLK к SCK, остальные порты можно не менять.
Ответить
0
Дмитрий #
Подскажите, не могу заставить работать с 128 атмегой. На какие порты чего подключать и что заменить в библиотеке? Все сделал по аналогии, на 16 работает без проблем, на 128 в протеусе работает, в реале нет, 3 дня уже голову ломаю...
Ответить
0

[Автор]
kobzar #
На те порты где есть аппаратный SPI
Ответить
0
bokorez #
Будьте добры, не могу сообразить как на экран 5110 вывести число с плавающей точкой, к примеру 750.45? Как ни пробовал, не получается.
Ответить
0
Zeromancer #
Прошу помочь. В протеусе нет индикации на данном дисплее. Подключаю запускаю, 100% должна отображаться информация, а он пустой. У меня Proteus 8.3.
Ответить
0
anslepnev #
Такая же беда, Вы как-нибудь решили эту проблему?
Ответить
0
Sony #
Подключил лсд к атмеге32 символы выводит, но допустим вместо числа (65111), выводит ( -425). В чем проблема?
Ответить
0

[Автор]
kobzar #
Переполнение буфера - в топике подробно отвечали несколько раз.
Ответить
0
Dilshod #
Здравствуйте коллеги, у меня тут проблема с отображением русских букв на дисплее nokia 1202. Как мне изменить unicode codevisionavr?
Ответить
0
Роман #
Хм.. а у меня вообще просто сероватый дисплей в протеусе и ничего не выводится.
Ответить
0
Сергей #
Объясните почему Lcd_printf не выводит дробное число если оно меньше 0.1 допустим (0.025; 0.001), а допустим 1.001 выводит.
Ответить
0
Sashka1980 #
Подскажите, как использовать функцию LcdContrast()? Фон дисплея имеет серую заливку.
Ответить
0
skive #
После инициализации дисплея вставьте:
LcdContras(60);
Я обычно ставлю 60, но в основном под дисплей подбирать надо.
Ответить
0
Vladimir_Chornenkiy #
Подскажите пожалуйста, как на базе этого драйвера создать универсальное меню? Подключил клавиатуру, пытался с помощью кнопок влиять на изменение текста на дисплее, посредством мелких кодов и все бесполезно. Что я не так делаю? Заранее спасибо.
Прикрепленный файл: Безымянный2.JPG
Ответить
0
Сергий #
Спасибо за полезный урок и заготовку, сэкономило массу времени.
Ответить
0
Gogaze #
Уже был вопрос, но ответов нет:
Модель в Proteus 7.10 работает, а в Proteus 8.4 - белый экран. Есть решение?
Ответить
0
Elk #
Никак не могу запустить на железе (только в протеусе работеет).
Микроконтроллер Mega8A, порты использую те-же, Дисплей китайский, на красной плате.
#define CHINA_LCD раскомментировал.
Фьюзы выставил на 8 Mhz. от внутреннего rc.

Код:
#define F_CPU 8000000
#include
#include
#include "n5110.c"
#include "n5110.h"
а дальше то-же самое, что в примере.
Ответить
0
Elk #
Разобрался, код был не при чем, progisp с чего-то вдруг решил что это AT90**
Ответить
0
Elk #
Есть все-таки один косяк с библиотекой, дисплей инициализируется только при питании от программатора, запитывал от блока питания, dcdc преобразователя, ttl адаптера, аккумулятора - все равно белый экран.
Ответить
0
Elk #
Сколько мучений, а проблема решилась просто настройкой контрастности.
Обидно, ведь не раз контрастность использовал (когда еще не знал что дисплей запускается только при питании от программатора), от других источников он, кстати тоже иногда (раза так с 20-го, с помощью дребезга контактов) запускался, с сильным фоном.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Модуль измерения тока на ACS712 (30А) Конструктор - темброблок на LM1036
вверх