как вывести русские буквы на LCD ST7920?

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

здравствуйте.

 

Пытаюсь вывести русские буквы на дисплей с контроллером ST7920. Использую библиротеку U8GLIB и шрифт unifont_0_8. https://code.google.com/p/u8glib/wiki/fontgroupunifont В место русских букв пишет другие символы, которые тоже есть в библиотеке. Как это можно победить? Такой же шрифт установил в папку font на компьютере и всеравно не помагает.

И еще вопрос - какой программой можно создать свой шрифт для этой библиотеке? Например только цифры и русские буквы?

Пример кода: При этом слово hello пропечатывается нормально


#include "U8glib.h"

U8GLIB_ST7920_128X64_1X u8g(3, 8, 7);	


void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.setFont(u8g_font_unifont_0_8);
  //u8g.setFont(u8g_font_osb21);
  u8g.drawStr( 0, 22, "Hello Лунатикам ");
}

void setup(void) {
  
  // flip screen, if required
  // u8g.setRot180();
  
  // set SPI backup if required
  //u8g.setHardwareBackup(u8g_backup_avr_spi);

  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) 
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on
}

void loop(void) {
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(500);
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

LCD (ЖК) индикаторы

"Вывод русского текста имеет ряд особенностей в связи с тем....."

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Вы говорите о индикаторе, в контроллере которого ужен есть русские буквы. В моем случае имеет место быть графический индикатор. И по идее когда я задаю использование шрифта unifont_0_8, то напечатав текст русскими буквами, библиотека  U8GLIB должна преобразовать мой текст в код, который отразит русские буквы на дисплее.

В принципе она так и делает, т.е. выводит на дисплей буквы, имеющиеся в таблице символов шрифта, но эти буквы не совпадают с буквами которые я ввел с клавиатуры. И я не могу понять почему так.

Может можно создать свой собственный шрифт? Для библиотеки GLCD есть программа которая генерит свои собственные шрифты, а для библиотеки U8GLIB я такой программы не знаю. Может кто подскажет?

 

ustas
Offline
Зарегистрирован: 12.03.2012

bigmaxxx пишет:

...библиотека  U8GLIB должна преобразовать мой текст в код, который отразит русские буквы на дисплее.

а вы уверены, что именно "должна"?

Для другого проекта использовал другой дисплей (TFT), так там (покопавшись в коде библиотеки) обнаружился файл, где прописаны доступные шрифты. Кириллицы, естественно, там не оказалось.

Пришлось самому нарисовать: http://devicter.blogspot.ru/2013/03/rusUTFT-SmallFont.html 

Почитайте, возможно, натолкнет на мысли (а глядишь,  и "инструмент" для генерации шрифта подсмотрите).

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

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

step962
Offline
Зарегистрирован: 23.05.2011

А еще есть такое понятие, как "кодировка символов". Для кириллицы это и DOS, и КОИ-8, и Windows-1251, и ... еще много разных "и".

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

Если ответы будут различаться, то вам сюда.

leshak
Offline
Зарегистрирован: 29.09.2011

bigmaxxx пишет:

Вы говорите о индикаторе, в контроллере которого ужен есть русские буквы.

Нет, я говорю про русские буквы в среде ArduinoIDE. Я же дал, вместе с ссылкой, начало абзаца в котором про это говорится. И там же есть пример как нужно кодировать русские символы.

Ну вот ниже step962 уже попытался другими словами про это же рассказать.

Вообщем открывайте мою ссылку, смотрите пример "вывод строки ЖК дисплей", открывайте свою ссылку 

https://code.google.com/p/u8glib/wiki/fontgroupunifont

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

ustas
Offline
Зарегистрирован: 12.03.2012

bigmaxxx пишет:

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

там в ссылку в конце пробел затесался. Попробуйте так

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

стыдно признаться, но я не знаю как соотнести букву в таблице шрифта к её коду. Подскажите пожалуйста.

ustas
Offline
Зарегистрирован: 12.03.2012

bigmaxxx пишет:

стыдно признаться, но я не знаю как соотнести букву в таблице шрифта к её коду. Подскажите пожалуйста.

версия "в картинках"

leshak
Offline
Зарегистрирован: 29.09.2011

Тут не "знать", а догадатся, медитируя на эту табличку :)

В конце, концов, даже не имея ее вы можете просто в цикле for(i=0;i<255) - вывести все имеющиеся у вас символы и посмотреть :)

Вообщем моя "медитация на таблицу сказала такое"

Находим нужную букву. Напирмер букву "Д". Смотрим левую колонку это строки, видим там 176/0xb0  . Судя по всему это код первой буквы в строке (в десятичном и шестнадцатеричном виде). Буква "Д", у нас 5-тая в строке. Значит ее код будет 176+4=180 (+4, а не +5 потому что первая буква имеет "нулевой индекс". Вообщем считаем буквы начиная с нуля). 

Итого, что-бы вывести ее нам нужно сделать что-то типа lcd.print("\180");

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

В принципе понятно, но что тогда означают цифры и буквы после слеша, например /0хf0 ?

leshak
Offline
Зарегистрирован: 29.09.2011

 

bigmaxxx пишет:

В принципе понятно, но что тогда означают цифры и буквы после слеша, например /0хf0 ?

А я ведь написал. Да даже если бы и не написал, то конструкцию начинающуюся на  0x нужно опознавать на глаз. А поможет в этом чтение Целочисленные константы

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

leshak пишет:

 

bigmaxxx пишет:

В принципе понятно, но что тогда означают цифры и буквы после слеша, например /0хf0 ?

А я ведь написал. Да даже если бы и не написал, то конструкцию начинающуюся на  0x нужно опозавать на глаз. А поможет в этом чтение Целочисленные константы

 

Да, вы правы, извините. Это я невнимательно прочитал.

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Не получается. При написани кода вида

u8g.drawStr( 0, 22, "\209 ");

на дисплее пишется 9. Что я не правльно делаю?

leshak
Offline
Зарегистрирован: 29.09.2011

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

Сделать что-то типа

char str[2]={0,0};

for(byte code=100;code<200;code++){ // будем показывать от 100 до 199
  // отправляем в сериал код который будем показывать
   Serial.print("Code=");
   Serial.println(code);

   // показываем
   str[0]=code;
   u8g.drawStr(0,22,str);

   delay(1000); // даем задержку что-бы успеть прочитать

}

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

Возможно через u8g.print получился сразу на экран и код символа показывать что-бы глаза не разбегались. Вообщем пустите, вообще хоть какие-то русские буквы мелькают на экране?

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Спасибо за подсказку. через 5 часов попробую.

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Здравствуйте.

Сделал как сказал leshak и о чудо - буквы шрифта полностью совпали с вводимыми цифрами.

Но теперь у меня небольшая проблемма: пытаюсь вывести какойто определенный символ из шрифта, но компилятор выдает ошибку. Подскажите пожалуйста, где я ошибся??

#include "U8glib.h"
U8GLIB_ST7920_128X64 u8g(3, 8, 7, U8G_PIN_NONE);
void setup()
{
   Serial.begin(9600); // настройка ком-порта
  u8g.setFont(u8g_font_unifont_0_8);
  u8g.setColorIndex(255);
}
void loop()
{
    for (int i=208; i <= 255; i++){
  delay(100);
      Serial.println(i);
 char i;
   
//String str=208;
    u8g.firstPage();  
do {
   // char(i);
  u8g.drawStr(0, 20, i);
     } while( u8g.nextPage() );
      delay (1000);
      }
   }

 

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну во первых, привыкайте аккуратно расставлять скобки и отступы. А то в этой мешанине - трудно понять что куда отностися.

Лучше это делать руками. С помощью выделения и TAB и Shift-Tab. Но если уже есть "мешанина кода", который нужно привести в порядок - есть волшембная комбинация CTRL-T приводящая в более менее читаемый вид (это в самой ArduinoIDE нажимать нужно).

>Подскажите пожалуйста, где я ошибся??

Ну как минимум в том, что никому не признаетесь что за ошибка. 

Не ставить же мне библиотеку вашего шрифта только ради того, что-бы узнать какую ошибку вы видите (а без библиотеку - у меня будут видны совсем другие ошибки).

А дали бы сюда ошибку - глядишь и сами бы ее прочитали. А возможно и догадались бы тогда "что не так". Компилятор же не матом ругается, а пытается максимально помоч в том что-бы было понятно "что не так" (не всегда конечно у него это получается, но все же...)

Подозреваю что кричит он вам, что-то типа "переменная i уже определена". В сроке 14-ть. Вы опять пытаетесь ее объявить, хотя уже завели ее в строке 11 (да еще другого типа). 

А возможно еще на чем-то раньше компилятор споткнулся.

 

 

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Извините.

Ошибка следующая:

 

sketch_mar30a.ino: In function 'void loop()':
sketch_mar30a:29: error: call of overloaded 'drawStr(int, int, char&)' is ambiguous
C:\arduino-1.0.2\libraries\U8glib/U8glib.h:159: note: candidates are: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const char*) <near match>
C:\arduino-1.0.2\libraries\U8glib/U8glib.h:189: note:                 u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const __FlashStringHelper*) <near match>
 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну смотрите. Даже не заглядывая в доку, по названию функции drawStr можно предположить, что выводит она СТРОКИ.

А вы попытались ей, третьим параметром, скормить то ли char, то ли int (на двойное определение i - компилятор обязательно ругнется тоже).

Посмотрите в мой пример. Видите? Я начале сформировал строку. Сделал массив чаров из двух символов. Послединй символ - всегда ноль (в Си строки это и есть массив char с нулем в конце).

Потом в цикле - менял первый char (то есть задавал код символа). И вот получившуюся строку (мой символ+\0) - скармливал drawStr.

Вы же решили это просто - выкинуть :)

Вам нужно:

1. Делать так же как я, или
2. Искать в документации на библиотеку функцию которая умеет принимать/выводить не строки, а числа. Скажем drawInt, или функцию которая "берет что угодно и сама переводит в строку" (вообщем за вас сделает эту работу). Подозреваю что это будет функция print(), что-то видел такое вчера/позавчера.

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

спасибо, буду пробовать.

leshak
Offline
Зарегистрирован: 29.09.2011

bigmaxxx пишет:

Не получается. При написани кода вида

u8g.drawStr( 0, 22, "\209 ");

на дисплее пишется 9. Что я не правльно делаю?

Есть подозрение, что в процессе копипастов и попыток набирать по русски у вас могли невидимые символы попасть туда.

Попробуйте эту строку набрать руками заново . Полностью с нуля. Как минимум - то что в внутри кавычек (и сами кавычки - тоже, сотрите и наберите заново).  И без пробела в конце. То есть "\209", а не "\209 " (не копируейте, наберите, предварительно стерев). Можете еще попробовать вот такое "\209\0", хотя, по идее само должно ноль в конце додумывать.

step962
Offline
Зарегистрирован: 23.05.2011

Конструкция "\ddd" служит для вывода символа, представленного числом в восьмиричной системе исчисления ("\070" выведет "8", "\101" выведет "A").

Конструкция "\xdd" (но не "\Xdd") служит для вывода символа, представленного числом в шестнадцатиричной системе исчисления ("\x38" выведет "8", "\x41" выведет "A").

Ну а "\209" - это заворот мозгов для компилятора, ибо старшей цифрой в восьмиричном исчислении является семерка...

Предполагаю, что он волевым решением прекращает интерпретацию последовательности цифр сразу при появлении недопустимого символа (т.е. девятки) и в результате выводится "\20" (управляющий символ, 0x10) и "9". В пользу этого предположения говорит то, что последовательность "\709" выводится как "89" (70 в восьмиричной системе это 38 в шестнадцатиричной, или "8")

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

Конструкция "\ddd" служит для вывода символа, представленного числом в восьмиричной системе исчисления 

Вот же блин горелый. Никогда бы в голову не пришло. Привык, что для всего отличного от 10-тичного, нужно какие-то префиксы, а по дефолту - десятчиный.

И если верить Escape Sequences (C)

То десятичными вообще никак .

Значит либо городить порнографию вида

 u8g.drawStr(0,22,(char[]){208,209,210,0}); // не забываем про ноль в конце

Либо на 16-тиричные переходить

u8g.drawStr(0,22,"\xD1\xD2\xD3"); 

 

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Спасибо всем за участие в моем вопросе. Видно в какую сторону копать и главное с примерами.

Но есть одно НО: Мне кажется вывод букв и символов из шрифта путем указания номера его букв сложен, и для новичков (на моем примере) будет очень заморочен.

