Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Написание функции для ЖКИ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Panych
Собственно, делаю сейчас так:
Код
__flash const char TL[ 3 ] = { 3, 8, 8};
__flash const char TEXT[][ 20 ] = {
/* 00 */{ 'a','l','l'},
/* 01 */{ 'D','E','V','I','C','E',' ','1' },
/* 02 */{ 'D','E','V','I','C','E',' ','2' },
};

TL[] содержит длины строк, дальше все понятно. Хотелось бы от него избавиться, но не нашел в литературе, как "взять" длину строки массива.

И второй вопрос по кириллице - есть индикатор ее поддерживающий, но не получается никаким способом написать что-то анологичное приведенному для русских букв.
Panych
Собственно, буду благодарен за подсказку направления...
vet
Код
#define MAX_TEXT_LEN 19
__flash const char TEXT[][ MAX_TEXT_LEN+1 ] = {
/* 00 */"all",
/* 01 */"DEVICE 1",
/* 02 */"DEVICE 2",
};

принятый в С признак конца строки - нулевой байт; его обеспечит компилятор при размещении переменной во FLASH. Нужно только зарезервировать под него место, т.е. в данном случае - не вписывать строки длиннее MAX_TEXT_LEN.

Касательно русских букв, вариантов два: кодировка win1251 в исходниках (читабельные строки) плюс перекодировка во время выполнения, или перекодированные строки непосредственно в исходниках. Функция для первого варианта приведена ниже.
Код
flash unsigned char RusChar[] =
   {0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8
,
     0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0xC4,0xAF,0xB0,0xB1,
     0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe,
     0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7}
;

/*
* конвертирование символа из кодировки Windows в кодировку дисплея
* sym - символ в кодировке Windows
* результат - символ в кодировке дисплея
*/
byte ConvertSymToDisplayCode(byte sym)
{
  char c;
  c = sym;
  if(c>='А') return RusChar[c-192];
  else if (c=='Ё') return 0x45;
  else if (c=='ё') return 0x65;
  else if (c>=0x80) return c+0x40;
  return c;
}
msalov
Цитата(vet @ Mar 26 2008, 15:35) *
Код
#define MAX_TEXT_LEN 19
__flash const char TEXT[][ MAX_TEXT_LEN+1 ] = {
/* 00 */"all",
/* 01 */"DEVICE 1",
/* 02 */"DEVICE 2",
};

Не знаю как в вашем компиляторе обьявляются массивы во флеш, но предположу что так:
Код
__flash const char * __flash text[] =
{
"string1",
"string2",
"string3"
}

Мой вариант займёт меньше места за счёт того, что длинны строк не будут выравнены.
Panych
vet,gotty спасибо, но как выбирать отдельные символы (точнее, их коды) из такого массива для отправки ЖКИ?

Цитата(gotty @ Mar 26 2008, 17:10) *
Не знаю как в вашем компиляторе обьявляются массивы во флеш, но предположу что так:

компилятор IAR 4.20A выдал предупреждение:
Warning[Pa011]: memory attribute duplicated D:\...\main.c 57


Пошел читать книжки в данном направлении, хотя если кому не лень будет продолжить... smile.gif
msalov
Цитата(Panych @ Mar 26 2008, 16:47) *
vet,gotty спасибо, но как выбирать отдельные символы (точнее, их коды) из такого массива для отправки ЖКИ?
отдельные символы беруться как из любого массива (которым он и является): TEXT[x][y], где x - номер строки, y - номер символа в строке
TEXT[x][y] == '\0' - конец строки.
Цитата(Panych @ Mar 26 2008, 16:47) *
компилятор IAR 4.20A выдал предупреждение:
Warning[Pa011]: memory attribute duplicated D:\...\main.c 57
Пошел читать книжки в данном направлении, хотя если кому не лень будет продолжить... smile.gif
Видимо надо __flash const char * text[] ...
Читайте про обьявление массивов во флеш вашего компилятора.
Panych
все так и есть...
пошел читать... smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.