Дисплей 1202 драйвер STE2007 русский шрифт

vingor
Offline
Зарегистрирован: 25.05.2014

Гуру прошу помощинашел хорошую библиотеку для дисплея 1202.

https://www.dropbox.com/s/hb7gho2eyh2t0yg/graphicsLCD.zip?dl=0

Пробывал использовать много наших библиотек но в них есть свои проблемы.

Эта библиотека очень быстро отрабатывает и отрисовывает.

но у меня проблема я не знаю как к ней прикрутить шрифты

Шрифты взяты с форума с библиотеки PCF8814_NEW 

https://www.dropbox.com/s/47k00zl6u95gqzi/fonts.zip?dl=0

Ну только не пинайте меня ну не знаю я как это делается.

vingor
Offline
Зарегистрирован: 25.05.2014

Если не ошибаюсь этот экран расскурил jeka_tm 

vingor
Offline
Зарегистрирован: 25.05.2014

Апну тему жду помощи!

 

Logik
Онлайн
Зарегистрирован: 05.08.2014

А чего ждать то? Либу без регистрации не видно, я не готов регится для безвозмездной помощи. Наводящий вопрос: а вообще, без применения к экрану этому, у Вас с рускими буковками в ардуинку усьо гуд? Unicod не жмет?

vingor
Offline
Зарегистрирован: 25.05.2014

Ссылки доступны без регистрации.
Я понимаю, что русские букавки должны быть в UTF-8, а как это организовать? Лално с ними с букавками как цифирки больше сделать?
Там есть цифирки, а как их исполтзовать?

Logik
Онлайн
Зарегистрирован: 05.08.2014

Ссылка слава всевышнему, оно да, доступна. Дальше -

Чтобы скачивать и сохранять файлы прямо в Dropbox, создайте бесплатный аккаунт. Или войдите в аккаунт

На этом форуме валом тем про UTF-8 и в том числе как с ним боротся, ищите, и все будет. Поиск - друг а не матюк.

Размер зависит от либы. Или можно увеличить раза в 2-3 существующий шрифт (можно и больше но будет порнография)  либо спец шрифт нужен большой, но он много места жрет.

Logik
Онлайн
Зарегистрирован: 05.08.2014

теперь скачало, гляну. 

Logik
Онлайн
Зарегистрирован: 05.08.2014

глянул. Ничего интересного, шрифт только 5х8, без вариантов. Плохо что шрифты ОЗУ занимают. В общем слабоватка либа, шрифты если свои 5х8 то закиньте в graphicsLCD.h вместо родных. К стати про быстроту работы, она через digitalWrite побитно, это не быстро, можна раз в 5 быстрей.

vingor
Offline
Зарегистрирован: 25.05.2014

Шрифты подктдывал но там что, с битами не понятно.

А посоветуйте либу ! использовал PCF8814_NEW  но там PageONE и PageTWO но когда вывожу переменную то отрисовка медленно очень идет.

Logik
Онлайн
Зарегистрирован: 05.08.2014

vingor пишет:

Шрифты подктдывал но там что, с битами не понятно.

А посоветуйте либу ! использовал PCF8814_NEW  но там PageONE и PageTWO но когда вывожу переменную то отрисовка медленно очень идет.

Я именно такой экран не использовал и соответственно с его либами не знаком. Кроме того, как показывает опыт, либы, которые находятся как правило паршивенькие. Вы наверно это уже и сами заподозрили. Потому берете готовую за прототип и пишете свою. На примере либы для ssd1306, в ней вывод символа так:


