Lyt 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба При инициализации массив можно заполнить следующим образом: unsigned char string_to_LCD[16]={0x20,0x48,0x45,0xA8,0x50,0x45,0x50,0xAE,0x42,0x20,0xA5,0xA4,0x4D,0xFE}; можно ли аналогично заполнить этот же массив другими символами? использую такой массив для хранения кодов символов строки, выводимой на экран hd44780 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба можно ли аналогично заполнить этот же массив другими символами? Можно: unsigned char string_to_LCD[]={'h','t','c'}; Если хотите менять динамически, то можно так: string_to_LCD[7] = 0x05; Если хотите менять динамически и сразу куском, то так: memcpy(string_to_LCD, new_data, 16); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" }; кстати, в вашем масиве два байта не проиннициализированно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 15 января, 2014 Опубликовано 15 января, 2014 (изменено) · Жалоба Можно поподробнее описать строку unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" }; ? а можно стирать массив а потом заново его инициализировать с другими элементами? или это нерационально? Изменено 15 января, 2014 пользователем Lyt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба Можно поподробнее описать строку unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" }; ? а можно стирать массив а потом заново его инициализировать с другими элементами? или это нерационально? Вы можете обозначить несколько константных массивов начальной инициализации и потом копировать их в массив в оперативной памяти. Можно использовать strcopy или написать её аналог самостоятельно, ориентируясь на терминатор строки '\0' который будет автоматически добавлен в константную строку. const unsigned char init0[] = "init str 0"; const unsigned char init1[] = "SIZE:; NUM: "; unsigned char string_to_lcd[33]; //+1 символ для терминатора строки strcopy(char string_to_lcd, init0); strcopy(char string_to_lcd, init1); \ - позволяет подставить любое число или ascii-символ в данную позицию строки. Запись типа \xA8 позволяет разместить на данной позиции число 0xa8. Можно записать \" - тогда на данной позиции будет размещён ascii-код символа '"' Например unsigned char string_to_lcd[32] = "\"My LCD string\""; Если напечатать эту строку на индикаторе то получите текст "My LCD string" заключённый в кавычки. Чтобы быстро "стереть" строку запишите string_to_lcd[0] = '\0'; или эквивалентную запись string_to_lcd[0] = 0x0; Кстати const unsigned char в зависимости от процессора будет располагаться в различных типах памяти. Для AVR лучше использовать __flash unsigned char чтобы константные строки ложились во flash. Если Вы оставите const unsigned char то строки будут располагаться в оперативке, что не есть рационально для этого процессора. Для ARM const unsigned char будет расположено во flash. Всё вышесказанное по поводу расположения строк относится к IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 15 января, 2014 Опубликовано 15 января, 2014 (изменено) · Жалоба а можно стирать массив а потом заново его инициализировать с другими элементами? К сожалению, нельзя. Вы можете, и это довольно удобно, делать новый массив с новыми элементами на каждый чих. Например: const char *A= {'a', 'b', 'c', 0}; printf("%s", A); const char *B = {'d', 'e', 'f', 0}; printf("%s", B); Если это ARM, то инициализаторы массивов будут лежать во флэше и вы почти не потеряете памяти на таком трюке и это будет удобно и красиво. Если это AVR например, то лучше так не делать: будет съедаться стэк, если не ошибаюсь. А если вы будете делать не const char *A, а char A[], то память будет съедать одинаково в обоих случаях (поправьте меня если я не прав). Изменено 15 января, 2014 пользователем andrewlekar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба пишу для stm8l решил делать как раз делать новый массив с новыми элементами на каждый чих const char *A= {'a', 'b', 'c', 0}; а что делает эта строка? *А-указатель на массив ? char string3_to_LCD[16]={0x20,0xA8,0x45,0x50,0xA5,...} IAR пишет во флеш Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба Да, для STM8 должно ок получиться. а что делает эта строка? *А-указатель на массив ? Да. В общем-то ничем не отличается от char[], но меньше места займёт. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться