Библиотека для работы с дисплеем Nokia 3310

Заинтересовали меня ЖК дисплеи, самыми доступными по цене оказались китайские клоны Nokia 3310. На всемирной свалке информации по данному дисплею полно, я старался систематизировать всё и написать код библиотеки на качественно новом уровне. Так что в кого есть аналогичные стекляшки или же просто интересно — добро пожаловать под «cut» :)
Библиотека базируется на исходниках от Sylvain Bissonnette (думаю он первопроходец в этом деле, писал под IAR, для оригинального дисплея) и Fandi Gunawan (для оригинального дисплея; avr-gcc, WinAVR). Также много светлых мыслей (особенно про китайский клон) взято из статьи автора Aheir, его библиотека поддерживает китайца, но к сожалению написана на «расово неверном» CodeVision AVR :) Поэтому, собрав достаточное количество информации, решил написать свою 3310 Library (компилятор — WinAVR, GCC for AVR platform).

Отличительные особенности версии 1.0 (06.08.2011):
+ Добавлена поддержка китайских клонов LCD Nokia 3310
+ Полный перевод комментариев к исходному коду драйвера
+ Таблица символов драйвера дополнена кириллицей (упрощенная Windows-1251)
+ Добавлена функция рисования окружностей LcdCircle
— Исправлены ошибки в проверке корректности координат при вызове функций рисования
— Исправлена ошибка в функции LcdSingleBar (неверная отрисовка по y)

На данный момент доступны такие функции: (подробности смотрим внутри n3310.c)
void LcdInit       ( void );   // Инициализация
void LcdClear      ( void );   // Очистка буфера
void LcdUpdate     ( void );   // Копирование буфера в ОЗУ дисплея
void LcdImage      ( const byte *imageData );   // Рисование картинки из массива в Flash ROM
void LcdContrast   ( byte contrast );   // Установка контрастности дисплея
byte LcdGotoXYFont ( byte x, byte y );   // Установка курсора в позицию x,y
byte LcdChr        ( LcdFontSize size, byte ch );   // Вывод символа в текущей позиции
byte LcdStr        ( LcdFontSize size, byte dataArray[] );   // Вывод строки сохраненной в RAM
byte LcdFStr       ( LcdFontSize size, const byte *dataPtr );   // Вывод строки сохраненной в Flash ROM
byte LcdPixel      ( byte x, byte y, LcdPixelMode mode );   // Точка
byte LcdLine       ( byte x1, byte y1, byte x2, byte y2, LcdPixelMode mode );   // Линия
byte LcdCircle     ( byte x, byte y, byte radius, LcdPixelMode mode);   // Окружность
byte LcdRect       ( byte x1, byte y1, byte x2, byte y2, LcdPixelMode mode );   // Прямоугольник
byte LcdSingleBar  ( byte baseX, byte baseY, byte height, byte width, LcdPixelMode mode );   // Один 
byte LcdBars       ( byte data[], byte numbBars, byte width, byte multiplier );   // Несколько

Схема подключения дисплея, пример для ATmega8:

Чтобы получить 3.3V питание, не долго думая скорчевал LD1117 с дохлой материнки. При желании можно сделать преобразователь уровней и только дисплей кормить на 3.3V, отличная статья по этому поводу — «Согласование логических уровней 5В и 3.3В устройств»

Китайский ЖК представляет собой вот такой модуль:

В отличие от оригинала на стекле нет металлизированных контактов (!), невозможно просто припаяться (те контакты, что виднеются на фото сделаны у виде пружинок и просто прижаты к поверхности дисплея). Поэтому с креплением возникают некоторые нюансы. Я выкрутился из ситуации таким способом:

Брутально вырезал ту часть, что меня интересует и закрепил проволокой прямо к плате. Припаял проводники к родимым контактам-пружинкам которые вынуждено оставил:

Вот еще несколько скринов работы библиотеки:



Главное отличие оригинального LCD от клона — контроллер. В оригинале стоит PCD8544, в клоне — черт знает что. Известно наверняка что буфер клона побольше + присутствуют некоторые команды которых нет в оригинале, например сдвиг картинки. При общении с контроллером китайца нужно явно адресовать данные, иначе картинка поплывет:


При написании реализации передачи данных для клона (функция LcdUpdate(void)) я использовал сдвиг, чего не поддерживает оригинал. Ниже представлена таблица команд для PCD8544 с известными на сегодняшний день уточнениями для неоригинального контроллера (выделено красным):


Распиновка контактов:

Естественно данный дисплей не очень крут на сегодняшний день, но при всей своей простоте/дешевизне имеет разрешение 84*48 точек, что позволяет разместить 6 строк текста по 14 символов (размером 7x5 пикселей, реально 8x5, но один пиксель междустрочный интервал).

Ссылки:
N3310Lib — выложил на GitHub, удобная зараза штука :)
3310_Lib_v1.0.7z — старая ссылка на DropBox
FastFont — самописная рисовалка растровых шрифтов
Статья от Aheir — много полезной информации именно про китайский LCD
Ещё один метод подключения — полезная инфа от Sicorski

Late Update:
* В инете бытует мысль, что в китайском клоне применяется ST7576;
* Многие утверждают что дисплей отлично себя чувствует и при 5V;
* Существует ненулевая вероятность, что я напишу пару новых статей :)
  • +9
  • 07 августа 2011, 14:25
  • XANDER

Комментарии (119)

RSS свернуть / развернуть
Круто!
0
А что за китайский LCD, где брать?
0
  • avatar
  • Vga
  • 07 августа 2011, 15:07
Продается как запчасть к телефону Nokia 3310 (подозреваю что они все китайские), оригинал сложно найти (разве что с рабочего телефона содрать)
0
Покупал в Профи, там контакты были с метализацией.
0
При последовательной заливке данных в буфер контроллера картинка отображалась правильно или нет? Если правильно — значит это оригинал.
0
Стыдно признаться — я его еще не тестил :(
0
Ну вот, будет повод достать его и протестировать, а то лежит без дела пылью припадает :)
0
Тоже покупал в профите несколько штук разными набегами. В зависимости от партии они могут быть с металлизацией, могут быть без неё.

Те, что с металлизацией работали нормально с «библиотекой» из ардуиновских референсов. Те, что без — выдавали частично инвертированую картинку (вроде бы) и снизу кашу.
К неметаллизированому подключался, по примеру неизвестного умельца из интернетов, при помощи язычков от разломанного PBS.

В оригинальной статье были использованы язычки от «Arduino Stackable Header» (отличаются длинным штырьком) и после «одевания» их на экран товарищ для фиксации заливал всё термоклеем и к штырькам припаивался.
+1
(подозреваю что они все китайские)
это на точке продажи дисплеев?
0
В радиомагазине на Щорса :) А что за точка продажи дисплеев у Житомире?
0
В радиомагазине на Щорса 8), я о нем и говорил, хотел заменить дисплей в Nokia 1200, купил у них, поставил и оказалось что текущая версия на телефоне китайца уже не принимает. Так что судя по всему у них там все дисплеи китайские.
0
или не с рабочего :)
0
Не рабочего сложно найти. Они такие живучие, хоть легенды складывай. Я одного специально держу целым только ради змейки (реально лишь аккумулятор сдох). Snake на 3310 по удобству/быстродействию/безпонтовости уступает разве что змейке на тетрисе :)
0
Он уже легендарный)
Я правда лишь один раз вживую видел. Но тот мне не отдадут — самим его живучесть нравится)
0
У меня тетя до сих пор с 3310 ходит. Раз в два три года только аккум меняет и все.
0
Почему бы и нет, хороший телефон же.
Как он кстати при долгой эксплуатации? У мамы 3100, на вид тоже вполне надежный кирпичик (если им не швыряться по крайней мере, пластик не так уж толст). А внутрь заглянул — пластик корпуса уже понемногу сыпется, в первую очередь крепежные части.
0
А на картинке с распиновкой вид сверху?
0
Добавил распиновку
0
Дисплей нормально работает при 5 вольтах, проверено как на китайцах, так и на оригиналах.
0
Аналогично, оба работают на 5В, на 3.3В даже не включал.
0
0
Согласен, работает. Но лишний раз рисковать не хочется :)
0
А у меня не стал работать.
0
Входы толерантны к +5V?
0
Надеюсь что да, МК программирую через ISP без отключения дисплея, пока что без фатальных последствий :) Документального подтверждения не видел, особенно для китайского контроллера. Люди пишут про успешную работу при питании 5 вольт, то что уже говорить про толерантность по входам…
0
Ну, то при питании 5В. Если они подключены диодами на VCC внутри контроллера, то +5В на них при питании 3.3 будет не очень хорошо.
Как кстати защищают 5V tolerant входы? Стабилитронами?
0
Только что перечитал даташит на PCD8544 от PHILIPS, там на 17 страничке в таблице написано MAX Vdd = +7V, MAX all input voltages = Vdd + 0.5
0
Значит защита на диодах и при 3.3В питания 5В на входе он не любит — начнет от них питаться.
В принципе это и проверить можно, попытавшись его запустить на паразитном питании.
0
Ну значит от +5 вполне можно питать
0
А на 18 написано: Vdd 2.7 − 3.3 V
0
Вот засада, кому верить?
17 страница — LIMITING VALUES
18 страница — DC CHARACTERISTICS