void OLED::_print_char(unsigned char c, int x, int y)
{
	if ((cfont.y_size % 8) == 0)
	{
		int font_idx = ((c - cfont.offset)*(cfont.x_size*(cfont.y_size/8)))+4;
		for (int rowcnt=0; rowcnt<(cfont.y_size/8); rowcnt++)
		{
			for(int cnt=0; cnt<cfont.x_size; cnt++)
			{
				for (int b=0; b<8; b++)
					if ((fontbyte(font_idx+cnt+(rowcnt*cfont.x_size)) & (1<<b))!=0)
						if (cfont.inverted==0)
							setPixel(x+cnt, y+(rowcnt*8)+b);
						else
							clrPixel(x+cnt, y+(rowcnt*8)+b);
					else
						if (cfont.inverted==0)
							clrPixel(x+cnt, y+(rowcnt*8)+b);
						else
							setPixel(x+cnt, y+(rowcnt*8)+b);
			}
		}
	}
	else
	{
		int font_idx = ((c - cfont.offset)*((cfont.x_size*cfont.y_size/8)))+4;
		int cbyte=fontbyte(font_idx);
		int cbit=7;
		for (int cx=0; cx<cfont.x_size; cx++)
		{
			for (int cy=0; cy<cfont.y_size; cy++)
			{
				if ((cbyte & (1<<cbit)) != 0)
					if (cfont.inverted==0)
						setPixel(x+cx, y+cy);
					else
						clrPixel(x+cx, y+cy);
				else
					if (cfont.inverted==0)
						clrPixel(x+cx, y+cy);
					else
						setPixel(x+cx, y+cy);
				cbit--;
				if (cbit<0)
				{
					cbit=7;
					font_idx++;
					cbyte=fontbyte(font_idx);
				}
			}
		}
	}
}

Это мерзопакостно, т.к. символы выводятся попиксельно в промежуточный буфер который затем целиком отрисовывается. Требует много памяти и медленно. При этом есть возможность увеличить стандартный шрифт в разы и использовать увеличеные. Это гуд. Разобравшись в происходящем пишу себе так.

// draw a character
byte FontSize2Convert[16]={0,0x03,0x0c,0x0f,0x30,0x33,0x3c,0x3f,0xc0,0xc3,0xcc,0xcf,0xf0,0xf3,0xfc,0xff};
byte FontSize4Convert[4]={0,0x0f,0xf0,0xff};
void SSD1306::drawChar(unsigned char c)
{
    byte r;
    int_for_addr addr=c*5+(int_for_addr)font;
    switch (Font)
    {
    case FONT_SIZE_1:
        for (uint8_t i =0; i<5; addr++,i++ )
        {
            writeByte(pgm_read_byte(addr));
        }
        r=1;
        break;
    case FONT_SIZE_2:
        for (uint8_t i =0; i<5; addr++,i++ )
        {
            r=pgm_read_byte(addr);
            writeByte(FontSize2Convert[r&0x0f]);
            writeByte(FontSize2Convert[r>>4]);
            writeByte(FontSize2Convert[r&0x0f]);
            writeByte(FontSize2Convert[r>>4]);
        }
        r=4;
        break;

    case FONT_SIZE_3:
        for (uint8_t i =0; i<5; addr++,i++ )
        {
            r=pgm_read_byte(addr);
            for (byte l=4;l;l--)
            {
                byte w=r;
                for (byte g=4;g;g--)
                {
                    writeByte(FontSize4Convert[w&0x03]);
                    w>>=2;
                }
           }
        }
        r=16;
        break;

    case FONT_SIZE_MEDIUM:
        addr=(int_for_addr)MediumNumbers;
        goto drawCharOriginalFonts;


    case FONT_SIZE_BIG:
        addr=(int_for_addr)BigNumbers;
        goto drawCharOriginalFonts;


    case FONT_SIZE_MEGA:
        addr=(int_for_addr)MegaNumbers;
drawCharOriginalFonts:
        addr+=(c-'-')*CharSize*SizeY;
        for (uint8_t i =0; i<CharSize; addr++,i++ )
        {
            for (byte j=SizeY,k=0;j;j--)
            {
                writeByte(pgm_read_byte(addr+k));
                k+=CharSize;
            }
        }
        r=0;
        break;

    }
    for (;r;r--)
    {
        writeByte(0);
    }
}

Выводим шрифты прямо на экран без буферизации, оптимизировано по скорости.

Попробуйте приживить, может чего и получится. 

