Библиотека для работы с дисплеем 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)
Схема подключения дисплея, пример для 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;
* Существует ненулевая вероятность, что я напишу пару новых статей :)

Библиотека базируется на исходниках от 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
Продается как запчасть к телефону Nokia 3310 (подозреваю что они все китайские), оригинал сложно найти (разве что с рабочего телефона содрать)
При последовательной заливке данных в буфер контроллера картинка отображалась правильно или нет? Если правильно — значит это оригинал.
Тоже покупал в профите несколько штук разными набегами. В зависимости от партии они могут быть с металлизацией, могут быть без неё.

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

В оригинальной статье были использованы язычки от «Arduino Stackable Header» (отличаются длинным штырьком) и после «одевания» их на экран товарищ для фиксации заливал всё термоклеем и к штырькам припаивался.
Те, что с металлизацией работали нормально с «библиотекой» из ардуиновских референсов. Те, что без — выдавали частично инвертированую картинку (вроде бы) и снизу кашу.
К неметаллизированому подключался, по примеру неизвестного умельца из интернетов, при помощи язычков от разломанного PBS.
В оригинальной статье были использованы язычки от «Arduino Stackable Header» (отличаются длинным штырьком) и после «одевания» их на экран товарищ для фиксации заливал всё термоклеем и к штырькам припаивался.
Не рабочего сложно найти. Они такие живучие, хоть легенды складывай. Я одного специально держу целым только ради змейки (реально лишь аккумулятор сдох). Snake на 3310 по удобству/быстродействию/безпонтовости уступает разве что змейке на тетрисе :)
Он уже легендарный)
Я правда лишь один раз вживую видел. Но тот мне не отдадут — самим его живучесть нравится)
Я правда лишь один раз вживую видел. Но тот мне не отдадут — самим его живучесть нравится)
Надеюсь что да, МК программирую через ISP без отключения дисплея, пока что без фатальных последствий :) Документального подтверждения не видел, особенно для китайского контроллера. Люди пишут про успешную работу при питании 5 вольт, то что уже говорить про толерантность по входам…
Ну, то при питании 5В. Если они подключены диодами на VCC внутри контроллера, то +5В на них при питании 3.3 будет не очень хорошо.
Как кстати защищают 5V tolerant входы? Стабилитронами?
Как кстати защищают 5V tolerant входы? Стабилитронами?
Только что перечитал даташит на PCD8544 от PHILIPS, там на 17 страничке в таблице написано MAX Vdd = +7V, MAX all input voltages = Vdd + 0.5
Вот засада, кому верить?
17 страница — LIMITING VALUES
18 страница — DC CHARACTERISTICS
Также на 17 странице notes 1: Stresses above those listed under limiting values may cause permanent damage to the device.
17 страница — LIMITING VALUES
18 страница — DC CHARACTERISTICS
Также на 17 странице notes 1: Stresses above those listed under limiting values may cause permanent damage to the device.
Absolute Maximum Ratings — это значения, которые может выдержать девайс. Гарантируется, что он не сдохнет. Не гарантируется, что он будет нормально работать. Верить стр 18.
Я тоже питал пятью вольтами, тестил на платке с 32 мегой, разъём не отключал. Китайский дисплей, кстати, не завёлся с китайским дефайном, пришлось компилить как под оригинал. Правда, пришлось контраст подкрутить- мои дисплеи завелись только с 0x27, в противном случае- нечитабельно. К счастью, попались дисплеи вполне паябельные, то есть тоже были пружинки, но сняв их удалось напрямую подпаять провода. Послезавтра пойду- ещё два возьму.
Привет!
повторил проект с дисплеем на меге8 1 в 1 на макетке
все завилось сразу — обрадовался
перекомпелил все под 16 мегу и подсоеденил с рекомендациями в исходниках
SDIN — на MOSI SCK — SCL
загружаю в МК — тишина
выключаю отсоеденяю программатор от разьема включаю
опа картинка НОКИА выводиться и все ступор дальше не идет
подумал может из за тайменгов у меня на 16 меги 16МГц был — поставил 8МГц как и в оригинальной схеме
компелю загружаю = така же фигня
картинка есть а дальше прога не идет
в чем косяк куда копать
повторил проект с дисплеем на меге8 1 в 1 на макетке
все завилось сразу — обрадовался
перекомпелил все под 16 мегу и подсоеденил с рекомендациями в исходниках
SDIN — на MOSI SCK — SCL
загружаю в МК — тишина
выключаю отсоеденяю программатор от разьема включаю
опа картинка НОКИА выводиться и все ступор дальше не идет
подумал может из за тайменгов у меня на 16 меги 16МГц был — поставил 8МГц как и в оригинальной схеме
компелю загружаю = така же фигня
картинка есть а дальше прога не идет
в чем косяк куда копать
Привет, частота тут явно ни при чем :) Если отобразилась картинка, должно быть аппаратная часть в норме ==> ошибки программные. Что именно подразумевается под «перекомпелил»? Посмотрите внимательно все свои изменения, возможно допустили ошибку. Попробуйте отладочные средства, например JTAG, UART, на крайняк можно и светодиодом помигать…
я менял только назначение пинов подключения дисплея и частоту кварца
и компилил в Студии
сегодня провозился пол дня
и когда подключил максимально похожим на оригинальную схему все заработало даже на 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
и все пошло чудно
спасибо за библу работает шустро и четко
мой вопрос с проблемой снят
буду добавлять еще функции вывода числа
и вывод строки в инверсном виде — для меню
Спасибо
и компилил в Студии
сегодня провозился пол дня
и когда подключил максимально похожим на оригинальную схему все заработало даже на 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
и все пошло чудно
спасибо за библу работает шустро и четко
мой вопрос с проблемой снят
буду добавлять еще функции вывода числа
и вывод строки в инверсном виде — для меню
Спасибо
Подскажите, что не так делаю. Подключаю к атмега128, пины подключил согласно рекомендациям использовать «железный» SPI, частоту и тип процессора исправил, 5вольт от контроллреа и 3.3 вольтовый дисплей согласовал. Дисплей молчит. Хотя делал в codevisionavr — всё заработало сразу. А в avr studio не получается. Осцилографом вижу похожие сигналы, которые мне выдавал контроллер после codevision.
Приветствую, сложно что-либо полезное подсказать, не четко сформулирована просьба. Исходя из написанного, могу предположить что проблема именно программная -> не получилось подружиться с avr-gcc… Осциллограф необходим достаточно навороченный, а лучше логический анализатор даже, чтобы детально исследовать SPI посылки, но это не обязательно. А так сказать «вижу похожие сигналы» равносильно ничего не сказать :) Возможно не правильно сконфигурирован SPI, дисплей, или ещё косяк какой то. Главное целеустремленность — и тогда всё получиться ;)
Спасибо за ответ :) Просто я, как бы сказать… начинающий, поэтому четко сформулировать незнаю как. Попросить Вас показать вариант проекта для моего контроллера наверное будет слишком нагло да и не интересно :) А разве недостаточно в программе от меги8 изменить просто на мегу128, изменить пины, изменить частоту кварца… вроде всё?
Уважаемые, подскажите очень хочется вывести переменную 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. За библиотеку огромное спасибо!
вывожу так:
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. За библиотеку огромное спасибо!
Раз это такая универсальная статья, почему нет реализованного программного SPI?
Это ведь удобнее в конструктивном плане.
Это ведь удобнее в конструктивном плане.
а как инвертировать написанную строку например
LcdFStr(FONT_1X,(unsigned char*)PSTR(«Меню»));
Нужно инвертировать
LcdFStr(FONT_1X,(unsigned char*)PSTR(«Меню»));
Нужно инвертировать
Надо доработать библиотеку.
Например, заменить в функции 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) можно включать и отключать инверсное отображение текста.
Например, заменить в функции 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) можно включать и отключать инверсное отображение текста.
Здравствуйте, попробовал сделать такие изменения, все равно текст в инверсном виде не выводится! Как быть?
Вообще ничего не изменилось?
SetInvert(1) вызываете?
«xor Invert» заменили на "^ Invert" (это опечатка была)?
SetInvert(1) вызываете?
«xor Invert» заменили на "^ Invert" (это опечатка была)?
Ок! Спасибо! Получилось, но есть еще нюансик небольшой — ранее использовал библиотеку в проекте от Aheir (Драйвер для LCD от Nokia 3310), сейчас возникла необходимость писать на Atmel Studio 6.2. Так вот как сделать что бы получилось как на рисунке справа? :(слева, то что получилось с этой библиотекой):

