реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Написание функции для ЖКИ, Способы организации массивов, русские буквы
Panych
сообщение Mar 26 2008, 11:48
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Собственно, делаю сейчас так:
Код
__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[] содержит длины строк, дальше все понятно. Хотелось бы от него избавиться, но не нашел в литературе, как "взять" длину строки массива.

И второй вопрос по кириллице - есть индикатор ее поддерживающий, но не получается никаким способом написать что-то анологичное приведенному для русских букв.


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Panych
сообщение Mar 26 2008, 13:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Собственно, буду благодарен за подсказку направления...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 26 2008, 13:35
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Код
#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;
}


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 26 2008, 14:10
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(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"
}

Мой вариант займёт меньше места за счёт того, что длинны строк не будут выравнены.
Go to the top of the page
 
+Quote Post
Panych
сообщение Mar 26 2008, 14:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



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

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

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


Пошел читать книжки в данном направлении, хотя если кому не лень будет продолжить... smile.gif


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 26 2008, 14:52
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(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[] ...
Читайте про обьявление массивов во флеш вашего компилятора.
Go to the top of the page
 
+Quote Post
Panych
сообщение Mar 26 2008, 15:03
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



все так и есть...
пошел читать... smile.gif


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016