Также на 17 странице notes 1: Stresses above those listed under limiting values may cause permanent damage to the device.
0
Absolute Maximum Ratings — это значения, которые может выдержать девайс. Гарантируется, что он не сдохнет. Не гарантируется, что он будет нормально работать. Верить стр 18.
0
Лучше значит не испытывать судьбу, кормить ему 3.3V для надежности.
0
Я питал его 5 вольтами. «Ниразу ниумер». Причем несколько. За то что сгорит не боялся, у меня их достаточно =), только надо было контрасноть Vop регурировать. Лучше использовать дисплей от 1100 (если точно номер вспомнил), там и припаяться можно и для подсветки есть.
0
Я тоже питал пятью вольтами, тестил на платке с 32 мегой, разъём не отключал. Китайский дисплей, кстати, не завёлся с китайским дефайном, пришлось компилить как под оригинал. Правда, пришлось контраст подкрутить- мои дисплеи завелись только с 0x27, в противном случае- нечитабельно. К счастью, попались дисплеи вполне паябельные, то есть тоже были пружинки, но сняв их удалось напрямую подпаять провода. Послезавтра пойду- ещё два возьму.
0
Твои дисплеи значит «более оригинальные» :)
0
Ага. Кстати, как вы выводите какое-нибудь число на дисплей, допустим любимую расовую int i = 65535? Я написал костыль, но это не то.
0
itoa библиотечная или самопальная и вывод строки.
а для любителей извращений printf("%d", i)
0
Ещё вариант:
char str[11];
int number = 123;
sprintf(str, "%d", number);
0
0
У меня дисплей оказался тоже без надписи «NOKIA» но! на месте надписи была скобочка повернутая на 90 градусов. То есть слева и справа одинаковый рисуночек. Библиотека заработала без никаких проблем! Автору спасибо!
0
А в телефоне Nokia 1110i аналогичный дисплей?
Эта библиотека будет с ним работать?
0
  • avatar
  • rad
  • 29 августа 2011, 19:08
К сожалению у меня нет такого дисплея, чтобы проверить :) Возможно там другой контроллер, иное разрешение… Но общие принципы такие же, думаю при желании можно допилить и под него.
0
Привет!
повторил проект с дисплеем на меге8 1 в 1 на макетке
все завилось сразу — обрадовался
перекомпелил все под 16 мегу и подсоеденил с рекомендациями в исходниках
SDIN — на MOSI SCK — SCL
загружаю в МК — тишина
выключаю отсоеденяю программатор от разьема включаю
опа картинка НОКИА выводиться и все ступор дальше не идет
подумал может из за тайменгов у меня на 16 меги 16МГц был — поставил 8МГц как и в оригинальной схеме
компелю загружаю = така же фигня
картинка есть а дальше прога не идет
в чем косяк куда копать
0
Привет, частота тут явно ни при чем :) Если отобразилась картинка, должно быть аппаратная часть в норме ==> ошибки программные. Что именно подразумевается под «перекомпелил»? Посмотрите внимательно все свои изменения, возможно допустили ошибку. Попробуйте отладочные средства, например JTAG, UART, на крайняк можно и светодиодом помигать…
0
я менял только назначение пинов подключения дисплея и частоту кварца
и компилил в Студии
сегодня провозился пол дня
и когда подключил максимально похожим на оригинальную схему все заработало даже на 16МГц
подключил так
#define LCD_PORT PORTB
#define LCD_DDR DDRB

