Немного подправил Вашу библиотеку, добавил инверсию цвета, иногда бывает очень полезно, например в меню при выделения пункта закрашенным прямоугольником текст будет инвертироваться:
1. изменить размерность массива видеобуфера и изменить его вывод, сейчас он просто по порядку, а нужно иначе, ктати это будет значительно медленнее чем сейчас работает, но проще либу переделать
2. изменить способ записи для букв, линий и т.д. а массив оставить как есть. сложнее библиотеку переделать, но зато скорость работы должна остаться на том же уровне
Это инверсия всего дисплея, а тут 3-й вариант, это "смотрится" массив и инвертируется, если надо :)
jeka_tm пишет:
А насчет поворота два варианта
1. изменить размерность массива видеобуфера и изменить его вывод, сейчас он просто по порядку, а нужно иначе, ктати это будет значительно медленнее чем сейчас работает, но проще либу переделать
2. изменить способ записи для букв, линий и т.д. а массив оставить как есть. сложнее библиотеку переделать, но зато скорость работы должна остаться на том же уровне
В идеале, хотелось бы, что бы была переменная, задающая поворот, но это долго, хочется по быстрому реализовать, буду разбираться… Смотрю как это сделано в библиотеках u8glib и Ucglib – это жесть!
Если что получится, опубликую здесь.
Кстати, у меня есть пример проверки дисплея 1203 с поддержкой русского языка, без библиотеки, может кому сгодится, работает так же на Arduino STM32:
здравствуйте. я немного изменил библиотеку от jeka_tm . убрал буфер экрана для экономии. пытаюсь выводить на дисплэй свои данные. проблема в том, что дисплэй мигает, когда я пытаюсь CS установить в активное положение, хоть мигает на пол сикунды, но это неприятное явление. а в родной библиотеке такого я не наблюдаю. хочу задать вопрос, почему дисплэй может мигать при подаче CS сигнала на дисплэй?
Убрал буфер. Выводишь по строкам и только текст? Или размер буфера уменьшил в 3 раза например как Хугобосс жертвуя процессорным временем, или может вообще до 1 строки буфер уменьшил?
Вообще не совсем понимаю смысла использовать вышеупомянутую библиотеку, убрав из неё буфер. Вокруг него, или на его основе (как угодно) построен весь принцип вывода изображения. В библиотеке собственно нет функций вывода чего либо на экран (на исключением самого буфера). Есть только запись данных в него. А если его нет то и выводить то нечего. Но я уверен, что Вам видней.
Я бы наверное сделал так:
Сначала подключил рабочую библиотеку и убедился в том что экран правильно подключён и нормально работает. А потом эксперементировать.
не знаю , в чём дело. вот , снял видео. я убедился, что всё работает с вашей библиотеки. сравнил коды вашей библиотеки и на AVRStudio. но с avrstudio не работает без мигания.
питание забыл подать , т.е. питание подавалось от микроконтроллера и я забыл ему на порт лог. 1 включить. так что такое может быть при отключенном питании.
плату я делал три месяца назад, уже забыл , как там разведено было, а увидел, когда проверять начал мультиметром общее напряжение. спасибо за ответы...
Я этим программированием только начал заниматься, и ничего толком не понимаю, мне это надо для разового своего проэкта. И в дальнейшем я не собираюсь заниматься програмированием. Поэтому прошу просто показать как это сделать. В библиотеке есть строка:void SendByte(char mode,unsigned char c);. но вставка данной строки в скетч вызывает ошибку при загрузке:Arduino: 1.8.4 (Windows 8.1), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"
Скетч использует 3226 байт (10%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 891 байт (43%) динамической памяти, оставляя 1157 байт для локальных переменных. Максимум: 2048 байт.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xc7
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xc7
Да, там есть строка:void Contrast(uint8_t c = 0x0D); Я её попробовал вставить в тело сетап, но опять ошибка при загрузке, хотя скомпилировалась без ошибок.
Arduino: 1.8.4 (Windows 8.1), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"
Скетч использует 3226 байт (10%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 891 байт (43%) динамической памяти, оставляя 1157 байт для локальных переменных. Максимум: 2048 байт.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x43
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x43
Проблема загрузки в плату. Помощь по загрузке: http://www.arduino.cc/en/Guide/Troubleshooting#upload .
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
С этим я разобрался, почему-то драйвер слетел, да и USB вход чего-то барахлит. Но потом всё на том же месте и осталось. Если можно просто напиши строки как надо их писать, я просто не знаю если честно, какая транскрипция написания.
Да устранил я эту проблему с программатором, у меня ардуино нано, чего-то перестал USB переходник работать, и я подсоединил внешний переходник. Сейчас загружается, но на экране ничего не видно, а влинком я всегда проверяю когда возникают проблемы с загрузкой. Но повторюсь на дисплее ничего не видно, поэтому и прошу подсказать как правильно написать этот оператор по контрастности, у меня не получается.
А откуда эти 20ms взялись? В даташите на STE2007 ничего похожего не нашел.
dWrite(CS, 0);
delay(20);
dWrite(CS, 1);
( для меня ) Это важно для того чтобы управлять 2-мя пинами (каждый на счету), CE я физически посадил на GND, а RST на VCC но не все оказалось так просто. Утром включаешь девайс и экранчик не стартует, выключаешь-включаешь - стартует и потом весь день стартует при включении безупречно.
Вот как раз и интересно из какой либы ноги растут. Возможно, это просто артефакт, возникший при многократном копировании из либы в либу и это тоже, кстати, чревато неожиданными багами. Иногда можно обойтись RC-цепочкой, не занимать пин контроллера и не вести дорожку через всю плату. На 5110 это делаю примерно вот так :
Вообще ИМХО инициализировать экран сразу после подачи питания на него не самая лучшая идея. Если есть возможность, лучше это делать спустя пол секунды (примерно). А управлять по двум пинам ИМХО, рано или поздно зависает.
Действительно странно. Кудато ж данные отправляются. С учётом того что во вторую и третью строку выводится нормально, а адрес вывода задаётся только для первой строки, вобще странно.
Проверь, в массив заносятся данные при первом выводе.
хм, интересно. После вывода последнего байта последней строки, если продолжают поступать данные, они выводятся с начала экрана?
Да, всё именно так. Кстати, при инициализации дисплея задаётся активная область.
hugoboss317 пишет:
Да, с "m" правильно. Сейчас посмотрел библиотеку для экрана с контроллером PCF8812, там я тоже так делал.
uint8_t step, p, b, m = 3;
switch(page){
case 3: step = 0; break; // 5 для
case 2: step = 3; break; // 2 Nokia
case 1: step = 6; m = 2; break;// 0 3410
Я попробовал сделать вывод не по три, а по четыре странице - экономия памяти в четыре раза, а скорость вывода изображения, соответственно, в четыре раза медленнее - совсем не комфортно.
Поворот экрана, попробовал - работает, текст, картинки поворачиваются, а геометрические фигуры надо корректировать...
Ребята а как из дисплея байты прочесть? Ну к примеру делаю я функцию публичной и шлю запрос на измерение
lcd.SendByte(0,0xDE); // Запрос температуры
Но как потом получить ответ из 7 байт?
Температура расчитывается потом по формуле T 1.875 TD = (ответ)° × – 40 C
Охота термометр замутить без датчиков. И еще вопрос, почему с дисплеем никто по I2C шине не работает? Я так понимаю его единоразово нужно настроить на I2C и потом спокойно с ним на 2х проводах работать.
Дисплей от Nokia 1100 позволяет только записывать данные в память (DDRAM) контроллера дисплея. Чтение из памяти не реализовано, хотя сам контроллер PCF8814 это позволяет. Поэтому, что бы определить, что у вас записано в памяти дисплея, необходимо в микроконтроллере организовывать буфер с данными для дисплея и отслеживать то, что записано, по нему.
Библиотека итак делает полную буферизацию.
Спасибо за библиотеку, она великолепна!!
Немного подправил Вашу библиотеку, добавил инверсию цвета, иногда бывает очень полезно, например в меню при выделения пункта закрашенным прямоугольником текст будет инвертироваться:
Это:
А насчет поворотав инициализации подай команду на поворот и наверно нужно будет указать новое разрешение дисплея, так как буфер будет неправильный
К сожалению, я только начинаю осваивать программирование, помогите понять, куда копать и как.
Я правильно понимаю, что нужно как-то преобразовать массив "LCD_RAM" при отправки его в дисплей, функция void LCD1202::Update() в развёрнутом виде...
Так инверсия насколько помню итак была. Достаточно поменять color. и обновить дисплей
Вообще либу делал не я, я код выложил, а cres насколько помню его оформил в либу
Надо даташит смотреть и пробовать. Я точно не понмю, там вроде встроенное что то было.
Вот кстати команда на инверсию
А насчет поворота два варианта
1. изменить размерность массива видеобуфера и изменить его вывод, сейчас он просто по порядку, а нужно иначе, ктати это будет значительно медленнее чем сейчас работает, но проще либу переделать
2. изменить способ записи для букв, линий и т.д. а массив оставить как есть. сложнее библиотеку переделать, но зато скорость работы должна остаться на том же уровне
Вот кстати команда на инверсию
Это инверсия всего дисплея, а тут 3-й вариант, это "смотрится" массив и инвертируется, если надо :)
А насчет поворота два варианта
1. изменить размерность массива видеобуфера и изменить его вывод, сейчас он просто по порядку, а нужно иначе, ктати это будет значительно медленнее чем сейчас работает, но проще либу переделать
2. изменить способ записи для букв, линий и т.д. а массив оставить как есть. сложнее библиотеку переделать, но зато скорость работы должна остаться на том же уровне
В идеале, хотелось бы, что бы была переменная, задающая поворот, но это долго, хочется по быстрому реализовать, буду разбираться… Смотрю как это сделано в библиотеках u8glib и Ucglib – это жесть!
Если что получится, опубликую здесь.
Кстати, у меня есть пример проверки дисплея 1203 с поддержкой русского языка, без библиотеки, может кому сгодится, работает так же на Arduino STM32:
здравствуйте. я немного изменил библиотеку от jeka_tm . убрал буфер экрана для экономии. пытаюсь выводить на дисплэй свои данные. проблема в том, что дисплэй мигает, когда я пытаюсь CS установить в активное положение, хоть мигает на пол сикунды, но это неприятное явление. а в родной библиотеке такого я не наблюдаю. хочу задать вопрос, почему дисплэй может мигать при подаче CS сигнала на дисплэй?
Привет. Не встречал такого ни разу
Убрал буфер. Выводишь по строкам и только текст? Или размер буфера уменьшил в 3 раза например как Хугобосс жертвуя процессорным временем, или может вообще до 1 строки буфер уменьшил?
без буфера вывожу текст. графики построить не удастся. но для текста подойдёт.
графики построить не удастся
Удастся. Было бы желание, ну или, в данном случаи, необходимость.
А причём тут CS и мигание? Или не подсветка мигает. Тогда что и как вообще мигает? Раскройте понятие.
мигает не подсветка, а сами пиксели, тоесть гаснут все , когда я ставлю cs=0 . может там что-то с питанием. завтра проверю.
Вообще не совсем понимаю смысла использовать вышеупомянутую библиотеку, убрав из неё буфер. Вокруг него, или на его основе (как угодно) построен весь принцип вывода изображения. В библиотеке собственно нет функций вывода чего либо на экран (на исключением самого буфера). Есть только запись данных в него. А если его нет то и выводить то нечего. Но я уверен, что Вам видней.
Я бы наверное сделал так:
Сначала подключил рабочую библиотеку и убедился в том что экран правильно подключён и нормально работает. А потом эксперементировать.
Вот вот. Для вывода просто по строкам уже есть библиотеки
не знаю , в чём дело. вот , снял видео. я убедился, что всё работает с вашей библиотеки. сравнил коды вашей библиотеки и на AVRStudio. но с avrstudio не работает без мигания.
https://youtu.be/RwwIUGzY3TM
Хз страннно. Как будто очистка экрана включена с выводом, а наложение это наложение
наложение я сам сделал, чтобы было видно смену картинки.
Кидай код без лишних функций
Ух а переписал то как)) Было же читаемо
я ж пока для себя писал. не заморачиватесь. я спросил, может , кто знает. буду дальше пытаться. этот код под avr studio.
питание забыл подать , т.е. питание подавалось от микроконтроллера и я забыл ему на порт лог. 1 включить. так что такое может быть при отключенном питании.
И все? Разве такие вещи не проверяются в первую очередь?
плату я делал три месяца назад, уже забыл , как там разведено было, а увидел, когда проверять начал мультиметром общее напряжение. спасибо за ответы...
Всем привет! Подключил к Ардуино нано дисплей Nokia 1110i/ И выскочила проблема, текст еле видно, как поднять контрастность этого дисплея. Вот скетч:
Сразу скажу питание дисплея 2.8 вольта, подсветка 3.6 вольта.
А в библиотеке разве нет?
Для установки контрастности в контроллер PCF8814 нужно послать команду 0x20, а затем значение от 0 до 31 прибавив его к 0х80.
т.е. 0х80 это минимальная а 0х1F максимальная.
Я этим программированием только начал заниматься, и ничего толком не понимаю, мне это надо для разового своего проэкта. И в дальнейшем я не собираюсь заниматься програмированием. Поэтому прошу просто показать как это сделать. В библиотеке есть строка:void SendByte(char mode,unsigned char c);. но вставка данной строки в скетч вызывает ошибку при загрузке:Arduino: 1.8.4 (Windows 8.1), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"
У меня этой библиотеки нет, поэтому я не знаю какие функции там есть. Но физически для данного контроллера (экрана) такая возможность есть.
Откройте файл библиотеки с расширением .h, там среди протатипов функций должно быть что то вроде setContrast(......., ......)
Эту функцию нучно, со своим значением, поместить в тело setup()
Да, там есть строка:void Contrast(uint8_t c = 0x0D); Я её попробовал вставить в тело сетап, но опять ошибка при загрузке, хотя скомпилировалась без ошибок.
ошибка при загрузке, хотя скомпилировалась без ошибок.
это как?
Вам не отвечает програматор.
Так эту проблему и решайте сначала. Посмотрите в настройках правильно ли Вы его выбрали?
С этим я разобрался, почему-то драйвер слетел, да и USB вход чего-то барахлит. Но потом всё на том же месте и осталось. Если можно просто напиши строки как надо их писать, я просто не знаю если честно, какая транскрипция написания.
Ещё раз. Проблема изначально не с кодом.
Ардуино не видит программатора. А почему, это я уж не знаю что там наворочено.
Наверное надо вернуться к "блинку".
Да устранил я эту проблему с программатором, у меня ардуино нано, чего-то перестал USB переходник работать, и я подсоединил внешний переходник. Сейчас загружается, но на экране ничего не видно, а влинком я всегда проверяю когда возникают проблемы с загрузкой. Но повторюсь на дисплее ничего не видно, поэтому и прошу подсказать как правильно написать этот оператор по контрастности, у меня не получается.
Ну попробуй максимальную установить
Всем привет, прокоментируйте пожалуйста откуда в библиотеке эти манипуляции с CS ?
// Инициализация дисплея
Неа. Вот RST насколько помню можно просто подтянуть к 3.3В. Просто кто то использует кто то нет. И остается 3 самых главных пина.
20мс это из либы одной. Там писали при инициализации нужно время. А чем тебе мешает? Это один раз делается.
Хочешь по 2 пинам получай такие глюки, я тоже как то пытался. Не помню что конкретно, но решил для себя что минимум 3 пина.
Если пинов не хватает это не значит что именно дисплей нужно мучать, остальное посмотри. В конце концов можно другой чип применить
Вот как раз и интересно из какой либы ноги растут. Возможно, это просто артефакт, возникший при многократном копировании из либы в либу и это тоже, кстати, чревато неожиданными багами. Иногда можно обойтись RC-цепочкой, не занимать пин контроллера и не вести дорожку через всю плату. На 5110 это делаю примерно вот так :
Вообще ИМХО инициализировать экран сразу после подачи питания на него не самая лучшая идея. Если есть возможность, лучше это делать спустя пол секунды (примерно). А управлять по двум пинам ИМХО, рано или поздно зависает.
20мс при включении тебе погоды не сделают. Хочешь совсем все вычистить? Так я пробовал, еще что нибудь удалишь начинается нестабильная работа
Господа, помогите решить проблемку.
Я переписал библиотеку PCF8814_NEW под очень распространённый дисплей OLED SSD1306 I2C 128x64.
Либа понравилоась тем, что буфер экрана разделён на части и позволяет экономить оперативу, которой в ATTiny85 всего 510 байт.
Переписанная библиотека тут: https://yadi.sk/d/ClFdmug86PqpXg
Всё работает, но есть проблема - первая строка, высотой 8 пикселей, затираеться, не пойму почему.
Так должно быть: https://yadi.sk/i/TLmKN5iklvaqrw
А получаеться так, в процессе обновления экрана: https://yadi.sk/i/9Sqwgu5xY-TZUg
Действительно странно. Кудато ж данные отправляются. С учётом того что во вторую и третью строку выводится нормально, а адрес вывода задаётся только для первой строки, вобще странно.
Проверь, в массив заносятся данные при первом выводе.
Я уже и под I2C и под SPI интерфейс написал - результат тот же: что-то с алгоритмом отправки массива в дисплей.
Только по SPI побыстрее будет :)
Кстати, нашёл алгорит поворота выводимого изображения, надо будет опробовать...
Надо разбираться дальше...
Ураа!
Всё заработало: буфер экрана на ТРИ строки, а у дисплея ВОСЕМЬ строк, И буфер переписываеться ТРИ раза, для "своей" полуСтраницы.
Имеем:
Получаеться, что последняя полустраница должна быть не на ТРИ строки, а на ДВЕ, иначе, почему-то несуществующяя строка 9-я переноситься на первую.
Делаем для 3-й полуСтроницы условие m=2
хм, интересно. После вывода последнего байта последней строки, если продолжают поступать данные, они выводятся с начала экрана?
Да, с "m" правильно. Сейчас посмотрел библиотеку для экрана с контроллером PCF8812, там я тоже так делал.
хм, интересно. После вывода последнего байта последней строки, если продолжают поступать данные, они выводятся с начала экрана?
Да, всё именно так. Кстати, при инициализации дисплея задаётся активная область.
Да, с "m" правильно. Сейчас посмотрел библиотеку для экрана с контроллером PCF8812, там я тоже так делал.
Я попробовал сделать вывод не по три, а по четыре странице - экономия памяти в четыре раза, а скорость вывода изображения, соответственно, в четыре раза медленнее - совсем не комфортно.
Поворот экрана, попробовал - работает, текст, картинки поворачиваются, а геометрические фигуры надо корректировать...
Ребята а как из дисплея байты прочесть? Ну к примеру делаю я функцию публичной и шлю запрос на измерение
lcd.SendByte(0,0xDE); // Запрос температуры
Но как потом получить ответ из 7 байт?
Температура расчитывается потом по формуле T 1.875 TD = (ответ)° × – 40 C
Охота термометр замутить без датчиков. И еще вопрос, почему с дисплеем никто по I2C шине не работает? Я так понимаю его единоразово нужно настроить на I2C и потом спокойно с ним на 2х проводах работать.
Кстати: lcd.SendByte(0,0xA7); // инверсия цвета
Дисплей от Nokia 1100 позволяет только записывать данные в память (DDRAM) контроллера дисплея. Чтение из памяти не реализовано, хотя сам контроллер PCF8814 это позволяет. Поэтому, что бы определить, что у вас записано в памяти дисплея, необходимо в микроконтроллере организовывать буфер с данными для дисплея и отслеживать то, что записано, по нему.
потому-что у меня дисплей 1202, он китайцами посажен на плату, которая работаето только по SPI 7-ми битному.
а чо там в 7 бит китайцы запихнуть умудрились?