Проблем с вводом латинских символов с клавиатуры нет. Наверное потому что во всех шрифтах буквы соответствуют одному и тому же номеру. Я так понимаю что и в Windows буква в шрифте соответствует своему омеру. Соответсвенно если мы в скетче пишем буква F (номер буквы 70), то при компилировании из шрифта выбирается буква под номером 70, та же F.

А проблеммы с кирилицей в библиотеке U8GLib вызываны тем что номер буквы кирилицы в Windows не соответсвует номеру буквы в используемом шрифте.

Отсюда вопрос - быть может на будущее один раз помучится и сделать один шрифт, по выводу совпадающий с номерами букв Windows. Я бы с удовольствием занялся этим делом, с уменьшение размера букв, тем более что размеры букв в моем случае велики и строка не влазит в дисплей. 

Только бы подсказали как. В библиотеке есть файл Font_Data.с В этом файле лежат все шрифты библиотеки. Я попытался изменить размер шрифта, но не получилось. Если кто подскажет как изменить шрифт - буду благодарен. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Пример "подскажите как фонт переколбасить" - вам ustas дал ссылку. Там именно про это речь и идет.

Кстати это не обязательно делать именно на уровне библиотеки. Можно написать функцию которая просто конвертирует строку из одной кодировки - в другую. И деать что-то типа u8g.drawStr(0,22,converEncoding("Моя строка"));

Так будет проще и более универсально (правда ценой расхода памяти, особенно если делать "в лоб", без выискивания закономерностей в таблицах).

Но... несовпадение кодировок (то что вы назвали "номер в Windows не соотсветсует") - это пол беды. К сожалению проблема не ограничивается "другие номера".  Как выше уже говорили, для русских букв ArduinoIDE исползует UTF16. То есть на каждую букву приходится ДВА байта. И фиг с ним, если бы оно всю строку целиком делал UTF16. Если строке есть и русские и английские буквы (а, к примеру "пробел" - это тоже "английский"), то у вас в строке часть букв получается однобайтовыми, а часть - двубайтовыми. 

Попробуйте сделать что-то типа 

И лично я, как отличать одни от других, при пробегании по строке - не вижу (хотя возможно они есть). Скажем если попались два байта 0x4e 0x10 - как узнать это два байта из ASCII таблицы или один символ русский?

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

Вообщем, что-бы понять суть печали - пустите вот этот кусок кода

void setup(){
  Serial.begin(57600);
  Serial.println(strlen("abc"));
  Serial.println(strlen("абв"));
  Serial.println(strlen("abcабв"));
}

void loop(){
}

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

 

leshak
Offline
Зарегистрирован: 29.09.2011

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

Не будет же у меня в скетче "тысячи строк русских". Скорее в свего пару, ну может десяток, строк.

Я бы сделал, на каком-то строннем языке утилитку. Которая берет строку и выводит что-то типа

"\0xEF\0xDD....." ; // а тут этот же текст не конверченный "русский текст"

А дальше copy-past в ардуино код руками.

Практически уверен что такие утилиты уже есть, но найти их может оказатся сложней чем написать. К тому же "написать под себя" - позволяет сразу еще и конвертацию кодировки из windows-1251 в кодировку библиотеки сделать. Такое уже вряд ли "готовое будет".

paf
Offline
Зарегистрирован: 25.01.2013

То же имею такой дисплей.  И вот подумалось, дисплею этому нужен отдельный МК, дополнительный. Который будет обрабатывать русский шрифт. Это может быть "каша" латиница и отдельные кириллица, как рука возьмет! А основной МК будет подавать этому переводчику строку без заморотов - "pishem po russki" или тоже по таблице 1 - а, 2 - б, 3 - в, и т. д.  Либо просить китайцев о русском знакогенераторе! :) А так никакой памяти не хватит.

leshak
Offline
Зарегистрирован: 29.09.2011

> Либо просить китайцев о русском знакогенераторе!

Я же уже выше расписывал. Что "знакогенератор" тут не поможет. Так как у вас проблема не только в конвертации windows-1251 ---> библиотечная кодировка, а и в том что перед этим нужно еще UTF16--->windows-1251 сделать. И не очень понятно как это сделать однозначно. Так как у вас в строке седержится, на самом деле, не UTF16, а "каша" из UTF8 и UTF16. То есть виновато - кривая работа самой ардуиноIDE (или кривость java на которой оно сделанно, не очень хорошо с ней знаком).

Переход на траслит - это в принципе вариант. Но IMHO не очень удобный. А если еще вспомнить про "отдельный котроллер" - кучеряво (стоимость, сложность, место, потребление тока...)

тес более зачем этим заниматся на лету? Все равно же в 99% случаев все тексты заранее известны в момент компиляции. И достаточно конвертнуть их один раз.

Делаем скажем файлик res1.rus, ложим в него содержимое

rusStr1=Русский Текст1
rusStr2=Русский Текст2
rusStr3=Русский Текст3 and English Text

Пишем консольную утилиту (скажем на C#) которая просто находит в папке все файлы типа *.rus и создаем им соотвествующие файлы типа res1.h

C содержимым вида:

// Русские Текст 1
char rusStr1[]="\0x00\0x001....";

// Русские Текст 2
char rusStr2[]="\0x00\0x001....";

// Русские Текст 3 and English Text
char rusStr3[]="\0x00\0x001....and English Text";

А так же генерит еще один файл, скажем all_res.h содержий инглуды на все это сгенеренный файлы

#include "res1.h"
#include "res2.h"
#include "res3.h"

Далее, нам осталось только в основном скетче прописать

#include "all_res.h"

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

rusStr1, rusStr2 и т.п.

Вообщем вышли - обычные файли ресурсов. Точно так же как и шрифты генертся/подключаются. Только тут - для строковых переменых.

Если нам нужно поменять текст. Меняем его в .rus файле и кликаем на утилитку для перегенрации.

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

Если потребуется, может поменять логику генерации и размещать эти переменные сразу в PROGMEM

Если покопатся, то возможно получится эту тулзень прямо в билд-процесс встроить. Что-бы ардуиноIDE сама вызывала ее при компиляции (но не уверен  в этом, в крайнем случае можно взять другие IDE, многие позволяют настраивать билд процесс).

 

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Значит дело в следующем.

Идея вывода русскоязычного шрифта из готовой библиотеки всей проблеммы не решит. Напимер в моем случае имеющиеся буквы слишком большие и строка не влазит в дисплей.

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

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

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

Не могу найти редактор BDF шрифтов. Подскажите пожалуйста, где можно скачать. FontForge не предлагать, с официального сайта у меня не пошел.

dardik
Offline
Зарегистрирован: 09.03.2013

char d[10] = " ";

 u8g.setFont(u8g_font_unifont_0_8);

       //Д                //а                 //в              //л              //е             //н               //и               //е             //:
  d[0] = 180; d[1] = 208; d[2] = 210; d[3] = 219; d[4] = 213; d[5] = 221; d[6] = 216; d[7] = 213; d[8] = 58;
  u8g.drawStr(1, 15, d); 

Выведет слово "Давление:"

По аналогии можно закодировать любое слово, главное, чтобы шрифт поддерживал кириллицу, а их там несколько точно есть стандартных из библиотеки.

titovich
Offline
Зарегистрирован: 29.05.2013

Добрый день (ночь, утро)!

В рамках проекта системы автоматического полива сделал простой шрифт 5x7 для основного контроллера. Отлично подходит для вывода на LCD 128x64. Возможно кому-то будет полезным )))