// Распиновка порта
#define LCD_DC_PIN PB3
#define LCD_CE_PIN PB4
#define SPI_MOSI_PIN PB5 // SDIN дисплея обязательно подключаем к MOSI аппаратного SPI
#define LCD_RST_PIN PB6
#define SPI_CLK_PIN PB7 // SCLK дисплея обязательно подключаем к SCK аппаратного SPI
и все пошло чудно
спасибо за библу работает шустро и четко
мой вопрос с проблемой снят

буду добавлять еще функции вывода числа
и вывод строки в инверсном виде — для меню
Спасибо
0
Спасибо огромное за библиотеку! Теперь буду её к Ардуино прикручивать.
Кстати, дисплеи 3310 пару раз за 50р брал в точках ремонта телефонов. Оба раза попались фирменные:)
0
Подскажите, что не так делаю. Подключаю к атмега128, пины подключил согласно рекомендациям использовать «железный» SPI, частоту и тип процессора исправил, 5вольт от контроллреа и 3.3 вольтовый дисплей согласовал. Дисплей молчит. Хотя делал в codevisionavr — всё заработало сразу. А в avr studio не получается. Осцилографом вижу похожие сигналы, которые мне выдавал контроллер после codevision.
0
Приветствую, сложно что-либо полезное подсказать, не четко сформулирована просьба. Исходя из написанного, могу предположить что проблема именно программная -> не получилось подружиться с avr-gcc… Осциллограф необходим достаточно навороченный, а лучше логический анализатор даже, чтобы детально исследовать SPI посылки, но это не обязательно. А так сказать «вижу похожие сигналы» равносильно ничего не сказать :) Возможно не правильно сконфигурирован SPI, дисплей, или ещё косяк какой то. Главное целеустремленность — и тогда всё получиться ;)
0
Спасибо за ответ :) Просто я, как бы сказать… начинающий, поэтому четко сформулировать незнаю как. Попросить Вас показать вариант проекта для моего контроллера наверное будет слишком нагло да и не интересно :) А разве недостаточно в программе от меги8 изменить просто на мегу128, изменить пины, изменить частоту кварца… вроде всё?
0
Всё, разобрался, чуток напутал с пинами :) Большое спасибо за проект, очень позновательно!!!
0
Здравствуйте! Я «НАЧИНАЮЩИЙ». Четвёртый день не могу компилировать этот проект в AVR Studio 5. постоянно Error: undefined reference to `LcdInit' и до Error undefined reference to `LcdUpdate' что не так делаю не пойму! В 4-ой компилируется, но я ХОЧУ РАЗОБРАТЬСЯ в пятой.
0
Файлик с реализацией этих функций в проектик добавить надо.
0
В С тебе разбираться надо. Алсо вот статья на тему.
0
Вот, как раз и разбираюсь… за сцылочку на статью спасибо.
0
Не пойму почему у меня кирилица не отображается… да и HEX больно большой получаетьсят (14К) а ведь и к тини2313 подключают…
0
Уважаемые, подскажите очень хочется вывести переменную i типа float
вывожу так:

char Buf[15];
int c = i; // здесь i переменная float
itoa ( c, Buf, 10 );
LcdGotoXYFont(0,2);
LcdFStr(FONT_1X,(unsigned char*)PSTR(«заголовок»));
LcdGotoXYFont(11,2);
LcdStr(FONT_1X,(unsigned char*) Buf);

сильно не пинайте учусъ я еще.

