|
В программе Flowcode, есть такой компонент gLCD. Это модель цветного графического дисплея с чипом Philips 8833, которые используются в более чем 30 моделях мобильных телефонов Nokia. (кстати по заявлениям разработчиков, с 4.02.2010 года, компонент поддерживает дисплей от Siemens S65. Но я лично не пробовал, сказать ничего не могу... Но кода в файле заметно прибавилось.)
Но к сожалению для русскоязычных пользователей этой чудной программы, разработяиками не предусмотрены кирилистические символы шрифтов. Правда компонент позволяет в настройках подставлять свои собственные шрифты. Как это делается описано уважаемым mim вот в этой ветке форума - Flowcode и дисплеи, индикация. Но и у этого способа есть парочка недостатков.
- Нужно вручную создавать готовые шрифты используя отдельную программу.
- Количество шрифтов ограничено в 95 шт. В которые естественно не поместятся сразу и русский и латинский алфавит, а так же цифры и спецсимволы.
- Несоответствие раскладки стандартной компьютерной клавиатуры и выводимых символов.
Но есть и неоспаримое преимущество - результат вывода на дисплей нового шрифта виден при симуляции прямо в программе.
Описание макросов вывода информации на дисплей, находится в виде СИ-кода в файле компонента PIC_gLCD.c, находящийся в паке Components дирректории установленной программы Flowcode.
Его можно изменять по своему усмотрению. На этом и основан этот пример. И так...
Присвоение переменным массивов со шрифтами в этом файле, происходит в разделе //ASCII Pixel data, строка 412
#ifdef _BOOSTC rom char* ASCII1 = %j rom char* ASCII2 = %k rom char* ASCII3 = %l и т.д....
Данные для массивов берутся из файла PIC_gLCD.ocx, но его править нет смысла, т.к. и описывалось выше, можно просто подставить свои шрифты в настройкам компонента gLCD.
А вот за вывод шрифта в этом файле, отвечает раздел //Routine for displaying characters, строка 1023, а именно цикл, начинающийся в строке 1053.
for (i=0;i<length_Str;i++) //Start at beginning of string and work along
Этот цикл перебирает строку пользователя и сравнивает код очередного символа с кодом в массиве, заранее загруженном в разделе //ASCII Pixel data. После чего отправляет содержимое совпавшей ячейки масива на "печать".
Все что теперь нужно, это подставить свой массив со всеми, нужными нам шрифтами.
Как я уже упоминал, по умолчанию flowcode загружает только 95 символов. С кодом от 32 до 126 включительно. В них вписываются все спецсимволы, цифры, большие и маленькие буквы латинского алфавита. Все они разбиты на группы по 12 символов в массиве и присвоины своим переменным ASCII1 - ASCII8 (в массиве ASCII8 - 11 символов) итого 95.
Ну с теорией покончено, начнем практику.
Для начала, обязательно сделайте копию файла PIC_gLCD.c. Если что то напортачите, всегда можно будет откатиться назад.
Нанем его править.
Во первых нам уже не понадобятся родные массивы символов. Для исключения их из кода просто заремьте строчки от 413 до 450.
Получится вот так:
//ASCII Pixel data /*#ifdef _BOOSTC rom char* ASCII1 = %j rom char* ASCII2 = %k rom char* ASCII3 = %l rom char* ASCII4 = %m rom char* ASCII5 = %n rom char* ASCII6 = %o rom char* ASCII7 = %p rom char* ASCII8 = %q #endif
#ifdef HI_TECH_C const char ASCII1[] = %j const char ASCII2[] = %k const char ASCII3[] = %l const char ASCII4[] = %m const char ASCII5[] = %n const char ASCII6[] = %o const char ASCII7[] = %p const char ASCII8[] = %q #endif */ Теперь спускаемся к разделу //Routine for displaying characters
В конце вышеупомянутого цикла, в строке 1095, поменяйте цифру 95 на 96. (мы ведь не будем останавливаться на 95 символе.)
И сразу после последнего, подправленного вами сравнения, после "}":
else if (pos_Str < 96)
{
position = ((pos_Str - 84)*5) + count;
temp[count]=ASCII8[position];
}
Добавьте следующий код:
else if (pos_Str < 108)
{
position = ((pos_Str - 96)*5) + count;
temp[count]=ASCII9[position];
}
else if (pos_Str < 120)
{
position = ((pos_Str - 108)*5) + count;
temp[count]=ASCII10[position];
}
else if (pos_Str < 132)
{
position = ((pos_Str - 120)*5) + count;
temp[count]=ASCII11[position];
}
else if (pos_Str < 144)
{
position = ((pos_Str - 132)*5) + count;
temp[count]=ASCII12[position];
}
else if (pos_Str < 156)
{
position = ((pos_Str - 144)*5) + count;
temp[count]=ASCII13[position];
}
else if (pos_Str < 168)
{
position = ((pos_Str - 156)*5) + count;
temp[count]=ASCII14[position];
}
else if (pos_Str < 180)
{
position = ((pos_Str - 168)*5) + count;
temp[count]=ASCII15[position];
}
else if (pos_Str < 192)
{
position = ((pos_Str - 180)*5) + count;
temp[count]=ASCII16[position];
}
else if (pos_Str < 204)
{
position = ((pos_Str - 192)*5) + count;
temp[count]=ASCII17[position];
}
else if (pos_Str < 216)
{
position = ((pos_Str - 204)*5) + count;
temp[count]=ASCII18[position];
}
else if (pos_Str < 228)
{
position = ((pos_Str - 216)*5) + count;
temp[count]=ASCII19[position];
}
Теперь осталось указать где находятся переменные с новыми массивами символов. (т.к. старые мы заремили)
Поднимаемся в начало файла в строку номер 398. Тут мы видим, что директивой #include включена в текст программы содержимое файла string.h. Он находится в папке "Flowcode V4\boostc\include\" компилятора BOOSTC. Положите файл из архива к этой статье codepage.h в указанную папку, а рядом с директивой из 398 строки, добавьте еще одну дериктиву с указанием на этот файл. Получится так:
#include <string.h>
#include <codepage.h>
Теперь, при компиляции проекта, содержимое файла codepage.h (массивы всех ASCII символов) будет добавляться к файлу PIC_gLCD.c.
Что теперь нужно делать, что бы заставить проекты Flowcode писать на дисплее русскими буквами:
- Создаем в программе строковую (String) переменную, ну например "hello_world"
- В основном окне программы, перед основным циклом, вставляем компонент C Code
- В него вписываем следующее: char FCV_HELLO_WORLD[]={207,240,232,226,229,242,160,204,232,240,0};
Каждое число - это буква, цифра или какой нибудь символ. (см. картинку таблицу ниже) От 32 до 127 - латинские буквы, цифры и знаки пунктуации (нам они тут не пригодятся, они и так выводятся в FC нормально) 128 - 255 это то что нам пригодится - буквы кириллицы, всякие прикольные символы и т.д. Т.е. на Си, мы создаем строковый массив в переменной hello_world, а массив, через запятую, наполняем числовыми кодами значений символов. В нашем случае это: 207 - П 240 - р 232 - и 226 - в и т.д. В конце обязательно поставьте ",0". Все, теперь просто вызываем в нужном месте на дисплей печать этой переменной. Конечно, при симуляции в FC это не увидишь, си вставки не симулируются в программе. Я делаю так: Макросом print, вывожу на экран слово латинскими буквами, это позволяет увидеть где оно расположено, размер и выводится ли вообще. Перед ним вставляю C Code с началом ремарки /* а после него с обратной ремаркой */ Теперь при компиляции программа проигнорирует этот участок, а при симуляции проигнорирует си вставки. И не будет перебивания переменных одна другой.
Array
Файлы.
|