vingor
Offline
Зарегистрирован: 25.05.2014

Что то не получается раскурить библиотеку.

Вот пример шрифта из библиотеки.

static const byte ASCII[][5] =
{
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $

Вот кусок его обработки

void graphicsLCD::character(char character)
{
  for (int index = 0; index < 5; index++)
  {
     graphicsLCD::data(ASCII[character - 0x20][index]);  
  
  }
  graphicsLCD::data(0x00);  
}

и кусук команды вывода на экран 

void graphicsLCD::print(char *characters)
{
  while (*characters)
  {
    graphicsLCD::character(*characters++);
  }
}

Я добавил в библиотеку шрифт кусок кода

static const byte mass10x16[][20] ={
 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 20 (space)
,{0x06, 0x09, 0x06, 0xF0, 0xF8, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x18, 0x18, 0x18, 0x18, 0x0C} // 27 ' значёк для термометра 'C
,{0x7E, 0x3D, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3D, 0x7E, 0x3F, 0x5E, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x5E, 0x3F} // 30 0

И теперь у меня затык как это вывести на экран

Думал создать что то вроде

void graphicsLCD::print10x64(char *characters)
{
  while (*characters)
  {
    graphicsLCD::character(*characters++);
  }
}

но моих познаний не хватает!

Может знающие подтолкнут на путь истинный.

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

Вы шрифты взяли из моей библиотеки. Я несколько по другому выводил символы. Попробуйте скопировать в шрифтах только сам массив данных и подставить в вашу библиотеку. Да, самое главное... первые несколько байт это парамерты самого шрифта, их видно и надо удалить.

P.S. Да, вижу сделали, но для информации не помешает. 

И в предидушем посту Вам видно что в шрифте 10х16 нет русских символов, и вобще нет символов.

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

можно уточнить что за символы нужны? а то не очень понял

vingor
Offline
Зарегистрирован: 25.05.2014

jeka_tm Необходим вывод установленной температуры и температуры измеренной.

В библиотеке шрифт 5х8 хотелось бы увеличить до 10х16 но вывод на дисплее идет построчный

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

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

Не совсем понял "Да, самое главное... первые несколько байт это парамерты самого шрифта, их видно и надо удалить." это где эти первые байты? прошу прощения

 

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

ну как вариант поставить эту либу. там вывод 10х16 уже есть. но она много оперативной памяти съедает

http://arduino.ru/forum/programmirovanie/biblioteka-dlya-lcd-nokia-1100?...

vingor
Offline
Зарегистрирован: 25.05.2014

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

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

для вывода переменной постараемся сделать в ближайшее время

пока можешь разбивать на числа и выводить

vingor
Offline
Зарегистрирован: 25.05.2014

jeka_tm пишет:

для вывода переменной постараемся сделать в ближайшее время

пока можешь разбивать на числа и выводить

Еще бы знать как ))))

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

смотря какие. если целые разбивать используя деление / и %

если с плавающей запятой 

http://arduino.ru/forum/programmirovanie/biblioteka-dlya-lcd-nokia-1100?...

vingor
Offline
Зарегистрирован: 25.05.2014

Надо будет попробывать но вечером у меня два показателя температуры

1. Установка от 200 до 480 градусов выберается энкодером

2. Измерение температуры  ну и соответственно условие если меньше греем, если больше ждем, упало опять греем.

Все пытаюсь уместить на мегу 8 пока вернее все помещается но хочется цифирки побольше.

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

в мегу 8 моя библиотека не полезет. оперативки не хватит. можешь даже не пробовать

тебе нужна тогда либа hugoboss317 и туда впихивать вывод другого шрифта

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

vingor пишет:

Не совсем понял "Да, самое главное... первые несколько байт это парамерты самого шрифта, их видно и надо удалить." это где эти первые байты? прошу прощения