P.S. За библиотеку огромное спасибо!
0
Простой, но немного прожорливый для мелких МК способ:
char Buf[24];
float fnum = 12.345;
sprintf(Buf, "%f", fnum);
При желании можно написать свою функцию и оптимизировать её под конкретную задачу.
0
Раз это такая универсальная статья, почему нет реализованного программного SPI?
Это ведь удобнее в конструктивном плане.
0
Сделал проект в Proteus выдает такое и все

dl.dropbox.com/u/4198955/123_123.jpg
0
Попробуйте в n3310.h закомментировать строку
#define CHINA_LCD
0
спасибо… просмотрел…
0
а как инвертировать написанную строку например
LcdFStr(FONT_1X,(unsigned char*)PSTR(«Меню»));

Нужно инвертировать
0
Надо доработать библиотеку.
Например, заменить в функции LcdChr в двух местах
pgm_read_byte( &(FontLookup[ch][i]) ) << 1
на
(pgm_read_byte( &(FontLookup[ch][i]) ) << 1) xor Invert

Затем в начало, там где переменные, добавить
byte Invert=0;
void SetInvert(byte invert)
{
if (invert) Invert=0xFF; else Invert=0;
}

а в файл n3310.h добавить
void SetInvert(byte invert);

Тогда вызовом SetInvert(1 или 0) можно включать и отключать инверсное отображение текста.
0
Здравствуйте, попробовал сделать такие изменения, все равно текст в инверсном виде не выводится! Как быть?
0
Вообще ничего не изменилось?
SetInvert(1) вызываете?
«xor Invert» заменили на "^ Invert" (это опечатка была)?
0
Сделал все как Вы описали, получился иверт, но вот маленькая «трабла» — получился инверт с разделением символов:


Как избавиться от этого? Хочу сделать Выбор элементов «меню» данной функцией.
0
Там где-то чуть ниже идёт что-то вроде:
// Горизонтальный разрыв между символами
LcdCache[LcdCacheIdx] = 0x00;

Заменить 0x00 на Invert
0
Ок! Спасибо! Получилось, но есть еще нюансик небольшой — ранее использовал библиотеку в проекте от Aheir (Драйвер для LCD от Nokia 3310), сейчас возникла необходимость писать на Atmel Studio 6.2. Так вот как сделать что бы получилось как на рисунке справа? :(слева, то что получилось с этой библиотекой):
0
Я так понимаю, что нужно массив с шрифтом менять, т. е. что бы в нем каждый символ был приподнят на один «бит»?
0
Похоже на то. Нужно все байты поделить (а может умножить, точно не помню) на 2.
Кстати вот тут:
pgm_read_byte( &(FontLookup[ch][i]) ) << 1
можно попробовать просто убрать "<< 1", это и есть домножение на 2.
0
Ура! Все получилось как нужно! Убрал <<1! :) Огромное спасибо за помощь!
0
Появился еще вопрос. Почитав комментарии так и не понял как правильно выводить например «Время», делал вот так:

uint8_t min = 10, sec = 55;
char buf[8];
LcdGotoXYFont(0,1);
snprintf(buf, sizeof(buf), PSTR("%02d:%02d"), min, sec);
LcdStr(FONT_1X, buf);
Но ничего не выводится… В комментариях это обсуждение прекратилось… Как правильно делать?
0
Поправка: теперь сделал вот так:

unsigned char buf[8];
uint8_t min = 11, sec = 22;
...
LcdGotoXYFont(0,1);
snprintf(buf, sizeof(buf),"%02d:%02d", min, sec);
LcdStr(FONT_1X, buf);
LcdUpdate();


Работает:


Но Atmel Studio выдает варнинг:
0


Как исправить?
0
и как быть если не нужно обновлять изображение полностью, а только время например или температуру, как в моем случае?
0
Функция LcdUpdate автоматически обновляет только те строки дисплея, что обновилась, так что можно оставить как есть. Либо переписывать её под себя.
0
Допустим если мне нужно выводить время, как это сделать в виде переменной??
LcdFStr(FONT_1X,(unsigned char*)PSTR(«00:00»));
0
Видимо, воспользоваться одной из многочисленных вариаций на тему sprintf/snprintf.
0
как бы не получается…
0
Что именно не получается? Должно быть что-то типа такого:
char buf[8];

