В данной статье я постараюсь рассказать о том, как подключить и начать работать с 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 Кб)
Комментарии (35) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
[Автор]
Ребята - спешу сообщить что найден метод борьбы с кракозябрами вместо русских символов, при работе с ЖК.
Дело в том, что у некоторых из вас, проект создается в кодировке UTF-8 а наша библиотека работает только с ср1251
Фикс:
1.Открываем проект
2. File - Advanced Save Options
3. Вместо кодировки UTF-8 выбираем Cyrillic(Windows) - cp1251
Сохраняем, сохраняем проект - компилируем!
[Автор]
Но в целом выводится ровно то, что есть примере
123 -это вывод целочисленного int с преобразованием в строку (itoa)
#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
[Автор]
Вам нужна другая с програмным SPI - эта только для аппаратной версии
[Автор]
[Автор]
LcdContras(60);
Я обычно ставлю 60, но в основном под дисплей подбирать надо.
Модель в Proteus 7.10 работает, а в Proteus 8.4 - белый экран. Есть решение?
Микроконтроллер Mega8A, порты использую те-же, Дисплей китайский, на красной плате.
#define CHINA_LCD раскомментировал.
Фьюзы выставил на 8 Mhz. от внутреннего rc.
Код:
#define F_CPU 8000000
#include
#include
#include "n5110.c"
#include "n5110.h"
а дальше то-же самое, что в примере.
Обидно, ведь не раз контрастность использовал (когда еще не знал что дисплей запускается только при питании от программатора), от других источников он, кстати тоже иногда (раза так с 20-го, с помощью дребезга контактов) запускался, с сильным фоном.