В ардуино символы выводятся без каких-либо конвертаций

Шрифт:

/*my5x7rus.h*/

/*
  Fontname: my5x7rus  (Cyrillic 5x7 LCD Simple Font)
  Copyright: (C) 2013 Andrew S. Titovich E-mail:   andreytitovich[@]yahoo.com 
  Сapital A Height: 7, '1' Height: 7
  Calculated Max Values w= 5 h= 7 x= 0 y= 3 dx= 6 dy= 0 ascent= 6 len= 7
  Font Bounding box     w= 6 h= 6 x= 0 y=-1
  Calculated Min Values           x= 0 y=-1 dx= 0 dy= 0
  Pure Font   ascent = 7 descent=-1
  X Font      ascent = 7 descent=-1
  Max Font    ascent = 6 descent=-1
*/
const u8g_fntpgm_uint8_t my5x7rus[2004] U8G_SECTION(".progmem.my5x7rus") = {
  0,6,6,0,255,7,1,147,3,35,32,255,255,6,255,7,
  255,0,0,0,4,0,0,1,7,7,2,0,255,128,128,128,
  128,128,0,128,3,3,3,4,0,3,160,160,160,5,7,7,
  6,0,255,80,80,248,80,248,80,80,5,7,7,6,0,255,
  32,120,160,112,40,240,32,5,7,7,6,0,255,192,200,16,
  32,64,152,24,5,7,7,6,0,255,96,144,160,64,168,144,
  104,2,3,3,3,0,3,192,64,128,3,7,7,4,0,255,
  32,64,128,128,128,64,32,3,7,7,4,0,255,128,64,32,
  32,32,64,128,5,5,5,6,0,0,80,32,248,32,80,5,
  5,5,6,0,0,32,32,248,32,32,2,3,3,3,0,255,
  192,64,128,5,1,1,6,0,2,248,2,2,2,3,0,255,
  192,192,5,5,5,6,0,0,8,16,32,64,128,5,7,7,
  6,0,255,112,136,152,168,200,136,112,3,7,7,4,0,255,
  64,192,64,64,64,64,224,5,7,7,6,0,255,112,136,8,
  16,32,64,248,5,7,7,6,0,255,248,16,32,16,8,136,
  112,5,7,7,6,0,255,16,48,80,144,248,16,16,5,7,
  7,6,0,255,248,128,240,8,8,136,112,5,7,7,6,0,
  255,48,64,128,240,136,136,112,5,7,7,6,0,255,248,8,
  16,32,64,64,64,5,7,7,6,0,255,112,136,136,112,136,
  136,112,5,7,7,6,0,255,112,136,136,120,8,16,96,2,
  5,5,3,0,0,192,192,0,192,192,2,6,6,3,0,0,
  192,192,0,192,64,128,4,7,7,5,0,255,16,32,64,128,
  64,32,16,5,3,3,6,0,1,248,0,248,4,7,7,5,
  0,255,128,64,32,16,32,64,128,5,7,7,6,0,255,112,
  136,8,16,32,0,32,5,7,7,6,0,255,112,136,8,104,
  168,168,112,5,7,7,6,0,255,112,136,136,136,248,136,136,
  5,7,7,6,0,255,240,136,136,240,136,136,240,5,7,7,
  6,0,255,112,136,128,128,128,136,112,5,7,7,6,0,255,
  224,144,136,136,136,144,224,5,7,7,6,0,255,248,128,128,
  240,128,128,248,5,7,7,6,0,255,248,128,128,224,128,128,
  128,5,7,7,6,0,255,112,136,128,128,152,136,112,5,7,
  7,6,0,255,136,136,136,248,136,136,136,3,7,7,4,0,
  255,224,64,64,64,64,64,224,5,7,7,6,0,255,56,16,
  16,16,16,144,96,5,7,7,6,0,255,136,144,160,192,160,
  144,136,5,7,7,6,0,255,128,128,128,128,128,128,248,5,
  7,7,6,0,255,136,216,168,136,136,136,136,5,7,7,6,
  0,255,136,136,200,168,152,136,136,5,7,7,6,0,255,112,
  136,136,136,136,136,112,5,7,7,6,0,255,240,136,136,240,
  128,128,128,5,7,7,6,0,255,112,136,136,136,168,144,104,
  5,7,7,6,0,255,240,136,136,240,160,144,136,5,7,7,
  6,0,255,120,128,128,112,8,8,240,5,7,7,6,0,255,
  248,32,32,32,32,32,32,5,7,7,6,0,255,136,136,136,
  136,136,136,112,5,7,7,6,0,255,136,136,136,136,136,80,
  32,5,7,7,6,0,255,136,136,136,168,168,216,136,5,7,
  7,6,0,255,136,136,80,32,80,136,136,5,7,7,6,0,
  255,136,136,80,32,32,32,32,5,7,7,6,0,255,248,8,
  16,32,64,128,248,3,7,7,4,0,255,224,128,128,128,128,
  128,224,5,5,5,6,0,0,128,64,32,16,8,3,7,7,
  4,0,255,224,32,32,32,32,32,224,5,3,3,6,0,3,
  32,80,136,5,1,1,6,0,255,248,3,3,3,4,0,3,
  128,64,32,5,5,5,6,0,255,112,8,120,136,120,5,7,
  7,6,0,255,128,128,176,200,136,136,240,5,5,5,6,0,
  255,112,128,128,136,112,5,7,7,6,0,255,8,8,104,152,
  136,136,120,5,5,5,6,0,255,112,136,248,128,112,5,7,
  7,6,0,255,48,72,64,224,64,64,64,5,5,5,6,0,
  255,120,136,120,8,48,5,7,7,6,0,255,128,128,176,200,
  136,136,136,3,7,7,4,0,255,64,0,192,64,64,64,224,
  4,7,7,5,0,255,16,0,48,16,16,144,96,4,7,7,
  5,0,255,128,128,144,160,192,160,144,3,7,7,4,0,255,
  192,64,64,64,64,64,224,5,5,5,6,0,255,208,168,168,
  136,136,5,5,5,6,0,255,176,200,136,136,136,5,5,5,
  6,0,255,112,136,136,136,112,5,5,5,6,0,255,240,136,
  240,128,128,5,5,5,6,0,255,104,152,120,8,8,5,5,
  5,6,0,255,176,200,128,128,128,5,5,5,6,0,255,112,
  128,112,8,240,5,7,7,6,0,255,64,64,224,64,64,72,
  48,5,5,5,6,0,255,136,136,136,152,104,5,5,5,6,
  0,255,136,136,136,80,32,5,5,5,6,0,255,136,136,168,
  168,80,5,5,5,6,0,255,136,80,32,80,136,5,5,5,
  6,0,255,136,136,120,8,112,5,5,5,6,0,255,248,16,
  32,64,248,3,7,7,4,0,255,32,64,64,128,64,64,32,
  1,7,7,2,0,255,128,128,128,128,128,128,128,3,7,7,
  4,0,255,128,64,64,32,64,64,128,5,5,5,6,0,0,
  32,16,248,16,32,5,5,5,6,0,0,32,64,248,64,32,
  5,5,5,6,0,255,240,136,240,128,128,5,5,5,6,0,
  255,112,128,128,136,112,5,5,5,6,0,255,248,32,32,32,
  32,5,5,5,6,0,255,136,136,120,8,112,5,5,5,6,
  0,255,32,112,168,168,112,5,5,5,6,0,255,136,80,32,
  80,136,5,5,5,6,0,255,136,136,136,136,248,5,5,5,
  6,0,255,136,136,120,8,8,5,5,5,6,0,255,168,168,
  168,168,248,5,5,5,6,0,255,168,168,168,168,248,5,5,
  5,6,0,255,192,64,112,72,112,5,5,5,6,0,255,136,
  136,232,152,232,4,5,5,5,0,255,128,128,224,144,224,5,
  5,5,6,0,255,112,136,56,136,112,5,5,5,6,0,255,
  144,168,232,168,144,5,5,5,6,0,255,120,136,120,40,72,
  5,7,7,6,0,255,112,136,136,136,248,136,136,5,7,7,
  6,0,255,248,136,128,240,136,136,240,5,7,7,6,0,255,
  240,136,136,240,136,136,240,5,7,7,6,0,255,248,136,128,
  128,128,128,128,5,7,7,6,0,255,120,40,40,40,72,136,
  248,5,7,7,6,0,255,248,128,128,240,128,128,248,5,7,
  7,6,0,255,168,168,168,112,168,168,168,5,7,7,6,0,
  255,240,8,8,112,8,8,240,5,7,7,6,0,255,136,136,
  152,168,200,136,136,5,7,7,6,0,255,80,32,136,152,168,
  200,136,5,7,7,6,0,255,136,144,160,192,160,144,136,5,
  7,7,6,0,255,120,40,40,40,40,168,72,5,7,7,6,
  0,255,136,216,168,168,136,136,136,5,7,7,6,0,255,136,
  136,136,248,136,136,136,5,7,7,6,0,255,112,136,136,136,
  136,136,112,5,7,7,6,0,255,248,136,136,136,136,136,136,
  5,7,7,6,0,255,240,136,136,240,128,128,128,5,7,7,
  6,0,255,112,136,128,128,128,136,112,5,7,7,6,0,255,
  248,32,32,32,32,32,32,5,7,7,6,0,255,136,136,136,
  80,32,64,128,5,7,7,6,0,255,32,112,168,168,168,112,
  32,5,7,7,6,0,255,136,136,80,32,80,136,136,5,7,
  7,6,0,255,136,136,136,136,136,136,248,5,7,7,6,0,
  255,136,136,136,120,8,8,8,5,7,7,6,0,255,168,168,
  168,168,168,168,248,5,7,7,6,0,255,168,168,168,168,168,
  168,248,5,7,7,6,0,255,192,64,64,112,72,72,112,5,
  7,7,6,0,255,136,136,136,200,168,168,200,4,7,7,5,
  0,255,128,128,128,224,144,144,224,5,7,7,6,0,255,112,
  136,8,56,8,136,112,5,7,7,6,0,255,144,168,168,232,
  168,168,144,5,7,7,6,0,255,120,136,136,120,40,72,136,
  5,5,5,6,0,255,112,8,120,136,120,5,7,7,6,0,
  255,24,96,128,240,136,136,112,4,5,5,5,0,255,224,144,
  224,144,224,5,5,5,6,0,255,248,136,128,128,128,5,5,
  5,6,0,255,120,40,72,136,248,5,5,5,6,0,255,112,
  136,248,128,112,5,5,5,6,0,255,168,168,112,168,168,5,
  5,5,6,0,255,240,8,48,8,240,5,5,5,6,0,255,
  136,152,168,200,136,5,7,7,6,0,255,80,32,136,136,152,
  168,200,4,5,5,5,0,255,144,160,192,160,144,5,5,5,
  6,0,255,120,40,40,168,72,5,5,5,6,0,255,136,216,
  168,136,136,5,5,5,6,0,255,136,136,248,136,136,5,5,
  5,6,0,255,112,136,136,136,112,5,5,5,6,0,255,248,
  136,136,136,136,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  255,255,255,255};

