Библиотека для LCD Nokia 1100

freearduino
Offline
Зарегистрирован: 21.04.2014

jeka_tm пишет:

http://yadi.sk/d/EaFCqVjvA7pZh

да чистил и удалил. еще раз выложил

 

А можно повторить библиотеку для 1100 вот сюда freearduino@gmail.com
Буду очень благодарен!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://yadi.sk/d/CXjuENmaEEwun

папка дисплеи

freearduino
Offline
Зарегистрирован: 21.04.2014

jeka_tm пишет:

http://yadi.sk/d/CXjuENmaEEwun

папка дисплеи

Спасибо!

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

https://yadi.sk/d/HzxsXwb9f9QqN

Библиотека для lcd NOKIA 1100, 1202, 1203, 1280

возможность вывода текста, графики и изображений на контроллелай с оперативкой 1К

В примерах стоит посмотреть специфику вывода на экран.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1К? видеобуфер есть или нет? если нет то рисовать и писать только в пределах строк?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

Рисуй как хочешь, пиши в любых координатах (не в строках а в пикселях)

Вот из примера:

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и оперативку не жрет? а то я видеобуфер использовал чтобы рисовать что и где угодно

а просто картинку на весь экран я без буфера могу. просто если твою картинку вывести на 4 пикселя ниже ничего не поплывет?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

На самом деле это часть обрезанной картинки. Под "львом" надпись, но её не видно, она за пределами (часть массива изображения, не текст)

В библиотеке игнарируются вывод за пределами 

и почти всё (за исключением пары геометрических фигур) можно не только включить или выключить, но и инвертировать. В примерах тоже есть

Так вот же она... я её в 181 посте показывал

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хорошо гляну как нибудь как ты все делаешь. может свой код перепишу заодно) может и без буфера можно обойтись

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Без буфера нельзя, только я его меньше сделал чтоб оперативки хватало

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да увидел. но не понял как ты элементы тогда рисуешь которые из одного переходят в другой

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Что значит переходят? Имеешь ввиду инверсию?

если да, то там как обычно: Если при выводе задаю ON, включаю, если OFF, выключаю, если INV, то читаю состояние заданного пикселя и инвертирую.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у тебя если правильно понял 3 блока по 3 строки. получается верх середина и центр. каждый отрисовываешь по отдельности

но как если что то выходит за пределы блока

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

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, согласно рисунка так и есть. Я даже когда вынашивал эту идею, не думал что может получится. 

в кратции работает примерно так:

Предположем нужно напечатать линию с верху вниз на весь экран (или даже больше, случайно).

Процесс вывода заключён в операторах DO While. 

Начинаем заполнять наш массив [96][3] и заполняем его только до координат y=23. всё что меньше или больше - игнарируется.

Заполнили, выводим в верхние 3 банка экрана что получилось и сразу его чистим. 

Теперь в него заносим только то, что имеет координаты по y от 24 до 47. если, к примеру печатаем букву вкоординату 46 по у, то вносим в массив только два верхних бита каждого байта символа, остальное return.

и снова выводим массив в среднюю часть и чистим, и с третьей частью то же.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

хорошо что дисплеев понакупал 1202, сейчас они в 4 раза подорожали. почти по 100р за шт. не зря набрал с учетом что пригодится

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, я тогда глядя на тебя тоже 5 штучек в Харькове заказал ) 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Нужна помощь. Немогу разобраться с нюансом.

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

второй пример

На самом деле я бы не парился но у меня такая-же проблема с другим дисплеем. Там только одня библиотека и тоже не видит файлов. Что не так? http://arduino.ru/forum/programmirovanie/mega-i-displei-ot-siemens-s65#comment-104657

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Имеешь ввиду вместо уголков кавычки? Пробовал. Интересно то, что всё на 99% одинаково, включения в библиотеки одинаковые, скетчи 100% одинаковые, в назаваниях разница в одной цифре, и папки библиотек рядом даже... 

Если не сложно попробуй у себя закоментить в в этом примере шрифт и скомпелировать.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

https://yadi.sk/i/V3Kic-jNfBD4C

https://yadi.sk/i/It28Q_HBfBD55

все норм. если закоментировать ошибки валятся

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ну это как бы не совсем нормально. Что может мешать увидеть файлы библиотеки? 

Я когда набросал на этот экран бибу без буфера, была такая же фигня и я потом её как то решил, а как не помню.
 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

перезагрузи комп)) чтобы отсечь такой вариант

timer_23
Offline
Зарегистрирован: 06.08.2014

Здравствуйте еще раз. А можно пример того как сделать свой шриФт? Пересмотрел всю тему не нашел (может не заметил))

hugoboss317
Offline
Зарегистрирован: 21.03.2013

В библиотеке (пост 204) я вкладывал генератор шрифтов. Правда там только на 2 размера 5х8 и 10х16. Рисуешь по одному символу и можно просто открыть в библиотеке готовый шрифт и подставить по одному свои. Если нужен другой размер, придётся немного повозиться. 