Вот поэтому кракозяблы и выходят.В моей библиотеке можно менять фрифты "по ходу пьесы" то есть на экран печатать разные одновременно, так же можно увеличивать и выводить укороченные символы типа точек , запятый, двоеточей и т.д. Но при смене шрифта для вывода надо знать его параметры (длина, ширина и др.). Так вот первые семь байт это и есть параметры и читаются при выборе шрифта. Сами символы начинаются после, а Ваша библиотека начинает читать сразу символы и данные смещаются на 7 байт и получается бурда. Если у Вас Atmega 8 или 16, то библиотеки с полноразмерным массивом не подойдут. Мы это с jeka_tm  уже доказали :). Подошла бы моя, но она долго выводит и это так. У меня где-то было биба, которая выводит без массива но только по строкам и шрифты можно менять, могу поискать... Я её тут гдетто показывал.   

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Продублирую:

Выложил библиотеку дисплея Nokia 1202 версия 1.4. Добавил функцию print. Выводит на дисплей целочисленные значения int, long, byte.

C float нужно колдовать, пока не заморачивался этим. Вывод циферок добавил в пример, старая версия доступна в архиве, как и все предыдущие.

 void print(byte x, byte y, boolean color, long num);		//Вывод целочисленных цифровых значений int, long, byte

//********** Выводим по координатам числовое значение *****************************
int t= 125;
long p= -345;
byte k= 255;

lcd.drawString(3, 5, 1, "Выводим циферки:" ); 			//Выводим по координатам x, y, черным чветом, строку "Выводим циферки:" 
lcd.print(9, 15, 1, t);						//Выводим числовое значение типа integer
lcd.print(9, 25, 1, p);						//Выводим числовое значение типа long
lcd.print(9, 35, 1, k);						//Выводим числовое значение типа byte
lcd.Update();                                 			//Обновляем дисплей(выводим из буфера)
delay(1000);                                  			//Перекур
lcd.Clear_LCD();                              			//Очищаем дисплей

//***********************************************************************************

 

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

спасибо Gres. времени катастрофически не хватает

только функцию drawString можно тоже в print переименовать. не знаю механизм, но функция с одинаковыми названиями, но разными типами данных нормально читаются, судя по одной либе, ардуина/компилятор сами выбирают нужную

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

jeka_tm пишет:

только функцию drawString можно тоже в print переименовать. не знаю механизм, но функция с одинаковыми названиями, но разными типами данных нормально читаются, судя по одной либе, ардуина/компилятор сами выбирают нужную

Спасибо jeka_tm, дельное замечание, поправил библиотеку еще раз и выложил следующий релиз:

 библиотека дисплея Nokia 1202 версия 1.5.

В текущей версии функция print выводит на дисплей целочисленные значения int, long, byte и строки.

C float нужно колдовать, пока не заморачивался этим. Старая версия доступна в архиве, как и все предыдущие.

Теперь пример вывода выглядит так:

       void print(byte x, byte y, boolean color, char *str);        //Вывод строки
       void print(byte x, byte y, boolean color, long num);         //Вывод целочисленных цифровых значений int, long, byte
       void print_1607(byte x, byte y, boolean color, char *str);   //Вывод строки в заданное знакоместо в заданную строку, как в 1602, только тут 1607

//********** Выводим по координатам числовое значение *****************************
int t= 125;
long p= -345;
byte k= 255;

lcd.print(3, 5, 1, "Выводим циферки:" ); //Выводим по координатам x, y, черным чветом, строку "Выводим циферки:"
lcd.print(9, 15, 1, t);                        //Выводим числовое значение типа integer
lcd.print(9, 25, 1, p);                        //Выводим числовое значение типа long
lcd.print(9, 35, 1, k);                        //Выводим числовое значение типа byte
lcd.Update();                                 //Обновляем дисплей(выводим из буфера)
delay(1000);                                  //Перекур
lcd.Clear_LCD();                              //Очищаем дисплей

//***********************************************************************************