Пример сектча для популярного LCD 128x64 на контроллере ST7920 работающего в последовательном режиме:

#include "U8glib.h"
#include "my5x7rus.h"


U8GLIB_ST7920_128X64 u8g(10, 9, 8, U8G_PIN_NONE);                  // SPI Com: SCK = en = 10, MOSI = rw = 9, CS = di = 8

void draw(void) {
  u8g.setFont(my5x7rus);
  u8g.drawStr(0,6,"Пример вывода русского шрифта");
  u8g.drawStr(0,14,"через библиотеку U8G");

}

void setup(void) {
  
  }

void loop(void) {
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
    delay(500);
}

Соответственно в строчке U8GLIB_ST7920_128X64 u8g(10, 9, 8, U8G_PIN_NONE); вместо 10,9,8 подставляем  пины к которым подлкючены сигналы вашего LCD SCK = en, MOSI = rw, CS = di

 

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

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

titovich
Offline
Зарегистрирован: 29.05.2013

hugoboss317 пишет:

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

 

   Пожалуйста. Шрифт для U8G делается очень просто. Сначала создаете шрифт в формате .bdf (bitmap definition font). Затем с помощью утилиты bdf2u8g.exe конверитируете его в библиотечный формат. Есть очень неплохой редактор шрифтов - Fony, который умеет экспортировать в формат bdf. Кроме этого он умеет импортировать различные шрифтовые форматы. Т.е. с помощью описанной выше связки можно для библиотеки u8g создать практически любой шрифт без особых усилий. Правда шрифт 5x7 я так и не нашел откуда импортнуть, поэтому пришлось поработать.

 

 

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