Появился еще вопрос. Почитав комментарии так и не понял как правильно выводить например «Время», делал вот так:
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);
Но ничего не выводится… В комментариях это обсуждение прекратилось… Как правильно делать?
и как быть если не нужно обновлять изображение полностью, а только время например или температуру, как в моем случае?
Функция LcdUpdate автоматически обновляет только те строки дисплея, что обновилась, так что можно оставить как есть. Либо переписывать её под себя.
Допустим если мне нужно выводить время, как это сделать в виде переменной??
LcdFStr(FONT_1X,(unsigned char*)PSTR(«00:00»));
LcdFStr(FONT_1X,(unsigned char*)PSTR(«00:00»));
Судя по сообщениям об ошибках, snprintf не объявлена и по какой-то причине gcc считает ее встроенной. На вскидку не помню, если ли в libc для AVR snprintf. Если есть, то надо, как минимум, включить файл заголовков string.h, если же нет, то надо добавить в проект реализацию и, соответственно, ее декларацию.
Угу. Причем отправлять ее чуть другим методом, не LcdFStr, а LcdStr. Ну и что бы код компилировался, вокруг формата (02d:02d) нужно заменить типографские кавычки (как вот тут: «типографские кавычки») на обычные, вот такие "". Это движок сайта гадит, заменять кавычки в коде — зло. Ну и копипастить нужно внимательно :) Да, кстати, желательно (я бы сказал даже обязательно) нужно добавить #include <string.h> в инклуды в начале кода.
Не, все верно, там процент должен быть (а скобки быть не должно, вокруг формата должны быть только обычные кавычки), это я туплю.
P.S. функция snprintf «как бы» печатает сформатированный вывод в строку. Первые два параметра — указатель на буффер, куда попадет результат и размер этого буффера. Если даже ошибиться в формате или данных и результат будет больше по размеру, чем этот буффер, функция сама обрежет лишнее. Есть еще sprintf(), там передается только буффер (ну и формат с переменными). Она, не проверяет выход за границу буффера и в случае ошибки просто начнет писать дальше в памяти, перетирая все, что попадется по дороге и устраивая вашему приложению харакири.
P.S. функция snprintf «как бы» печатает сформатированный вывод в строку. Первые два параметра — указатель на буффер, куда попадет результат и размер этого буффера. Если даже ошибиться в формате или данных и результат будет больше по размеру, чем этот буффер, функция сама обрежет лишнее. Есть еще sprintf(), там передается только буффер (ну и формат с переменными). Она, не проверяет выход за границу буффера и в случае ошибки просто начнет писать дальше в памяти, перетирая все, что попадется по дороге и устраивая вашему приложению харакири.
вроде тут все написано, но никак не втыкается…
we.easyelectronics.ru/Soft/formatnyy-vyvod-na-si-dlya-mikrokontrollerov.html
we.easyelectronics.ru/Soft/formatnyy-vyvod-na-si-dlya-mikrokontrollerov.html
#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.
и половина файлов из проекта пропадает уже не знаю что делать
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.
и половина файлов из проекта пропадает уже не знаю что делать
- MasterFISHER
- 07 мая 2012, 16:02
- ↓
А как настроить контраст, а то плохо видно? (китаец, в остальном все нормально)
Здесь меняю «contrast» переменную, но результата невидно
void LcdContrast ( byte contrast )
{
LcdSend( 0x21, LCD_CMD ); // Ðàñøèðåííûé íàáîð êîìàíä
LcdSend( 0x80 | contrast, LCD_CMD ); // Óñòàíîâêà óðîâíÿ êîíòðàñòíîñòè /0x80 contrast
LcdSend( 0x20, LCD_CMD ); // Ñòàíäàðòíûé íàáîð êîìàíä, ãîðèçîíòàëüíàÿ àäðåñàöèÿ
}
Здесь меняю «contrast» переменную, но результата невидно
void LcdContrast ( byte contrast )
{
LcdSend( 0x21, LCD_CMD ); // Ðàñøèðåííûé íàáîð êîìàíä
LcdSend( 0x80 | contrast, LCD_CMD ); // Óñòàíîâêà óðîâíÿ êîíòðàñòíîñòè /0x80 contrast
LcdSend( 0x20, LCD_CMD ); // Ñòàíäàðòíûé íàáîð êîìàíä, ãîðèçîíòàëüíàÿ àäðåñàöèÿ
}
В китайском экранчике стоит чип 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 память экрана.
//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 память экрана.
Комментарии (119)
RSS свернуть / развернуть