В данной статье я постараюсь рассказать о том, как подключить и начать работать с 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);
}
}
В итоге получим вот такие результаты:
В целом как видно из кода все достаточно просто! Осталось лишь выбрать что выводить и как! Будут вопросы — с радостью отвечу.
Прикрепленные файлы:
- LCD_5110.zip (56 Кб)
- Памятка.pdf (29 Кб)