Версия 1.5
Убрана функция DrawString, теперь текстовые строки и целочисленные форматы(byte, int, long) выводятся одной функцией print.
Функция SetCursor_DrawString_1607 переименована в print_1607.
Все остальное без изменений.
Естественно применяя эту библиотеку для созданных со старыми версиями библиотеки скетчами, в последние придется внести необходимые замены, то есть, переименовать в стары скетчах функцию DrawString в print и SetCursor_DrawString_1607 в print_1607.
Работа с типом float в проекте. Библиотека с дисплеем работает очень быстро, но потребляет слишком много памяти из за встроенных шрифтов, которые при необходимости(ненадобности) можно частично или полностью исключить, а так же исключить не используемые функции.
 

Добавил видео демо, кому интересно.

 

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

хорошо. спасибо. шустро правишь))

для float может нужно будет добавлять еще один параметр в функцию для количества знаков. надо разбираться

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

jeka_tm пишет:

хорошо. спасибо. шустро правишь))

для float может нужно будет добавлять еще один параметр в функцию для количества знаков. надо разбираться

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

С float да, нужно вкуривать. Вот кусок из print.cpp, стандартного из IDE, что то слишком мудрено все:

size_t Print::print(double n, int digits)
{
return printFloat(n, digits);
}
size_t Print::printFloat(double number, uint8_t digits) 
{ 
size_t n = 0;
if (isnan(number)) return print("nan");  
if (isinf(number)) return print("inf"); 
if (number > 4294967040.0) return print ("ovf");  // constant determined empirically 
if (number <-4294967040.0) return print ("ovf");  // constant determined empirically  
// Handle negative numbers
if (number < 0.0)
{ 
n += print('-');    
number = -number; 
}
// Round correctly so that print(1.999, 2) prints as "2.00" 
double rounding = 0.5; 
for (uint8_t i=0; i<digits; ++i)    
rounding /= 10.0;    
number += rounding;  
// Extract the integer part of the number and print it  
unsigned long int_part = (unsigned long)number;  
double remainder = number - (double)int_part;  
n += print(int_part);  
// Print the decimal point, but only if there are digits beyond  
if (digits > 0) 
{   
n += print(".");  
}
// Extract digits from the remainder one at a time
while (digits-- > 0)  
{    
remainder *= 10.0;   
int toPrint = int(remainder);    
n += print(toPrint);   
remainder -= toPrint;   
}    
return n;
}

Вообще выводил я проще, делив на целые и дробные части и собрая все в строку, вставив знак точки или запятой.

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

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

а у в функции разделить, домножить. и выводить по частям

MacSim
Offline
Зарегистрирован: 28.11.2012

jeka_tm пишет:

 разделив части. передать дополнительный параметр сколько знаков после запятой

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

а от флоата вообще лучше уходите.

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

мне обычно от 1 до 2-3 знаков вполне хватает. но флоат редко использую

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Точно не помню, вроде в CodeVisionAVR программил для 2313, как только используешь float, памяти сразу процентов на 60 убавляется. Тогда и стал разбивать на составные, а потом в строке из них число собирать. С этим все понятно и в библиотеке нужно делать именно так, а делать нужно для того, что это библиотека и предназначена для удобства, пользователь как можно меньше должен мозг напрягать, именно для этого все и собрано в библиотеку. Ну это мое лично такое мнение. Я прекрасно и отдельными функциями пользуюсь. для чего вообще нужен float, ну мало ли, может человек захочет сделать на 2560 термометр и выводить с него данные на 1202 и это будет единственной задачей для пушки. :)

MacSim
Offline
Зарегистрирован: 28.11.2012

Gres пишет:

сделать на 2560 термометр и выводить с него данные на 1202

а данные термометр конечно в типе флоат передает по одновару, разделяя каждый знак запятой.

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

jeka_tm пишет:

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

Это нарывается перегруженая функция.

А по количеству знаков после запятой действительно можно задавать как аргумент функции, а в протатипе можно по умолчаию, к примеру, один указать. Если не указывать при написании кода, будет десятые, нужны сотые, указать 2 и т.д. В классе print по умолчанию 2. А сколько нужно знаков после запятой должен решать каждый сам под свой проэкт а не >> одного хватит... зачем больше <<