timer_23
Offline
Зарегистрирован: 06.08.2014

Спасибо

timer_23
Offline
Зарегистрирован: 06.08.2014

hugoboss317 пишет:

В библиотеке (пост 204) я вкладывал генератор шрифтов. Правда там только на 2 размера 5х8 и 10х16. Рисуешь по одному символу и можно просто открыть в библиотеке готовый шрифт и подставить по одному свои. Если нужен другой размер, придётся немного повозиться. 

Спасибо! Хорошая прога!) И для картинок тоже понравилась))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

появилось несколько вопросов по либе

например кусок из примера

void loop(){
  
  LcdGotoXY(20,20);
  LcdPageONE();
  do{
  LcdsetFont(font_5x8);
    LcdGotoXY(0, 5);
    LcdPrint("HELLO\n\tworld!\tfont_5x8\n", ON, 1);
    LcdPrint("Привет\n Мир!\tfont_5x8\n", ON, 1);
    LcdsetFont(font_5x5);
    LcdPrint("HELLO\n\tworld!\tfont_5x5", ON, 1);
  }
  while (LcdPageTWO());
  delay(1000);
}

 по пунктам:

запускаем LcdPageONE()

вот что в либе

uint8_t LcdPageONE(void)
{
	page = 3;
	return page;
}

зачем return если нигде не используется возвращаемое значение, фактически получается можно написать

void LcdPageONE()
{
	page = 3;

}

или вместо LcdPageONE() просто page=3;

 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Начну с конца.

>> или вместо LcdPageONE() просто page=3;

Нет, нельзя. Это глобальная переменная, объявленная в файле библиотеки, просто в скетче она будет как необъявленная, а как раз чтоб получить её значение, нужна функция которая и возвратит (return) значение. Хотя как таковое оно нам и не надо. Да и наверняка кто то в место тройки что-нибудь всунет и хрен знает что получится и....... какой дебил такое написал? ))))))

>>зачем return если нигде не используется возвращаемое значение, 

как это не используется??? Значение этой перименной как раз ключевое. В функции LcdPageTWO(void) определяется в какую часть экрана выводится массив со сформированым изображением.

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

>> void LcdPageONE()

Я бы рекомендовал почитать про функции, что они в общих чертах могут (или не могут)

В теле функции мы меняем значение переменнй page, которое нам знать и нахрен не надо, но оно нужно при выполнении других функций, для этого функции LcdPageONE и LcdPageTWO должны возвращать не "ничего" (void),  а  заданный тип uint8_t.

поэтому void нельзя а uint8_t можно и нужно. А return page, для того чтоб функция знала что именно возвращать, ведь там может быть хоть мильён переменных такого же типа. Да да, знаю что там только page, ну помог компелятору, ну и так правельней немного. Привычку надо такую иметь чтоб потом долго баги не искать.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

залез в твою либу так и оказалось)))

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Так я думал ты это ещё в 213-ом посте понял

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да. но как формируется 3 блока. как он запоминает за один проход где что должно быть. и вот вчера осенило что проходов 3 штуки)))

короче недостаток памяти компенсируется процессорным временем

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, это собственно и есть серьёзный недостаток - огромное количество времени вывода на экран. С картинкой и текстом может быть до 0,44 секунды. Но

Во-первых я думаю что и с полноразмерным массивом не на много быстрее и во-вторых, как ни крути а заявленая задача( а именно вывод на килобайтнорй оперативке символов в указанную координату и полноценной графики) выполнена на 100%

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

намного быстрее. но дело не в этом. у тебя функции передачи очень медленные. shiftout лучше заменить на более быстрое

кстати ты не против я использую часть твоего кода из либы? переделываю под себя

hugoboss317
Offline
Зарегистрирован: 21.03.2013

>> ты не против я использую часть твоего кода из либы? 

Да будь как дома

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

держи. станет намного быстрее

//=========================================================Отправка 9 байт    
void SendByte(byte mode, byte c){
  dWrite(CS, 0);
  (mode)? dWrite(Data,1) : dWrite(Data,0);
  dWrite(Clock, 1);
  
  for(byte i=0;i<8;i++){
    dWrite(Clock,0);
    (c & 0x80)? dWrite(Data,1) : dWrite(Data,0);
    dWrite(Clock,1);
    c <<= 1;
  }

  dWrite(Clock, 0);
}

//===================================================Инициализация дисплея
void Inicialize(){
  pinMode(CS,    OUTPUT);
  pinMode(Data,  OUTPUT);
  pinMode(Clock, OUTPUT);

  // Инициализация дисплея
  dWrite(Clock, 0);
  dWrite(Data, 0);
  dWrite(CS, 0);
  delay(20);
  dWrite(CS, 1);

  SendByte(LCD_C,0x2F);            // Power control set(charge pump on/off)
  SendByte(LCD_C,0xA4);   
  SendByte(LCD_C,0xAF);            // экран вкл/выкл
  
  for (int index = 0; index < 864 ; index++){
    SendByte(LCD_D, 0x00);
  }
}

//=======================================================Управление пинами  
void dWrite(byte pin, byte val){
  byte bit = digitalPinToBitMask(pin);
  volatile byte *out;
  out = portOutputRegister(digitalPinToPort(pin));
  (val)? *out |= bit : *out &=~bit;
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

что то медленно. вывод прямоугольника  и обновление всего экрана 67 миллисекунд

буду дальше оптимизировать

плюс глюки: смещается картинка

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я думаю зря ты велосипед изобретать начал. Биба отлаженая была, всё подогнаное. У меня на ней 3 проэкта и всё как часики. Там только не так давно я убирал глюки, связаные с перегрузкой функций вывода чисел, по тойже ссылке можно обновить и float не выводить, проеобразовывать надо но это по желанию и по необходимости да и не сложно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ничего разберусь. не в первый раз

не люблю просто длинные без нужды записи. например  вместо

LcdPageONE();
do{
  ....
  }
while(LcdPageTWO());

у меня

Lcd_in();
while(Lcd_out()<4){
     ....
}

еще вместо массива [96][3] сделал [288]. так проще. дисплей все равно сам перебрасывает на следующую строку

инвертирование мне не нужно поэтому вместо

switch(color){
		   case ON:    SetPix(data, y%8); break;     //data |= _BV(y%8); 
		   case OFF: ClearPix(data, y%8); break;     //data &= ~_BV(y%8);
		   case INV:   InvPix(data, y%8); break;     //data ^= 1<<y%8;
	   }

сделал 

if (color) LCD_RAM[x+ (y/8)*LCD_X] |= _BV(y%8);
else       LCD_RAM[x+ (y/8)*LCD_X] &= ~_BV(y%8); 

понимаю что мелочь и по сути не так важно, но мне так проще))

timer_23
Offline
Зарегистрирован: 06.08.2014

Почему то не хочет выводить переменные типа float (( Что посоветуете? 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я же писал, float не выводятся, не в этой не под PCF8812. Преобразуй в зависимости от того, сколько цифр после запятой тебе надо. Лучше преобразуй в знаковую четырёхбайтную. Потом если нужна (к примеру) одна цифра - печатаешь делённое на 10 (не делишь на десять), печатаешь точку, печатаешь остаток от деления на 10. Удачи.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

немного подправленная. попробуй. только reset дисплея подцепи к 3,3в

timer_23
Offline
Зарегистрирован: 06.08.2014

hugoboss317 пишет:

Я же писал, float не выводятся, не в этой не под PCF8812. Преобразуй в зависимости от того, сколько цифр после запятой тебе надо. Лучше преобразуй в знаковую четырёхбайтную. Потом если нужна (к примеру) одна цифра - печатаешь делённое на 10 (не делишь на десять), печатаешь точку, печатаешь остаток от деления на 10. Удачи.

 

Простите, а можно пример, как правильней это сделать. А то у меня плохо получается. после запятой немогу вывести например ( ",04", ",30" и т.д). получается так - (",4" , ",3"). 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

оператор "остаток от деления" "%"


float  a = 1.0;   // имеем переменную
a - 1.96;     //выполняем с ней операции
a *= 100;   //переносим запятую до целого числа
int b = a;    //приводим к нужному типу

................
Lcdprint(b/100);   // печатаемчелое число но реально на 100  не делим
Lcdprint(","):         // печатаем запятую
Lcdprint(b%100); // печатаем остаток от деления на 100 т.е. то что после запятой
//при этом не забываем что истинная величина обоих переменных всё ещё умноженна на 100.

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Вот крутилось в голове что что-то забыл, так и есть.

Нужно после печати запятой добавить

if(b%100 < 10) {
Lcdprint("0");      //просто напечатать "0"
}

 

timer_23
Offline
Зарегистрирован: 06.08.2014

Спасибо! Работает. 

timer_23
Offline
Зарегистрирован: 06.08.2014

Столкнулся с непонятной мне проблемой. Мне нужно прибавлять\убавлять к числу 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 и не реагирует на кнопки.

Как это можно вылечить?

 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

а делить на 10 после печати кто будет?

Вы умножили float на 10 чтоб преобразовать в int.

При печати int Вы него не делите а просто выводите нужное кол-во символов, но float то умножен.

Делить надо перед добавлением 0,1 или вычитанием

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

блин делать библиотеки не мое. нужна помощь

https://yadi.sk/d/IMPvehTFjHBrC

timer_23
Offline
Зарегистрирован: 06.08.2014

hugoboss317 пишет:

а делить на 10 после печати кто будет?

Вы умножили float на 10 чтоб преобразовать в int.

При печати int Вы него не делите а просто выводите нужное кол-во символов, но float то умножен.

Делить надо перед добавлением 0,1 или вычитанием

 

Точно, Спасибо блольшое!