Благодарю, по итогам отпишусь.

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

Блин, у меня bdf2u8g.exe не запускается, появляется на пол секунды командная строка и всё...(((

bigmaxxx
Offline
Зарегистрирован: 26.02.2013

hugoboss317 пишет:

Блин, у меня bdf2u8g.exe не запускается, появляется на пол секунды командная строка и всё...(((

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

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

bigmaxxx пишет:

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

ага........ о как.....

может просто расскажите как вы её запускаете, может тогда пойму

titovich
Offline
Зарегистрирован: 29.05.2013

hugoboss317 пишет:

bigmaxxx пишет:

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

ага........ о как.....

может просто расскажите как вы её запускаете, может тогда пойму

Пример:

Из командной строки запускаете:

bdf2u8g.exe my5x7rus_2.bdf my5x7rus my5x7rus.h

где

my5x7rus_2.bdf - имя исходного BDF-шрифта

my5x7rus - имя шрифта в библиотеке (т.е. это название будете указывать в процедуре u8g.setFont(fontname);

т.е. для указанного вторым параметром my5x7rus, выбор шрифта будет осуществляться так: u8g.setFont(my5x7rus);

my5x7rus.h - имя выходного файла шрифта, который вы будете подключать в проект

P.S. Там есть опции, но я с ними не разбирался, поскольку небыло необходимости.

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

пишет "bdf2u8g.exe" не является внутренней или внешней командой. Может bdf2u8g.exe должен быть расположен в какойто определённой папке? и в каком виде должен быть шрифт перед преобразованием для этой библиотеки?

У меня в ".h" в таком виде.

/*
    created with FontEditor written by H. Reddmann
    HaReddmann at t-online dot de

    File Name           : digits21.h
    Date                : 11.06.2013
    Font size in bytes  : 0x0158, 344
    Font width          : 10
    Font height         : 21
    Font first char     : 0x2B
    Font last char      : 0x3A
    Font bits per pixel : 1
    Font is compressed  : false

    The font data are defined as

    struct _FONT_ {
     // common shared fields
       uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
       uint8_t    font_Width_in_Pixel_for_fixed_drawing;
       uint8_t    font_Height_in_Pixel_for_all_Characters;
       uint8_t    font_Bits_per_Pixels;
                    // if MSB are set then font is a compressed font
       uint8_t    font_First_Char;
       uint8_t    font_Last_Char;
       uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
                    // for each character the separate width in pixels,
                    // characters < 128 have an implicit virtual right empty row
                    // characters with font_Char_Widths[] == 0 are undefined

     // if compressed font then additional fields
       uint8_t    font_Byte_Padding;
                    // each Char in the table are aligned in size to this value
       uint8_t    font_RLE_Table[3];
                    // Run Length Encoding Table for compression
       uint8_t    font_Char_Size_in_Bytes[font_Last_Char - font_First_Char +1];
                    // for each char the size in (bytes / font_Byte_Padding) are stored,
                    // this get us the table to seek to the right beginning of each char
                    // in the font_data[].

     // for compressed and uncompressed fonts
       uint8_t    font_data[];
                    // bit field of all characters
    }
*/

#ifndef digits21_H
#define digits21_H

#include <inttypes.h>
#include <avr/pgmspace.h>

#define digits21_WIDTH 10
#define digits21_HEIGHT 21

uint8_t __attribute__ ((progmem)) digits21[] = {
    0x01, 0x58, 0x0A, 0x15, 0x01, 0x2B, 0x3A,
    0x09, 0x04, 0x08, 0x04, 0x09, 0x09, 0x04, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x09, 0x09, 0x04, 
    
    0x00, 0x04, 0x00, 0xC0, 0x01, 0x00, 0x38, 0x00, 0xC0, 0x1A, 0x00, 0xBC, 0x07, 0x00, 0x6B, 0x00, 
    0x80, 0x03, 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x02, 0x00, 0x6E, 0x00, 0xC0, 0x07, 
    0x00, 0x70, 0x00, 0x08, 0x00, 0x80, 0x03, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0xC0, 0x01, 0x00, 
    0x38, 0x00, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x00, 0x18, 0x00, 0x80, 0x07, 0x00, 0xF0, 0x00, 
    0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xF8, 
    0x00, 0xE0, 0x07, 0x00, 0x1F, 0x00, 0x60, 0x00, 0x00, 0xF8, 0xEF, 0xBF, 0xFE, 0xF8, 0x3B, 0x00, 
    0x80, 0x07, 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x03, 0x00, 0xB8, 0x3F, 0xFE, 0xFA, 0xEF, 
    0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xE3, 0x8F, 0xFF, 0xFE, 0x03, 0xC0, 0x7F, 0x01, 0xF4, 
    0x77, 0xC0, 0x01, 0x0F, 0x38, 0xE0, 0x01, 0x07, 0x3C, 0xE0, 0x80, 0x07, 0x1C, 0x70, 0x7F, 0x01, 
    0xF4, 0x1F, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x0E, 0x38, 0xE0, 0x01, 0x07, 0x3C, 0xE0, 0x80, 
    0x07, 0x1C, 0xF0, 0x80, 0x03, 0xEE, 0xAF, 0xBF, 0xFE, 0xFB, 0xCF, 0x7F, 0x00, 0xF0, 0x17, 0x00, 
    0x00, 0x07, 0x00, 0xE0, 0x00, 0x00, 0x1C, 0x00, 0x80, 0x03, 0x00, 0x70, 0x00, 0xFC, 0xF5, 0xC7, 
    0x7F, 0xFF, 0xF9, 0x0F, 0x80, 0xFE, 0x02, 0x38, 0xE0, 0x80, 0x07, 0x1C, 0xF0, 0x80, 0x03, 0x1E, 
    0x70, 0xC0, 0x03, 0x0E, 0x38, 0x80, 0xFE, 0x02, 0xE0, 0x3F, 0xFF, 0xFD, 0xD7, 0x5F, 0x7F, 0x07, 
    0x1C, 0xF0, 0x80, 0x03, 0x1E, 0x70, 0xC0, 0x03, 0x0E, 0x78, 0xC0, 0x01, 0x07, 0xD0, 0x5F, 0x00, 
    0xFC, 0x17, 0x00, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0x60, 0x00, 
    0x00, 0xF4, 0xC7, 0x1F, 0xFF, 0xFD, 0xE7, 0xBF, 0xFF, 0xFA, 0xEB, 0xEF, 0x80, 0x03, 0x1E, 0x70, 
    0xC0, 0x03, 0x0E, 0x78, 0xC0, 0x01, 0x0F, 0x38, 0xE0, 0xFE, 0xFA, 0xEB, 0xBF, 0xFF, 0xFC, 0x07, 
    0x40, 0x7F, 0x01, 0x1C, 0x70, 0xC0, 0x03, 0x0E, 0x78, 0xC0, 0x01, 0x0F, 0x38, 0xE0, 0x01, 0x07, 
    0xDC, 0x5F, 0x7F, 0xFD, 0xF7, 0x1F, 0x18, 0x30, 0x80, 0x07, 0x0F, 0xF0, 0xE0, 0x01, 0x0C, 0x18, 
    0x00
};

#endif

 

titovich
Offline
Зарегистрирован: 29.05.2013

hugoboss317 пишет:

пишет "bdf2u8g.exe" не является внутренней или внешней командой. Может bdf2u8g.exe должен быть расположен в какойто определённой папке? и в каком виде должен быть шрифт перед преобразованием для этой библиотеки?

У меня в ".h" в таком виде.

 

Утилита должна быть в том каталоге из которого вы её запускаете или же путь к ней прописан в переменной среды %PATH%. Исходный шрифт должен быть в формате BDF (погуглите bitmap definition font).

Файл формата BDF выглядит так:

 

STARTFONT 2.1
COMMENT Exported by Fony v1.4.0
FONT Terminal
SIZE 8 80 48
FONTBOUNDINGBOX 8 7 0 -1
STARTPROPERTIES 6
COPYRIGHT "(c) Copyright Bitstream Inc. 1984. All rights reserved."
RESOLUTION_X 80
RESOLUTION_Y 48
FONT_ASCENT 7
FONT_DESCENT 1
DEFAULT_CHAR 31
ENDPROPERTIES
CHARS 255
STARTCHAR 001
ENCODING 1
SWIDTH 576 0
DWIDTH 8 0
BBX 8 8 0 -1
BITMAP
7E
81
A5
81
BD
99
81
7E
ENDCHAR
STARTCHAR 002
ENCODING 2
SWIDTH 576 0
DWIDTH 8 0
BBX 8 8 0 -1
BITMAP
7E
FF
DB
FF
C3
E7
FF
7E
ENDCHAR

и т.д.

 

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

Я конечно извиняюсь, но можно по русским обьяснить, хотябы каку запустить bdf2u8g? Командная строка горворить что нет такой команды. Гугл говорит что Fony - нет такой программы. У меня с десяток программ по созданию любых шрифтов из любых но все они в один голос говорят  о bdf что нет такого формата (гугл подтверждает). откуда Вы вобще это берёте?

С:Users\Администратор>_     Дальше что?

titovich
Offline
Зарегистрирован: 29.05.2013

hugoboss317 пишет:

Я конечно извиняюсь, но можно по русским обьяснить, хотябы каку запустить bdf2u8g? Командная строка горворить что нет такой команды. Гугл говорит что Fony - нет такой программы. У меня с десяток программ по созданию любых шрифтов из любых но все они в один голос говорят  о bdf что нет такого формата (гугл подтверждает). откуда Вы вобще это берёте?

С:Users\Администратор>_     Дальше что?

Вы меня конечно извините, но я уже и не знаю как более подробно объяснить. Тут уже все разжевано, осталось только взять и съесть.  Кстати, если в гугле вбить fony, то на второй позиции ссылка на скачивание с официального сайта (http://fony.en.softonic.com/) (работа с BDF через File->Import, File->Export)

Цитата:

С:Users\Администратор>_ Дальше что?

 

Дальше переходите в каталог в котором лежит bdf2u8g.exe (вы его вообще нашли?) и исходный bdf шрифт, запускаете утилиту описанным ранее способом.

 

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

titovich пишет:

Дальше переходите в каталог в котором лежит bdf2u8g.exe (вы его вообще нашли?) и исходный bdf шрифт, запускаете утилиту описанным ранее способом.

Да неужели так трудно написать как это сделать. В том то и дело что всё почастям и отрывкам. Я конечно благодарен что Вы мне помогаете, только отрывки информации я не могу сложить вмечте. Во-первых я не дружу с командной строкой и по возможновти избегаю её. Мне не понятно как перейти туда или туда, она пишет что нет такой команды и как я куда то перейду. 

<bdf2u8g.exe (вы его вообще нашли?)

Вы спрашиваете нашёл ли я место куда сохранил этот файл? или я чего то ещё не понимаю

titovich
Offline
Зарегистрирован: 29.05.2013

Цитата:

Вы спрашиваете нашёл ли я место куда сохранил этот файл? или я чего то ещё не понимаю

Ну необязательно работать именно с командной строкой в чистом виде. Можно через файловый менеджер перейти в каталог, в котором находится утилита, скопировать туда же BDF-шрифт, который вы хотите сконвертировать для библиотеки U8G. И в командной строке файлового мнедежера запустить

bdf2u8g.exe исходный_шрифт.bdf имя_шрифта выходной_файл

По-моему проще объяснить нельзя.

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

 

Видимо создатель всех этих програм он же создатель библиотеки U8GLib. 

я конечно мало что ешё видел что касается програмирования, но более тормознутой вещи чем эта биба я не видел. Как и зачем писать библиотеку, которая выводит инфу на экран в самом конце тела  loop. контроллер уже посчитал, выполнил, считает другое, меняет данные, а что происходит и результаты не видно, тормоз u8glib ложил на команду "печатать данные" и пока отрабатывает действие оператор "for" или  do....while, u8g даже не почешется чтоб что то отобразить. А как тогда отобразить , ну скажем выстраивание линии по пиксельно, походу никак. У меня прям по GLCD настальгия, там если сказал "печатать" она печатает и дебилоидных заморочек с какимито страницами, первоя или вторая, нет. Для отображения картинки достаточно включить в код имя и напечатать в заданом месте и не надо гемороится с размерами картинки вписывать его в скетчь. Программ для создания шрифта полный интернет и запускаются нормально, ненадо никуда ходить, пенреходить и заходить, искать какие то дериктории, лаборатории и прафилактории. Конечно в glcd тоже есть утилита посозданию фонта но её можно легко заменить и замену легко найти. 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Тогда вам нужно 2 контроллера один который считает, другой который только выводит получив команды по RS232, причем аппаратный RS232. Или просто готовый дисплей взять с графическим контроллером(видеокартой)

leshak
Offline
Зарегистрирован: 29.09.2011

hugoboss317 пишет:

Видимо создатель всех этих програм он же создатель библиотеки U8GLib. 

я конечно мало что ешё видел что касается програмирования, но более тормознутой вещи чем эта биба я не видел. Как и зачем писать библиотеку, которая выводит инфу на экран в самом конце тела  loop. 

Вот же гад такой. Это он специально. Что-бы люди мучались. А он злобно смотрит и хихикает.

А то что он рассказывает зачем он это делал (и чем за это пришлось расплатится) - это он тупо врет:

Цитата:

U8glib addresses several problems:

  • Some displays do not allow to read data from the display memory.
  • Some displays do not allow to set a single pixel in the display memory. Often eight pixels must be assigned together.
  • Limited size of the RAM area of an embedded controller.

With some minor restrictions, these problems are solved with U8glib.

На самом деле автору просто хотелось что-бы было невозможно "скажем выстраивание линии по пиксельно", а все остальное описание  подхода tpictureloop - u8glib - Picture Loop - Universal Graphics Library for 8 Bit Embedded Systems - Google Project Hosting - это сказка для лохов.
 
И конечно, это все враки, что другой подход требует другой архитектуры СВОЕГО кода. Если привыкли "линейно выводить в любой момент", то конечно никаких других подходов в мире не существует. А все остальное (например организовать у себя что-то типа Model-View простейшего) - это все бяка умников. Которые, почему-то по разному пишут код, к примеру, когда напрямую напрямую светодиодами рулят или в матрице с динамической индикацией (или через сдвиговый. вот же засада, там тоже нельзя включить напрямую отдельный диод - значит тоже в топку).
 
 
P.S. Писал я конечно не вам, мы кажись уже давно обоюдно выяснили "способность" понимать друг-друга, скорее заметка для тех кто наткнется на ваше безапеляционное "тормознутая биба" и сможет понять что "трактор Белорусь - плохой гоночный болид", не то же самое что "трактор Белорусь - никчемная вещь". И одно не означает другое. 
P.S.S. А исторически совсем недавно, когда железо было не такое мощное, все эти мудрости со "страницами видеопамяти" и проч - было обыденной (и небоходимой вещью) при програминге обычных PC. На CGA адаптерах еще и дополнительно приходилось следить за тем, что-бы обновлять память только во время обратного хода луча ЭЛТ монитора. Иначе "снежило". Даже обычная "оперативка" не была доступна единым адресным пространством. Тоже "со страницами" работать было нужно.
titovich
Offline
Зарегистрирован: 29.05.2013

hugoboss317 пишет:

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

Через U8G данные выводятся ровно тогда, когда вы указываете в своей программе.

hugoboss317 пишет:

тормоз u8glib ложил на команду "печатать данные" и пока отрабатывает действие оператор "for" или  do....while, u8g даже не почешется чтоб что то отобразить.

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

u8g.firstPage(); 
  do {
    draw();
  } while( u8g.nextPage() );
 

данные выводятся на экран (по сути - обновление экрана)

hugoboss317 пишет:

А как тогда отобразить , ну скажем выстраивание линии по пиксельно, походу никак.

 

Элементарно. Рисуете линию от заданных координат до координат циклических переменных. И соответственно каждый раз обновляете экран. Второй вариант - сделать массив видеопамяти. Делаете с видеопамятью что угодно, не забывая при этом обновлять экран. Функция рисования будет выводить на экран из видеопамяти через процедуру drawBitmap.

 

hugoboss317 пишет:

У меня прям по GLCD настальгия, там если сказал "печатать" она печатает и дебилоидных заморочек с какимито страницами, первоя или вторая, нет. Для отображения картинки достаточно включить в код имя и напечатать в заданом месте и не надо гемороится с размерами картинки вписывать его в скетчь. Программ для создания шрифта полный интернет и запускаются нормально, ненадо никуда ходить, пенреходить и заходить, искать какие то дериктории, лаборатории и прафилактории. Конечно в glcd тоже есть утилита посозданию фонта но её можно легко заменить и замену легко найти. 

Ну так поему-бы вам её не использовать?

Могу сказать, что u8g отличная библиотека. Шустрая, удобная и универсальная. Главное разобраться что к чему. Слишком просто неразобравшись говорить о том, что продукт плохой. Но ведь бывают и руки кривые.

P.S. Вот мне интересно по-поводу GLCD. Вы говорите - сказал - нарисовала. Ну и как скорость? Т.е. у вас данные выводятся неспеша постепенно?