snprintf(buf, sizeof(buf), PSTR(«02d:02d»), min, sec);
LcdFStr(FONT_1X, buf);

Вроде так, если нигде не опечатался.
0
0
Судя по сообщениям об ошибках, snprintf не объявлена и по какой-то причине gcc считает ее встроенной. На вскидку не помню, если ли в libc для AVR snprintf. Если есть, то надо, как минимум, включить файл заголовков string.h, если же нет, то надо добавить в проект реализацию и, соответственно, ее декларацию.
0
Все гораздо проще. При внимательном изучении кода стало понятно, что у вас типографские кавычки вокруг первого формата, а дальше — обычные (как и должно быть).
0
Ещё нюанс. LcdFStr — это печать строки из флэша, т.е. константной. Если надо из памяти, как в данном случае, то LcdStr нужна.
0
Да, возможно, но главная проблема тут в другом, как я выше написал.
0
Так кто ж спорит.
0
тут главная проблема во мне, не понимаю в этом пока. разбираюсь.
0
то есть сначала нужно сформировать строку, а потом уже её отправлять?!
0
Угу. Причем отправлять ее чуть другим методом, не LcdFStr, а LcdStr. Ну и что бы код компилировался, вокруг формата (02d:02d) нужно заменить типографские кавычки (как вот тут: «типографские кавычки») на обычные, вот такие "". Это движок сайта гадит, заменять кавычки в коде — зло. Ну и копипастить нужно внимательно :) Да, кстати, желательно (я бы сказал даже обязательно) нужно добавить #include <string.h> в инклуды в начале кода.
0
после добавления #include <stdio.h> ошибка перестала выходить, что это неизвестная директива
0
Можно процитировать все, что пишет компилятор?
0
и еще разве так (02d:02d) ?, а почему не так? %02d:%02d
Или я снова туплю… Мне как новичку довольно сложно понять вообще, что формируется в этой строке
snprintf(buf, sizeof(buf), PSTR(«02d:02d»), min, sec)
0
Не, все верно, там процент должен быть (а скобки быть не должно, вокруг формата должны быть только обычные кавычки), это я туплю.

