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

Технические характеристики LCD Nokia3310:

— Напряжение питания 2,7 – 3,3 В
— Встроенный контроллер Philips PCD8544
— Интерфейс SPI
— Размер дисплея 38х35 мм
— Размер активной области 30х22 мм
— Разрешение 84х48 пикселей
— Диапазон рабочих температур –27…+70 0С

Схема подключения к микроконтроллеру

Распиновка LCD Nokia3310

Программная часть

Собственно для работы с дисплеем достаточно трех функций

void LCDInit(void)

void LCDClear(void)
Полностью очищает дисплей.

void LCDStr(unsigned char x, unsigned char row, unsigned char *dataPtr )

Пример:
LCDStr(0, 2, “lcd Nokia3310” );

Related items

  • Библиотека для опроса кнопок
  • Работа с SD картой. Воспроизведение wav файла. Ч3
  • Работа с SD картой. Подключение к микроконтроллеру. Ч1
  • AVR315: Использование TWI модуля в качестве ведущего I2C устройства
  • ATtiny10. Самый маленький микроконтроллер AVR

Comments

Итого, как я понимаю, в любом случае выводить придётся «посимвольно» — по 8 бит, причем начиная с ординаты, кратной восьми. Так?

в самой 3310 как я вижу весь текст имеет высоту 8 пикселей, но выводится он с произвольных точек (ордината не обязательно кратна восьми). Интересно, как сделано? надо даташит PCF8814 покурить, может там есть чего.

Я так понимаю что библиотека с буфером это как будто двойная буферизация в видеокарте — рисуем в нашем буфере, потом делаем апдейт аля SwapBuffers(). Так? А данные разые быстро передадутся? (у меня дисплей от 1100, там не SPI а чё-то другое, но принцип вроде похож)

и еще вопрос — сейчас Data Write именно _присваивает_ текущему байту заданное значение. А нет ли способов вместо присваивания делать, скажем, операции «И», «ИЛИ»? типа операции |= и &=

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

А, я рановато обрадовался. Режимы вывода «И», «ИЛИ», «искл.ИЛИ» только для этой библиотеки. А я думал это вшито в драйвер дисплея.

Короче говоря, если возиться с дисплеем на низком уровне (ну или писать библиотеку самому с нуля) — то рисовать на нём можно ТОЛЬКО столбиками по 8 бит, затирая то что уже нарисовано под этим столбиком. Других способов рисования драйвер дисплея не предусматривает . Я правильно понял?

Решил тоже поиграться с таким дисплеем. Но видимо мне какой-то косячный попался.

Во-первых, разрешение у него 37х84 😮
Во-вторых, столбики не по восемь точек идут, а вот так: 1 столбик на 4 точки, 5 столбов по 6 точек и 1 по 3. И когда я посылаю первую строку байтов, точки выводятся только под действием последних 4-х бит.

Это чё за хрень такая? Так и должно быть или я чё-то не так настроил? 😕

Не, кажись общитался 😳 . Высота всё-таки 48 пикселей. Проблема вот в чём. Посылаю допустим в память 0b00001111 84 раза, при этом с начала экрана выводится строка шириной 1 пикс (а должно по идее 4 пикселя и четыре пробела). Следующие строки идут нормально (по восемь пикселей). Ну и в последней строке остаётся только 3 пикселя. Короче говоря, получился сдвиг на 3 пикселя вверх, о причинах которого мне и хотелось бы узнать.

>Дисплей точно от Nokia3310?
Скорее всего. Брал тут http://shop.siriust.ru/product_info.php/products_id/382

Большое спасибо за ссылку — пригодится.

Но тема все таки все еще актуальна (по ссылке проект с экраном от Nokia 1100, он даже выглядит немного иначе).

а как выводить дополнительные фонты?

вопрос снимается, я плохо код посмотрел 🙂

PashGan Подскажи, как изменить контраст?
Пишу даже
LCDInit();
LCDContrast(0x0 0);
LCDClear();
LCDStr(0, 0, «Курсова робота»);

но никаких изменений,?

Пожалуйста, объясните, где первая нога? Во всём интернете ни одной картинки и ни одного слова про это!

Вот дисплей: смотрю на него. На экран. Лично у меня он сзади чем-то закрыт: непрозрачный. Если б я мог насквозь видеть, то б эти 8 ног были сверху и рядом с правой (если продолжать смотреть на экран, а не на ноги) был б такой пластмассовый выступ.

