Да, согласно рисунка так и есть. Я даже когда вынашивал эту идею, не думал что может получится.
в кратции работает примерно так:
Предположем нужно напечатать линию с верху вниз на весь экран (или даже больше, случайно).
Процесс вывода заключён в операторах DO While.
Начинаем заполнять наш массив [96][3] и заполняем его только до координат y=23. всё что меньше или больше - игнарируется.
Заполнили, выводим в верхние 3 банка экрана что получилось и сразу его чистим.
Теперь в него заносим только то, что имеет координаты по y от 24 до 47. если, к примеру печатаем букву вкоординату 46 по у, то вносим в массив только два верхних бита каждого байта символа, остальное return.
и снова выводим массив в среднюю часть и чистим, и с третьей частью то же.
на картинке ниже припер, не компелирует если закоментировать включение шрифта, который не используется. Все файлы лежат как положено (на фото видно). Самое интересное что обсолютно идентичный пример с очень похожей библиотекаой в том же месте компелирует без проблем(второе фото) . Все включение идентичны, всё точь в вочь, только одна компелирует другая нет.
Имеешь ввиду вместо уголков кавычки? Пробовал. Интересно то, что всё на 99% одинаково, включения в библиотеки одинаковые, скетчи 100% одинаковые, в назаваниях разница в одной цифре, и папки библиотек рядом даже...
Если не сложно попробуй у себя закоментить в в этом примере шрифт и скомпелировать.
В библиотеке (пост 204) я вкладывал генератор шрифтов. Правда там только на 2 размера 5х8 и 10х16. Рисуешь по одному символу и можно просто открыть в библиотеке готовый шрифт и подставить по одному свои. Если нужен другой размер, придётся немного повозиться.
В библиотеке (пост 204) я вкладывал генератор шрифтов. Правда там только на 2 размера 5х8 и 10х16. Рисуешь по одному символу и можно просто открыть в библиотеке готовый шрифт и подставить по одному свои. Если нужен другой размер, придётся немного повозиться.
Спасибо! Хорошая прога!) И для картинок тоже понравилась))
Нет, нельзя. Это глобальная переменная, объявленная в файле библиотеки, просто в скетче она будет как необъявленная, а как раз чтоб получить её значение, нужна функция которая и возвратит (return) значение. Хотя как таковое оно нам и не надо. Да и наверняка кто то в место тройки что-нибудь всунет и хрен знает что получится и....... какой дебил такое написал? ))))))
>>зачем return если нигде не используется возвращаемое значение,
как это не используется??? Значение этой перименной как раз ключевое. В функции LcdPageTWO(void) определяется в какую часть экрана выводится массив со сформированым изображением.
В функции (так же ключевой) LcdPixel определяется заносится пиксел в массив или потом как-нибудь. Все остальные функции формирования изображения основаны на выводе пиксела.
>> voidLcdPageONE()
Я бы рекомендовал почитать про функции, что они в общих чертах могут (или не могут)
В теле функции мы меняем значение переменнй page, которое нам знать и нахрен не надо, но оно нужно при выполнении других функций, для этого функции LcdPageONE и LcdPageTWO должны возвращать не "ничего" (void), а заданный тип uint8_t.
поэтому void нельзя а uint8_t можно и нужно. А return page, для того чтоб функция знала что именно возвращать, ведь там может быть хоть мильён переменных такого же типа. Да да, знаю что там только page, ну помог компелятору, ну и так правельней немного. Привычку надо такую иметь чтоб потом долго баги не искать.
вчера вышел покурить и тут до меня дошло как можно сделать с массивом на треть экрана, а не на весь, просто нужно одно и тоже что выводится повторить 3 раза и отсеять для нужной области
Да, это собственно и есть серьёзный недостаток - огромное количество времени вывода на экран. С картинкой и текстом может быть до 0,44 секунды. Но
Во-первых я думаю что и с полноразмерным массивом не на много быстрее и во-вторых, как ни крути а заявленая задача( а именно вывод на килобайтнорй оперативке символов в указанную координату и полноценной графики) выполнена на 100%
Я думаю зря ты велосипед изобретать начал. Биба отлаженая была, всё подогнаное. У меня на ней 3 проэкта и всё как часики. Там только не так давно я убирал глюки, связаные с перегрузкой функций вывода чисел, по тойже ссылке можно обновить и float не выводить, проеобразовывать надо но это по желанию и по необходимости да и не сложно.
Я же писал, float не выводятся, не в этой не под PCF8812. Преобразуй в зависимости от того, сколько цифр после запятой тебе надо. Лучше преобразуй в знаковую четырёхбайтную. Потом если нужна (к примеру) одна цифра - печатаешь делённое на 10 (не делишь на десять), печатаешь точку, печатаешь остаток от деления на 10. Удачи.
Я же писал, float не выводятся, не в этой не под PCF8812. Преобразуй в зависимости от того, сколько цифр после запятой тебе надо. Лучше преобразуй в знаковую четырёхбайтную. Потом если нужна (к примеру) одна цифра - печатаешь делённое на 10 (не делишь на десять), печатаешь точку, печатаешь остаток от деления на 10. Удачи.
Простите, а можно пример, как правильней это сделать. А то у меня плохо получается. после запятой немогу вывести например ( ",04", ",30" и т.д). получается так - (",4" , ",3").
float a = 1.0; // имеем переменную
a - 1.96; //выполняем с ней операции
a *= 100; //переносим запятую до целого числа
int b = a; //приводим к нужному типу
................
Lcdprint(b/100); // печатаемчелое число но реально на 100 не делим
Lcdprint(","): // печатаем запятую
Lcdprint(b%100); // печатаем остаток от деления на 100 т.е. то что после запятой
//при этом не забываем что истинная величина обоих переменных всё ещё умноженна на 100.
Столкнулся с непонятной мне проблемой. Мне нужно прибавлять\убавлять к числу 0.1 по нажатию кнопки. Пробывал по юарту делать это во float убавляется и прибавляется нормально. Но если перевести из float в int данным способом получается какая-то каша. Вот пример с сериал портом (с дисплеем анологично все):
float e = 0.0;
int p1 = 3;
int p2 = 4;
void setup(){
pinMode(p1, INPUT);
pinMode(p2, INPUT);
Serial.begin(9600);
}
void loop(){
if (digitalRead(p1)==HIGH){e-=0.1;}
if (digitalRead(p2)==HIGH){e+=0.1;}
e *= 10;
int n = e;
Serial.print (n/10);
Serial.print (",");
Serial.println (n%10);
delay(1000);
}
Вот что приходит:
0,0
0,1
1,1
11,1
111,1
1111,1
-1996,-1
-300,-1
-3000,-9
2759,2
1382,4
0,0
0,0
0,0
0,0
//.......далее зацикленно идет 0.0 и не реагирует на кнопки.
http://yadi.sk/d/EaFCqVjvA7pZh
да чистил и удалил. еще раз выложил
А можно повторить библиотеку для 1100 вот сюда freearduino@gmail.com
Буду очень благодарен!
http://yadi.sk/d/CXjuENmaEEwun
папка дисплеи
http://yadi.sk/d/CXjuENmaEEwun
папка дисплеи
Спасибо!
https://yadi.sk/d/HzxsXwb9f9QqN
Библиотека для lcd NOKIA 1100, 1202, 1203, 1280
возможность вывода текста, графики и изображений на контроллелай с оперативкой 1К
В примерах стоит посмотреть специфику вывода на экран.
1К? видеобуфер есть или нет? если нет то рисовать и писать только в пределах строк?
Это та биба которую я давно написал. Я про неё говорил, но гавкнулся HDD и она там осталась. Выкладывал тут похожую и вот по ней востановил эту.
Рисуй как хочешь, пиши в любых координатах (не в строках а в пикселях)
Вот из примера:
и оперативку не жрет? а то я видеобуфер использовал чтобы рисовать что и где угодно
а просто картинку на весь экран я без буфера могу. просто если твою картинку вывести на 4 пикселя ниже ничего не поплывет?
На самом деле это часть обрезанной картинки. Под "львом" надпись, но её не видно, она за пределами (часть массива изображения, не текст)
В библиотеке игнарируются вывод за пределами
и почти всё (за исключением пары геометрических фигур) можно не только включить или выключить, но и инвертировать. В примерах тоже есть
Так вот же она... я её в 181 посте показывал
хорошо гляну как нибудь как ты все делаешь. может свой код перепишу заодно) может и без буфера можно обойтись
Без буфера нельзя, только я его меньше сделал чтоб оперативки хватало
да увидел. но не понял как ты элементы тогда рисуешь которые из одного переходят в другой
Что значит переходят? Имеешь ввиду инверсию?
если да, то там как обычно: Если при выводе задаю ON, включаю, если OFF, выключаю, если INV, то читаю состояние заданного пикселя и инвертирую.
у тебя если правильно понял 3 блока по 3 строки. получается верх середина и центр. каждый отрисовываешь по отдельности
но как если что то выходит за пределы блока
блоки ведь не хранятся. значит не знаем что там должно быть. стало быть его надо восстановить с учетом всех элементов и что то добавить
Да, согласно рисунка так и есть. Я даже когда вынашивал эту идею, не думал что может получится.
в кратции работает примерно так:
Предположем нужно напечатать линию с верху вниз на весь экран (или даже больше, случайно).
Процесс вывода заключён в операторах DO While.
Начинаем заполнять наш массив [96][3] и заполняем его только до координат y=23. всё что меньше или больше - игнарируется.
Заполнили, выводим в верхние 3 банка экрана что получилось и сразу его чистим.
Теперь в него заносим только то, что имеет координаты по y от 24 до 47. если, к примеру печатаем букву вкоординату 46 по у, то вносим в массив только два верхних бита каждого байта символа, остальное return.
и снова выводим массив в среднюю часть и чистим, и с третьей частью то же.
на словах понятно. а как сделал думаю даже разбираться не буду. просто попробую что нибудь сделать с использованием либы
хорошо что дисплеев понакупал 1202, сейчас они в 4 раза подорожали. почти по 100р за шт. не зря набрал с учетом что пригодится
Да, я тогда глядя на тебя тоже 5 штучек в Харькове заказал )
Нужна помощь. Немогу разобраться с нюансом.
на картинке ниже припер, не компелирует если закоментировать включение шрифта, который не используется. Все файлы лежат как положено (на фото видно). Самое интересное что обсолютно идентичный пример с очень похожей библиотекаой в том же месте компелирует без проблем(второе фото) . Все включение идентичны, всё точь в вочь, только одна компелирует другая нет.
второй пример
На самом деле я бы не парился но у меня такая-же проблема с другим дисплеем. Там только одня библиотека и тоже не видит файлов. Что не так? http://arduino.ru/forum/programmirovanie/mega-i-displei-ot-siemens-s65#comment-104657
а попробуй для интереса вместо кавычек уголки поставить
а попробуй для интереса вместо кавычек уголки поставить
Имеешь ввиду вместо уголков кавычки? Пробовал. Интересно то, что всё на 99% одинаково, включения в библиотеки одинаковые, скетчи 100% одинаковые, в назаваниях разница в одной цифре, и папки библиотек рядом даже...
Если не сложно попробуй у себя закоментить в в этом примере шрифт и скомпелировать.
https://yadi.sk/i/V3Kic-jNfBD4C
https://yadi.sk/i/It28Q_HBfBD55
все норм. если закоментировать ошибки валятся
Ну это как бы не совсем нормально. Что может мешать увидеть файлы библиотеки?
Я когда набросал на этот экран бибу без буфера, была такая же фигня и я потом её как то решил, а как не помню.
перезагрузи комп)) чтобы отсечь такой вариант
Здравствуйте еще раз. А можно пример того как сделать свой шриФт? Пересмотрел всю тему не нашел (может не заметил))
В библиотеке (пост 204) я вкладывал генератор шрифтов. Правда там только на 2 размера 5х8 и 10х16. Рисуешь по одному символу и можно просто открыть в библиотеке готовый шрифт и подставить по одному свои. Если нужен другой размер, придётся немного повозиться.
Спасибо
В библиотеке (пост 204) я вкладывал генератор шрифтов. Правда там только на 2 размера 5х8 и 10х16. Рисуешь по одному символу и можно просто открыть в библиотеке готовый шрифт и подставить по одному свои. Если нужен другой размер, придётся немного повозиться.
появилось несколько вопросов по либе
например кусок из примера
по пунктам:
запускаем LcdPageONE()
вот что в либе
зачем return если нигде не используется возвращаемое значение, фактически получается можно написать
или вместо LcdPageONE() просто page=3;
Начну с конца.
>> или вместо LcdPageONE() просто page=3;
Нет, нельзя. Это глобальная переменная, объявленная в файле библиотеки, просто в скетче она будет как необъявленная, а как раз чтоб получить её значение, нужна функция которая и возвратит (return) значение. Хотя как таковое оно нам и не надо. Да и наверняка кто то в место тройки что-нибудь всунет и хрен знает что получится и....... какой дебил такое написал? ))))))
>>зачем return если нигде не используется возвращаемое значение,
как это не используется??? Значение этой перименной как раз ключевое. В функции LcdPageTWO(void) определяется в какую часть экрана выводится массив со сформированым изображением.
В функции (так же ключевой) LcdPixel определяется заносится пиксел в массив или потом как-нибудь. Все остальные функции формирования изображения основаны на выводе пиксела.
>>
void
LcdPageONE()
Я бы рекомендовал почитать про функции, что они в общих чертах могут (или не могут)
В теле функции мы меняем значение переменнй page, которое нам знать и нахрен не надо, но оно нужно при выполнении других функций, для этого функции LcdPageONE и LcdPageTWO должны возвращать не "ничего" (void), а заданный тип uint8_t.
поэтому void нельзя а uint8_t можно и нужно. А return page, для того чтоб функция знала что именно возвращать, ведь там может быть хоть мильён переменных такого же типа. Да да, знаю что там только page, ну помог компелятору, ну и так правельней немного. Привычку надо такую иметь чтоб потом долго баги не искать.
вчера вышел покурить и тут до меня дошло как можно сделать с массивом на треть экрана, а не на весь, просто нужно одно и тоже что выводится повторить 3 раза и отсеять для нужной области
залез в твою либу так и оказалось)))
Так я думал ты это ещё в 213-ом посте понял
да. но как формируется 3 блока. как он запоминает за один проход где что должно быть. и вот вчера осенило что проходов 3 штуки)))
короче недостаток памяти компенсируется процессорным временем
Да, это собственно и есть серьёзный недостаток - огромное количество времени вывода на экран. С картинкой и текстом может быть до 0,44 секунды. Но
Во-первых я думаю что и с полноразмерным массивом не на много быстрее и во-вторых, как ни крути а заявленая задача( а именно вывод на килобайтнорй оперативке символов в указанную координату и полноценной графики) выполнена на 100%
намного быстрее. но дело не в этом. у тебя функции передачи очень медленные. shiftout лучше заменить на более быстрое
кстати ты не против я использую часть твоего кода из либы? переделываю под себя
>> ты не против я использую часть твоего кода из либы?
Да будь как дома
держи. станет намного быстрее
что то медленно. вывод прямоугольника и обновление всего экрана 67 миллисекунд
буду дальше оптимизировать
плюс глюки: смещается картинка
Я думаю зря ты велосипед изобретать начал. Биба отлаженая была, всё подогнаное. У меня на ней 3 проэкта и всё как часики. Там только не так давно я убирал глюки, связаные с перегрузкой функций вывода чисел, по тойже ссылке можно обновить и float не выводить, проеобразовывать надо но это по желанию и по необходимости да и не сложно.
ничего разберусь. не в первый раз
не люблю просто длинные без нужды записи. например вместо
у меня
еще вместо массива [96][3] сделал [288]. так проще. дисплей все равно сам перебрасывает на следующую строку
инвертирование мне не нужно поэтому вместо
сделал
понимаю что мелочь и по сути не так важно, но мне так проще))
Почему то не хочет выводить переменные типа float (( Что посоветуете?
Я же писал, float не выводятся, не в этой не под PCF8812. Преобразуй в зависимости от того, сколько цифр после запятой тебе надо. Лучше преобразуй в знаковую четырёхбайтную. Потом если нужна (к примеру) одна цифра - печатаешь делённое на 10 (не делишь на десять), печатаешь точку, печатаешь остаток от деления на 10. Удачи.
немного подправленная. попробуй. только reset дисплея подцепи к 3,3в
Я же писал, float не выводятся, не в этой не под PCF8812. Преобразуй в зависимости от того, сколько цифр после запятой тебе надо. Лучше преобразуй в знаковую четырёхбайтную. Потом если нужна (к примеру) одна цифра - печатаешь делённое на 10 (не делишь на десять), печатаешь точку, печатаешь остаток от деления на 10. Удачи.
Простите, а можно пример, как правильней это сделать. А то у меня плохо получается. после запятой немогу вывести например ( ",04", ",30" и т.д). получается так - (",4" , ",3").
оператор "остаток от деления" "%"
Вот крутилось в голове что что-то забыл, так и есть.
Нужно после печати запятой добавить
Спасибо! Работает.
Столкнулся с непонятной мне проблемой. Мне нужно прибавлять\убавлять к числу 0.1 по нажатию кнопки. Пробывал по юарту делать это во float убавляется и прибавляется нормально. Но если перевести из float в int данным способом получается какая-то каша. Вот пример с сериал портом (с дисплеем анологично все):
Вот что приходит:
Как это можно вылечить?
а делить на 10 после печати кто будет?
Вы умножили float на 10 чтоб преобразовать в int.
При печати int Вы него не делите а просто выводите нужное кол-во символов, но float то умножен.
Делить надо перед добавлением 0,1 или вычитанием
блин делать библиотеки не мое. нужна помощь
https://yadi.sk/d/IMPvehTFjHBrC
а делить на 10 после печати кто будет?
Вы умножили float на 10 чтоб преобразовать в int.
При печати int Вы него не делите а просто выводите нужное кол-во символов, но float то умножен.
Делить надо перед добавлением 0,1 или вычитанием