P.S. функция snprintf «как бы» печатает сформатированный вывод в строку. Первые два параметра — указатель на буффер, куда попадет результат и размер этого буффера. Если даже ошибиться в формате или данных и результат будет больше по размеру, чем этот буффер, функция сама обрежет лишнее. Есть еще sprintf(), там передается только буффер (ну и формат с переменными). Она, не проверяет выход за границу буффера и в случае ошибки просто начнет писать дальше в памяти, перетирая все, что попадется по дороге и устраивая вашему приложению харакири.
0
=)
snprintf(buf, sizeof(buf), PSTR("%02d:%02d", min, sec);
в min и sec нужно загонять переменные значения, да?
0
сейчас во такую ошибку выдает
../main.c:19:57: error: macro «PSTR» passed 3 arguments, but takes just 1
0
Вы скобку забыли закрыть в PSTR. Нужно так:

snprintf(buf, sizeof(buf), PSTR("%02d:%02d"), min, sec);


Вы скобку забыли закрыть в PSTR. Нужно так:

snprintf(buf, sizeof(buf), PSTR("%02d:%02d"), min, sec);
0
Упс, извиняюсь, 2 раза текст скопировал :)
0
вроде тут все написано, но никак не втыкается…
we.easyelectronics.ru/Soft/formatnyy-vyvod-na-si-dlya-mikrokontrollerov.html
0
Товарищи! Need HELP! Посмотрите, пожалуйста, тему вот тут
0
Спасибо за библиотеку.
Портировал под STM8/ARM
0
Thanks :)
Сообщество — это круто: открытость информации + коллективный разум -> направления для будущего!
0
А Схема точно правильно нарисована??
0
У вас есть конструктивные пожелания?
0
всё верно… Я сам накосячил.
0
#define CHINA_LCD закоментировал avr studio 4 при компиляции выдает:
rm -rf main.o n3310.o 3310_Lib.elf dep/* 3310_Lib.hex 3310_Lib.eep 3310_Lib.lss 3310_Lib.map
Build succeeded with 0 Warnings…
mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=14318000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT n3310.o -MF dep/n3310.o.d -c ../n3310.c
/usr/bin/sh: -Wall: command not found
make: [n3310.o] Error 127 (ignored)
Build succeeded with 0 Warnings…
Loaded plugin Proteus VSM Viewer
Loaded plugin STK500
gcc plug-in: No AVR Toolchain installation found. The AVR GCC plug-in can still be used if you set up your own build tools.
Loaded plugin AVR GCC
Loaded partfile: C:\AVR Tools\PartDescriptionFiles\ATmega8.xml
gcc plug-in: No AVR Toolchain installation found. The AVR GCC plug-in can still be used if you set up your own build tools.
gcc plug-in: No AVR Toolchain installation found. The AVR GCC plug-in can still be used if you set up your own build tools.
gcc plug-in: No AVR Toolchain installation found. The AVR GCC plug-in can still be used if you set up your own build tools.
gcc plug-in: No AVR Toolchain installation found. The AVR GCC plug-in can still be used if you set up your own build tools.

и половина файлов из проекта пропадает уже не знаю что делать
0
А как настроить контраст, а то плохо видно? (китаец, в остальном все нормально)

Здесь меняю «contrast» переменную, но результата невидно

void LcdContrast ( byte contrast )
{
LcdSend( 0x21, LCD_CMD ); // Ðàñøèðåííûé íàáîð êîìàíä
LcdSend( 0x80 | contrast, LCD_CMD ); // Óñòàíîâêà óðîâíÿ êîíòðàñòíîñòè /0x80 contrast
LcdSend( 0x20, LCD_CMD ); // Ñòàíäàðòíûé íàáîð êîìàíä, ãîðèçîíòàëüíàÿ àäðåñàöèÿ
}
0
Из IARa копируете сюда код?
0
AVRstudio 4
0
Перед копированием меняйте раскладку на русский язык. После этого только копируйте и вставляйте в браузер. Так русский текст будет читаться.
0
Вот ымменно.
0
  • avatar
  • DVF
  • 13 мая 2012, 21:12
Если Вас не затруднит — можете написать, как выводить массивы? (новичок я)
например, вот как можно вывести на дисплей — это

char *string[3]= {«raz»,«dva»,«tri»};
0
Разобрался! Что то затупил :)

char *string[3] = {«a»,«b», «c», «d»};

int main()
{
char buf;
LcdInit();

for (;;)
{
LcdClear();

LcdGotoXYFont(0,2);
buf=string[1]; // Меняется! Ура
LcdStr(FONT_1X, buf);
0
буф должен быть типа указателя.
0
а как программный SPI подключить, чтобы к порту С соеденить дисплей?
0
Модернизировать функции LcdInit и LcdSend :)
0
В китайском экранчике стоит чип ST7576 102x64 pixel. так что по этому при инициализации виден внизу шум на экране, так как не все пиксели сбрасываем при clear функции, да и при инициализации коммандами:
//ST7576
writeCommand(0x21); // LCD Extended Commands
writeCommand(0x13); // LCD bias mode1:48

writeCommand(0xE1); // higher Vop, too faint at default (Contrast 0x80 to 0xFF)
writeCommand(0x05); // partial display mode

writeCommand(0x20); // extended instruction set control (H=0)
writeCommand(0x09); // all display segments on
clear();

writeCommand(0x08); // display blank
writeCommand(0x0c); // LCD in normal mode (0x0d = inverse mode)

delay(100);

// Place the cursor at the origin…
writeCommand(0x80);
writeCommand(0x40);
ничего сдвигать никуда не надо, а только очистить всю ram память экрана.
0
Прошу помощи по данной библиотеке, не получается вывести русские символы — мне кажется что-то со смещением. Так как английский алфавит норм, а русские квадратики!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.