я подключал как то дисплей от нокиа 1100 (на сириусте всего 50 руб стоит) — но у меня возникла проблема с контактами дисплея которые наклеены на стекло — при попытке подпаятся к ним — дисплей просто потом не работал (вернее сначала работал, потом работал если прижать контакты, а потом уже нифига не работал (ну может изредка).. извел я 3 или 4 дисплея и забросил эту идею..

может быть ктото придумал что нить дельное с подключением таких дисплеев ? чтобы и не паяться и контакт был надежный?

плохо себе эту процедуру представляю.. расстояние между выводами маленькое..- капли клея обязательно где нить расползутся и замкнут 🙁

никто никаких колодок не делал (или может покупал где нить) для подобных дисплеев?

а какая разница сколько бит в строке ?
сами процедуры не сильно отличаются..
Code:
void LCD_pixel (unsigned char x, unsigned char y, unsigned char mode) < // вывод пиксела

if ((x >3;
unsigned char bt=1
точки я думаю понятно как рисовать..
это для экрана 128 на 64 точки, поставьте свои размеры и вперед..
правда конечно буфер экрана нужен ! без него никак при графике
а для линий смотрите в интернете алгоритм Брезенхейма — он есть для линий и для дуг..
в принципе для линий я и на СИ и на Асме писал — действительно не сложный и быстрый
вот на си
Code:
void LCD_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, char mode) < // процедура рисования линии
signed char dx, dy, sx, sy;
unsigned char x, y, mdx, mdy, l;

if (mdx>=mdy) <
l=mdx;
while (l>0) <
if (dy>0) < y=y1+mdy*(x-x1)/mdx; >
else < y=y1-mdy*(x-x1)/mdx; >
LCD_pixel(x,y,mode);
x=x+sx;
l—;
>
> else <
l=mdy;
while (l>0) <
if (dy>0) < x=x1+((mdx*(y-y1))/mdy); >
else < x=x1+((mdx*(y1-y))/mdy); >
LCD_pixel(x,y,mode);
y=y+sy;
l—;
>
>
>

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

Ну и вот вывод текста с точностью до пиксела
Code:
void LCD_char(unsigned char ch, unsigned char mode) < // Вывод символа
const unsigned char *fontpointer;

if (ch 0) LCD_pixel(lcd_X, lcd_Y-1, 1); // если печать в режиме инверсии — сверху отчертим линию
>

lcd_buff[lcd_YC*128+lcd_X]=lcd_buff[lcd_YC*128+lcd_X] | (temp >(lcd_YP+1)); // печать нижней части символа

О! За Брезенхейма отдельный респект!
А по поводу 84 бит, это фишка этого дисплея.
Я хотел использовать без обработки формат XBM(который фактически является массивом на Си и его можно просто инклудить), еще его особенность что если длина строки не кратна 8ми то бит добивается нулями.
А тут у экрана 84 бита на строку, а в XBM 88 бит на строку и чтобы вывести все приходится при новой строке явно указывать ее номер. Еще чудес добавляет то, что вывод 1ого байта это вывод колонки из 8ми пикселей. Я с компа привык к нормальной построчной адресации. Тут такого нет. Вот и хочется написать обертку чтобы было. И сделать свою демку с графикой. А если упрусь в возможности контроллера, то возьму покруче, но это уже MSP430-ый офтоп.
Кстати вывод я только что переделал на вертикальную адресацию и там стало все хорошо ибо теперь по длине картинки 48бит.

ПС. Знаю что немного путано(

Pashgan приветствую. Решил сделать термометр с выводом комнатной и уличной температуры с использованием данного дисплея. Купил три дисплея (китайских)-зап орол два из них 😥 Кое как подключился к одному. Заметил что в последних 3-4 строках какой то мусор.
вот мой код Code: #include
#include «driver_nokia3310.h»

void main( void )
<
unsigned char* counterProg = 0;
LCDInit();
LCDClear();

while(1) <
counterProg++;
LCDStr(0, 3,counterProg);
delay_ms(100);
>
> Вот что получаю

Вопрос: откуда берется надпись «Pashgan»?
Почему вместо counterProg получаю какую то муть и как увеличить контрастность дисплея?
И можно ли убрать мусор из последних строк?

hawk то что у тебя мусор в последней строке это потому что дисплей китайский, а по поводу твоего кода объяснить не могу (потому что сам в си не силен) но подсказать как решить эту проблему могу.
Я поступил следующим образом
Функция sprintf стандартной библиотеки stdio.h
sprintf – функция для вывода форматированных данных в строку.

Code:
#include
#include
#include «driver_nokia3310.h» // использую lcd от siemens c55
unsigned char array[6];
unsigned char temp;

void main( void )
<
LCDInit();
LCDClear();
LCDContrast(75);
sprintf(array,»t %u»,temp);

Ну а по поводу мусора я решил проблему повысив разрешение с 84*48 до 101*64 так кат у меня LCD от Siemens C55. В твоем случаи попробуй поставить чуть больше разширение методом тыка.

Читайте также  Многоканальный контроллер светодиодов

Подключение и использование 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. Но при необходимости достаточно изменить только следующие строки

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

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

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

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

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

Драйвер для LCD от Nokia 3310

Автор: Aheir
Опубликовано 16.02.2010

Сегодня поговорим об экранах от мобильных телефонов, а именно — об экране от Nokia 3310. Казалось бы, тема достаточно избитая, однако, как это часто бывает, при возникновении необходимости найти готовое подходящее решение не удается и приходится изобретать велосипед. Вот и мне пришлось самостоятельно разбираться в вопросе, когда захотелось использовать этот экранчик в своих конструкциях.
Собственно, подопытный (картинка честно стянутая со странички, спасибо авторам (хотя и они тоже ее откуда-то позаимствовали)):

Область отображения 84*48 точек (что позволяет разместить 6 строк текста по 14 символов 5×7 в каждой), питание 2,7..3,3 В, интерфейс SPI с пропускной способностью до 4 Mbit/s. И все бы хорошо, но дело в том что существуют две разновидности этого дисплея. Внешние отличия несущественны, но они есть:

Из отживших свое телефонов извлекаются оригинальные дисплеи с надписью «Nokia» на рамке и как правило металлизированными ламелями на самом экране, в магазинах запчастей для сотовых продаются так называемые «китайские» дисплеи без надписи и без металлизации. И те, и другие прекрасно работают при установке в телефон, однако при попытке заменить оригинальный дисплей на неоригинал в какой-нибудь конструкции на микроконтроллере возникнет ситуация, когда на неоригинальном дисплее изображение окажется смещенным и отчасти нечитаемым (фотка с нашего Форума, спасибо автору):

Как выяснилось, в этих дисплеях стоят разные контроллеры: в оригинальном — PCD8544 (документация на который доступна в Сети), а вот что установлено в китайском — доподлинно неизвестно. Поиск по Интернету и собственные наблюдения позволили сделать ряд заключений относительно контроллера неоригинального дисплея, тем более что как-то он все же работает, а значит более-менее корректно инициализируется и принимает данные.
Ниже представлена таблица команд для PCD8544 с известными на сегодняшний день уточнениями для неоригинального контроллера (выделено красным):

Ничего экзотического в командах контроллера не наблюдается, стандартный набор для графического экрана. Разве что настройки напряжения Vop, позволяющие программно менять контрастность. Оригинальный дисплей на дополнительные команды неоригинала просто не реагирует, так что можно их использовать вне зависимости от контроллера дисплея.
Сдвиг экрана неоригинального контроллера вверх (и цикличность прокрутки экрана) говорит о наличии в его области памяти дополнительных строк изображения, а анализ результата при выводе на экран картинки позволил установить, что «неоригинал» еще и шире на 18 точек. Я предположил, что разрешение экрана составляет 102х64 точки, что впоследствии подтвердилось экспериментально. Следовательно, область экрана 84×48 точек является некоторой частью памяти на 102х64 точек неоригинального контроллера.
Существующие решения по обеспечению совместимости экранов основаны на осуществлении сдвига экрана: либо на полстроки, остатки которой видны на экране (тогда первая строка не отображается и область экрана начинается со второй), либо на «полный оборот» (тогда первая строка отображается на точку ниже, чем должна быть). Однако мои эксперименты показали их пригодность почему-то только для режима отображения текста, при попытке вывести картинку изображение рассыпалось (рискну предположить, что это происходит потому, что при выводе текста каждая строка адресуется перед выводом (т.е. сказали куда вывести — вывели строку, переставили указатель на начало следующей строки — вывели вторую и т.д.), а при выводе картинки данные пишутся в память сплошным потоком, что приводит к рассыпанию из-за большей программной ширины дисплея).
Отсюда получаем два способа вывода нормальной картинки на неоригинальный дисплей: отображать экранный буфер на часть памяти контроллера, программно отслеживая смещение, либо выводить картинку с адресацией каждой строки. Я реализовал первый (как-то оно проще для меня оказалось), хотя у него есть один недостаток: в драйвере требуется однозначно указывать, с каким дисплеем предполагается работа, тогда как вторым способом можно в теории сделать более универсальный драйвер. Видимо, как раз по второму алгоритму и работает телефон, если уж к нему подходят любые экраны. Но лично меня это не расстраивает, потому как сделать две версии прошивки совсем несложно, да и вообще, оригинальных дисплеев у меня всего один (и вряд ли будут еще), а вот неоригинала с десяток имеется. Ладно, поехали уже к практике, теории пока хватит.
Для начала — изготовили простейшую макетную плату. Собственно, процессор Атмега8, пара конденсаторов, разъем программирования и сам экран. Все. Подключение простое: вывод SCK экрана на SCK контроллера; SDIN — на MOSI; D/C, SCE и RES — на любые пины порта, к Vout — конденсатор на землю, VDD — на питание, GND — к земле. Собственно, что-то вроде этого:

Поскольку чтения из индикатора не происходит, параллельно одному индикатору совершенно безболезненно можно подсоединить второй, только вот на Vout повесить отдельный конденсатор:

На плате разведены элементы термодатчика и подсветки индикатора, но ничего из этого не установлено. Питание — 3,3В, я лично запитывал плату непосредственно от USB-программатора.
Индикатор от телефона мне достался без рамки, но к нему можно просто припаяться, а вот с китайским индикатором такой номер не пройдет ввиду отсутствия металлизации, поэтому паяемся к металлическому коннектору, который прижимается к экрану рамкой и пластиком:

Читайте также  Мигает лампочка при включенном свете что делать?

Теперь можно и попрограммировать маленько. МК настроен на тактирование от внутреннего генератора на 4МГц, фьюзы:

За основу были взяты исходники с уже упоминавшейся странички и доработаны для совместимости с CodeVision AVR и обеспечения требуемого функционала. Вот перечень функций для работы с LCD:

void LcdSend (unsigned char data, unsigned char cmd); //запись данных в LCD
void LcdUpdate (void); //копирование буфера в RAM дисплея
void LcdClear (void); //очистка дисплея
void LcdInit (void); //настройка SPI и дисплея
void LcdContrast (unsigned char contrast); //установка контраста
void LcdMode (unsigned char mode); //режимы дисплея: 0 — blank, 1 — all on, 2 — normal, 3 — inverse
void LcdPwrMode (void); //инвертирует состояние вкл/выкл дисплея
void LcdImage (flash unsigned char *imageData); //вывод изображения
void LcdPixel (unsigned char x, unsigned char y, unsigned char mode); //управление пикселем с координатами x,y
void LcdLine (int x1, int y1, int x2, int y2, unsigned char mode); //рисование линии
void LcdCircle(char x, char y, char radius, unsigned char mode); //рисуем круг с координатами центра и радиусом
void LcdBar(int x1, int y1, int x2, int y2, unsigned char persent); //рисуем батарейку и заполняем ее на %
void LcdGotoXYFont (unsigned char x, unsigned char y); //установить курсор в положение x,y
void clean_lcd_buf (void); //очистка текстового буфера
void LcdChr (int ch); // печатает символ на текущем месте
void LcdString (unsigned char x, unsigned char y); //печатает строку
void LcdChrBold (int ch); //печатает символ на текущем месте, большой и жирный)
void LcdStringBold (unsigned char x, unsigned char y); //печатает большую и жирную строку
void LcdChrBig (int ch); //печатает символ на текущем месте, большой
void LcdStringBig (unsigned char x, unsigned char y); //печатает большую строку

Функционал понятен из названий и комментариев. Результатом работы этих функций становятся вот такие изображения на дисплее:

Математически реализованы шрифты удвоенной высоты и удвоенного размера, имеются широкие возможности для построения сложных объектов на основе графических примитивов (линии и окружности отрисовываются по алгоритмам Брезенхема). При помощи директив условной компиляции реализована сборка драйвера для того или иного дисплея, выбор осуществляется при помощи строки #define china 1: если дефайн активен — работаем по алгоритмам «китайского» дисплея, иначе — оригинального. По ссылке можно посмотреть видео работы экрана

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

UPDATE от 23.02.2010.

Предлагаю Вашему вниманию вторую версию драйвера.
По результатам эксплуатации исправлены всячеcкие косячки, глючки и прочие жучки)
Основное нововведение — добавлен программный SPI, так что теперь можно вешать дисплей практически на любые порты микроконтроллера (применительно к AVR не реализовывал за ненадобностью поддержку портов от F и далее). Кроме того, добавлено пару функций, наиболее полезной из которых является

void LcdStringInv (unsigned char x, unsigned char y);

которая позволяет писать строки инверсным шрифтом (на черном фоне) — удобно для выделения каких-либо сообщений, настроек и т.п.
Пока вот как-то так.

cxema21.ru

Куплен был как то на Aliexpress дисплей Nokia 5110, совместимый с дисплеем от Nokia 3310, в которых используются одинаковые контроллеры. Таким образом, можно было предположить, что этот дисплей должен быть полностью совместим с родным дисплеем от Nokia3310, в принципе, все так и есть. Разрешение дисплея составляет 48х84 пикселя. Основой является контроллер PCD8544 выполненный по технологии COG — Chip On Glass, чип на стекле, по этому дисплей очень хрупкий, это следует учитывать при установки, пайки и креплении.

Кстати наши китайские братья научились клепать такие дисплейчики, на оригинальном дисплее металлизированные контакты а на китайском металлические штырьки или ещё хуже — резинка. Тот дисплей, который «заведется» с использованием библиотек дисплея (размещенных на сайте) для Bascom’а, без какой – либо их доработки, можно будет считать соответствующим оригиналу. Собственно, задача состояла не только в этом, а просто хотелось выяснить, какие изменения надо (если надо!) внести в библиотеки, чтобы каждый из имеющихся дисплеев работал как оригинальный.

Дисплей 5110 заказанный с китая:

Если смотреть на лицевую сторону дисплея контактами к вверху то выводы считаются с права на лево от 1 до 8. Работает дисплей от 3 вольт (я про оригинал), модули заказанные с китая работают от 5вольт. Бывает иногда косяк с отображением а именно, не выводятся все пиксели, в этом случае рекомендую плотней прижать резинку между дисплеем и платой. Хочу заметить, что распиновка и название некоторых выводов 5110 от 3310 отличается! Вариантов подключения 3310 на других ресурсах полно, а вот работы с 5510 мною замечено не было.

Порядок подключения дисплея к микроконтроллеру следующий:

Вывод din — portb.4, Вывод scl — portb.3 , Вывод dc — portb.5, Вывод ce — portc.0 , Вывод reset — vcc

Код программы:

$regfile = «m8def.dat»
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 52

Config Portb.5 = Output
D3310dc Alias Portb.5
Config Portc.0 = Output
D3310ce Alias Portc.0
Config Spi = Soft , Din = None , Dout = Portb.4 , Ss = None , Clock = Portb.3
‘ din — portb.4, scl — portb.3 , dc — portb.5, ce — portc.0 , reset — vcc
Spiinit
$include «3310init.bas»

Do
Call D3310clear
Call D3310position(1 , 0)
Call D3310print( «cxema21.»)
Call D3310position(7 , 1)
Call D3310print( «ucoz.ru»)
Call D3310position(2 , 4)
Call D3310print( «cxema21.ucoz.ru «)
Waitms 5000
Call D3310invert
Waitms 5000
Call D3310uninvert
Waitms 5000
Loop
End
$include «3310end.bas»
Return

Компилируем, прошиваем и радуемся:

Вдруг если дисплей ничего не показывает при условии что монтаж правильный, попробуйте передернуть ногу RESET или просто питание (выключить и заново включить). Более подробная информация по работе с данным дисплеем есть на сайте , так что углубляться не буду.

Видео работы:

Команды для работы с 5110(3310):

void LcdSend (unsigned char data, unsigned char cmd); //запись данных в LCD
void LcdUpdate (void); //копирование буфера в RAM дисплея
void LcdClear (void); //очистка дисплея
void LcdInit (void); //настройка SPI и дисплея
void LcdContrast (unsigned char contrast); //установка контраста
void LcdMode (unsigned char mode); //режимы дисплея: 0 — blank, 1 — all on, 2 — normal, 3 — inverse
void LcdPwrMode (void); //инвертирует состояние вкл/выкл дисплея
void LcdImage (flash unsigned char *imageData); //вывод изображения
void LcdPixel (unsigned char x, unsigned char y, unsigned char mode); //управление пикселем с координатами x,y
void LcdLine (int x1, int y1, int x2, int y2, unsigned char mode); //рисование линии
void LcdCircle(char x, char y, char radius, unsigned char mode); //рисуем круг с координатами центра и радиусом
void LcdBar(int x1, int y1, int x2, int y2, unsigned char persent); //рисуем батарейку и заполняем ее на %
void LcdGotoXYFont (unsigned char x, unsigned char y); //установить курсор в положение x,y
void clean_lcd_buf (void); //очистка текстового буфера
void LcdChr (int ch); // печатает символ на текущем месте
void LcdString (unsigned char x, unsigned char y); //печатает строку
void LcdChrBold (int ch); //печатает символ на текущем месте, большой и жирный)
void LcdStringBold (unsigned char x, unsigned char y); //печатает большую и жирную строку
void LcdChrBig (int ch); //печатает символ на текущем месте, большой
void LcdStringBig (unsigned char x, unsigned char y); //печатает большую строку

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

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

При выводе картинки (с использованием предложенной для оригинального дисплея библиотеки) на дисплеи №2 и №3, изображение «рассыпалось», да и при выводе «Hello, World» на первой строке дисплея №3, можно было видеть только нижнюю половину этой надписи. В Интернете много материалов с объяснениями этого факта, есть даже успешные попытки преодолеть эту проблему http://www.radiokot.ru/articles/29 , но это сделано на С, а вот решения этой задачи на Bascom я нигде не смог найти.
На упомянутом Интернет-ресурсе автор предположил, что контроллер неоригинального дисплея способен отобразить 102х64 точки (104 байта по горизонтали и 8 байт по вертикали). Дальнейшие поиски привели к тому, что был найден контроллер SD7558, который имеет те же команды и обеспечивает вывод с разрешением 6630 точек (102 точки по горизонтали и 65 – по вертикали).
Поэтому, можно предположить, что при выводе картинки на экран, когда данные идут сплошным потоком, в памяти контроллера дисплея они размещаются по строке не в 84 ячейках памяти, а в 102! Но сам контроллер – то не знает, что при заполнении 84 ячеек памяти, нам надо продолжить вывод на дисплей с новой строки и продолжает заполнять ячейки до конца строки, т.е. до 102, а только потом, начинает прорисовывать новую строку – вот изображение и «рвется»! Отсюда вывод – доработать библиотеку так, чтобы построчный вывод производился только по 84 байта, а каждая новая строка для выводимых символов должна принудительно начинаться командой D3310position(x, y), где х=0, а y=0…5. Все это должно выглядеть, примерно следующим образом:

Читайте также  Блокинг генератор для светодиода

Sub D3310init
D3310ce = 0 ‘Display data input enable
D3310dc = 0 ‘Command mode
D3310commandout & H21 ‘Extended command mode, horizontal addressing
D3310commandout & HD5 ‘ Я установил такой контраст

D3310commandout & H45 ‘смещение картинки на 5 пикселов вверх, плюс
‘первоначально имеющееся смещение на 3 пиксела,
‘всего, таким образом, 8 пикселов или одна целая строка, будем
‘выводить НЕ с Нулевой строки, а с первой
‘эта команда работает только в расширенном режиме
‘поэтому первая команда инициализации стоит &H21 — переход в расширенный режим,
‘далее следует команда &HD5, у меня при
‘таком контрасте хорошо видно, ну и, наконец,
‘команда &H45, где 5 -смещение картинки
‘на упомянутые 5 пикселов

D3310commandout & H06 ‘Temperature setting
D3310commandout & H13 ‘Bias 1:48
D3310commandout & H20 ‘Normal command mode, horizontal addressing
D3310commandout & H0C ‘Uninverted Screen

D3310ce = 1 ‘Display data input disable
End Sub

‘………………………………………………………………………
‘Подпрограмма установки курсора

Sub D3310position ( byval D3310x As Byte , Byval D3310y As Byte )

‘……………………………………………………………………………
‘Подпрограмма вывода картинки на дисплей

Sub D3310bmpout ‘You must Restore D3310bmp* before you call D3310bmpout

Local D3310pixelloop As Word ‘Loop variable for the pixels
Local D3310column As Byte ‘Display column output

D3310ce = 0 ‘Display data input enable
D3310dc = 0 ‘Command mode
D3310commandout & H20 ‘Normal command mode, horizontal addressing
D3310commandout & H80 ‘Set RAM X address to 0

D3310commandout & H41 ‘Здесь для вывода картинки установим RAM Y address
‘ не 0, а 1, как и отмечалось, выводим картинку
‘не с нулевой, а с первой строки

‘никаких оптимизаций кода не проводилось.

D3310dc = 1 ‘Go to data mode

For D3310pixelloop = 0 To 83 ‘цикл вывода 84 байтов первой строки
Read D3310column
Call D3310dataout ( d3310column )
Next D3310pixelloop

D3310dc = 0 ‘Command mode
D3310commandout & H20 ‘Normal command mode, horizontal addressing
D3310commandout & H80 ‘Set RAM X address to 0

D3310commandout & H42 ‘вторая строка
D3310dc = 1 ‘Go to data mode

For D3310pixelloop = 84 To 167 ‘цикл вывода 84 байтов второй строки
‘байты второй строки картинки идут с 84по 166
Read D3310column
Call D3310dataout ( d3310column )
Next D3310pixelloop
‘……………
‘Продолжаем вывод строк

D3310dc 0)»>= 0 ‘Command mode
D3310commandout & H20 ‘Normal command mode, horizontal addressing
D3310commandout & H80 ‘Set RAM X address to 0
D3310commandout & H46 ‘вывод шестой строки
D3310dc = 1 ‘Go to data mode
For D3310pixelloop = 420 To 503 ‘цикл вывода 84 байтов шестой строки
Read D3310column
Call D3310dataout ( d3310column )
Next D3310pixelloop
D3310ce = 1 ‘Display data input disable

End Sub

NOKIA 5110 подключение

Сегодня я расскажу как подключать дисплей от некогда очень известного телефона НОКИА – 5110.
Мы научимся выводить текст и рисовать различную графику.
Вот примеры того, что будет в этом уроке.
Для подключения к Ардуино была написана библиотека, а для отображения кириллицы создан русификатор.
Он переводит UTF-8 в Windows-1251. Вот его мы и сможем увидеть на экране.
Нам потребуется две библиотеки от компании Adafruit

  1. Adafruit_GFX
  2. Вторая, Adafruit_PCD8544

Скачать можно с гитхаба или по ссылке в описании к видео.
Nokia-5110 – это Монохромный дисплей. Разрешение этого дисплея 84×48 точек.

Для подключения у него 8 посадочных мест, как сверху, так и снизу. Это сделано для удобства расположения дисплея в устройствах.


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


Важно не забыть, что питание дисплея 3,3 вольта. НЕ 5 ВОЛЬТ.
Тоже относится и для питания подсветки дисплея.

Подключение оставшихся выводов так же рассчитано на питание 3,3 вольта.
Я уже давно использую такие дисплеи и у меня на канале есть несколько видео где показаны разные устройства с выводом информации на Nokia-5110.
Подключаю напрямую к выводам Ардуино, БЕЗ РЕЗИСТОРОВ, и всё работает уже долгое время. Как будете делать вы я не знаю.
Можете подключать через дополнительные резисторы, или использовать преобразователи, которые получая на вход 5 вольт преобразуют его в 3,3 вольта.

Есть различные варианты дисплеев. Например, отличаются по цветам платы. Если у вас красная плата, и вывод обозначается как LIGHT — то он подключается к + 3,3 вольта.
Если синяя, и вывод обозначается как BL — то он подключается к земле.
Но лучше уточнить у продавца. Всегда могут быть исключения.

Так же я всегда устанавливаю подстроечный резистор на 10 кОм, чтобы регулировать яркость дисплея вручную. Вывод подсветки подключается к центральному контакту резистора, а два крайних – это +3,3 и GND.

Теперь давайте попробуем загрузить скетч из примера библиотеки и посмотрим, как он работает. Это довольно сложный пример для того, чтобы обучаться.
Я в своих примерах показываю, как сделать проще.

Рассмотрим первый скетч.
Скачать его можно по ссылке в описании к видео.
Я прокомментировал каждую строчку кода на нашем ВЕЛИКОМ и МОГУЧЕМ, что бы было понятно что и для чего.

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

void setup() <
display.begin();
display.setContrast(50); // установка контраста
display.clearDisplay();
>

void loop() <
display.setTextSize(1); // размер шрифта 1
display.setTextColor(BLACK); // цвет текста темный
display.println(«Hello, world!»); // отображаем надпись
display.setTextSize(2); // увеличиваем шрифт на 1
display.println(random(1,10000)); // выводим число от 1 до 10000
display.setTextSize(3);
display.print(random(1,10000));
display.display();
delay(1000); // задержка в секунду
display.clearDisplay(); // очищаем дисплей
>

Теперь попробуем вывести русский текст.
Загружаем скетч-2

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

void setup() <
display.begin();
display.cp437(true);
display.setContrast(50); // установка контраста
display.clearDisplay();
>

void loop() <
display.clearDisplay();
// Рисуем квадрат
display.drawRect(0, 0, 84, 48, BLACK); // отступ — Слева Сверху Ширина Высота

display.setTextSize(2); // размер шрифта 2
display.setTextColor(BLACK); // цвет текста чёрный
display.setCursor(8,5); // Устанавливаем курсор в то место откуда будем писать Лево-Верх
display.println(utf8rus(«Привет»));
display.setTextSize(2); // размер шрифта 2
display.setTextColor(BLACK); // цвет текста чёрный
display.setCursor(8,25);
display.println(utf8rus(«народ!»));

display.display();
delay(1000); // задержка в секунду
display.clearDisplay(); // очищаем дисплей
>

/* Функция перевода UTF-8 to Windows-1251 */
String utf8rus(String source)
<
int i,k;
String target;
unsigned char n;
char m[2] = < '0', '' >;

k = source.length(); i = 0;

if (n >= 0xC0) <
switch (n) <
case 0xD0: <
n = source[i]; i++;
if (n == 0x81) < n = 0xA8; break; >
if (n >= 0x90 && n = 0x80 && n

Теперь попробуем вывести русский текст.

И-и-и-и-и, ничего у нас не получилось.
Вместо русских букв получаются кракозябры.

Но не переживайте. Сейчас исправим.
Скопируем файл glcdfont.c в папку с библиотеками Ардуино.

Обычно это находится по адресу
Admin — Documents — Arduino – libraries — Adafruit-GFX-Library
копируем туда файл glcdfont.c с заменой

В setup добавляем строчку

void setup() <
display.begin();
display.cp437(true);

И в самый конец, после функции loop() копируем функцию перевода UTF-8 в Windows-1251

/* Функция перевода UTF-8 to Windows-1251 */
String utf8rus(String source)

И,… вуаля, теперь можно работать с русским шрифтом.

Нарисуем окружность.
Заполним весь экран кругами.
Раньше мы всегда писали чётными чернилами, а что если белыми?
Посмотрим?

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

void setup() <
// инициализация и очистка дисплея
display.begin();
display.clearDisplay();
display.display();

display.setContrast(50); // установка контраста
delay(1000);
>

// окружность в центре
display.clearDisplay();
display.drawCircle(display.width()/2, display.height()/2, 20, BLACK);
display.display();
delay(5000);
display.clearDisplay();

for (int16_t i=0; i

for (int16_t i=0; i

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

Дисплей Nokia 5110 имеет разрешение 84×48 точек. Поэтому и картинки должны быть не больше этого размера. В принципе здесь нет ничего нового.
Как делать массивы из картинок .bmp, я подробно рассказывал в видео про матрицу 16*16. Если не смотрели, то обязательно посмотрите.
Здесь нас интересует только 2 строчки.

static const unsigned char PROGMEM leoBmp[]

Где мы пишем название нашего массива

2. где мы его вызываем.
Цифры – это размер картинки.

display.drawBitmap(0, 0, leoBmp, 84, 48, BLACK);

А теперь выведем какой-нибудь логотип.
Например, льва.

Смотрите в видео.

Не забываем подписываться на канал, если вам интересно что я делаю.
Ставим лайк и оставляем комментарии – этим вы покажете мне, что я не просто так делаю обучающие уроки.
До встречи.