Столкнулся с одной непонятной проблемой. Нужно хранить массив строк в памяти программ и выводить его на дисплей. Для этого подключена библиотека
pgmspace.h
Для хранения массива строк, вначале, использовал объявление двумерного массива в виде
Код: Выделить всё
const char txt[3][9] PROGMEM = {"Text1","Text12","Text123"};
Тут размер массива выбирается по самому длинному тексту + символ конца строки.
Функция вывода этого текста выглядит так
Код: Выделить всё
void lcd_putsf(const char *string) {
while (pgm_read_byte(string))
{
lcd_write(pgm_read_byte(string++));
}
}
а ее вызов, соответственно
выведет самый первый элемент.
Но такое размещение массива строк в памяти не экономично, так как величина массива определяется по самому большой текстовой строке. Я перерыл кучу справочников и "обучалок". Есть другой способ с экономией памяти.
Вначале создаются сами строки
Код: Выделить всё
const char txt1[] PROGMEM = "Text1";
const char txt2[] PROGMEM = "Text12";
const char txt3[] PROGMEM = "Text123";
Затем создается сам массив
Код: Выделить всё
const char* const txt[] PROGMEM = {txt1,txt2,txt3};
И вот тут полная лажа. Код компилируется без ошибок и предупреждений, но на дисплей выводится мусор. Да! При этом явно экономится память программ, вопросов нет. Пытался смотреть в симуляторе, но не понял до конца. В первом случае я вижу в памяти программ весь массив, во втором только значение txt[0]. Но я с симулятором сильно не дружу, могу и наврать.
Подскажите, где во втором способе создания массива ошибка, или ошибка в функции вывода?
Я пробовал убрать определитель PROGMEM из строчки
Код: Выделить всё
const char* const txt[] PROGMEM = {txt1,txt2,txt3};
приведя ее к виду
Код: Выделить всё
const char* const txt[] = {txt1,txt2,txt3};
Тогда моя функция работает, но резко вырастает объем потребляемой памяти данных.