Графические дисплеи и библиотеки к ним

У меня вопрос, обязательно так писать каждую строку, как я массивом сделал нельзя? Я видел этот пример, спасибо?

const char string_0[] PROGMEM = "String 0"; // "String 0" etc are strings to store - change to suit.
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";


const char *const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};

Обязательно, если массив строк объявляется как массив указателей на строки. При вашем приеме в progmem хранятся указатели на строки, распологающиеся в RAM, а не в progmem и strcpy_P тыкается не по тому адресу.

1 лайк

Спасибо! надо мне подтянуть теорию основательно, а то пример был перед глазами, а я начал издеваться над ним! :joy:

Приветствую!
Подскажите почему так?
Atmega 328p, lcd st7920-128x64 - sw-psi подключён.
Через 8 бит изображение выводит почти на треть дольше, хотя, в теории, должно быть как минимум втрое быстрее.
так 0,105 сек.
U8GLIB_ST7920_128X64_4X u8g(14, 15, 16);
так 0,150 сек
U8GLIB_ST7920_128X64_4X u8g(0, 1, 2, 3, 4, 5, 6, 7, 14, 16, 15);

Это старая библиотека, используйте U8G2.

1 лайк

Мужчины подскажите как в данной библиотеке использовать обновление ограниченной области экрана?
Интересует именно функция updateDisplayArea(). К примеру вывод часов. Пытаюсь обновить в границах верхней строки. Или нужно применять совместно с firstPage() и nextPage() функциями? Проблема отображение на экране, было время 23:59, меняю время 11:11 и остаются пиксели от предыдущих цифр, от 5,9 и 3… использовать функции clearBuffer() или clearDisplay() так это надо весь экран перерисовывать((

‘’’

                                    u8g2_UpdateDisplayArea(&u8g2, 1, 1, 16, 1); // 1-левое положение, 1-от верха, 16-ширина, 1-высота(в тайтлах 8*8 пикселей)
				itoa(hour_time, lcd_buf, 10);
				if(hour_time < 10) { ////вывод дополнительного нуля (01:05 например)
					u8g2_DrawUTF8(&u8g2, 1, 7, "0");
					u8g2_UpdateDisplay(&u8g2);
					u8g2_DrawUTF8(&u8g2, 5, 7, lcd_buf);
					u8g2_UpdateDisplay(&u8g2);

				}else{
					u8g2_DrawStr(&u8g2, 1, 7, lcd_buf);
					u8g2_UpdateDisplay(&u8g2);
				}

				u8g2_DrawStr(&u8g2, 10, 7, ":");  //разделитель
				u8g2_UpdateDisplay(&u8g2);

				itoa(min_time, lcd_buf, 10);
				if(min_time < 10) { ////вывод дополнительного нуля (01:05 например)
					u8g2_DrawStr(&u8g2, 15, 7, "0");
					u8g2_UpdateDisplay(&u8g2);
					u8g2_DrawStr(&u8g2, 20, 7, lcd_buf);
					u8g2_UpdateDisplay(&u8g2);
				} else {
					u8g2_DrawStr(&u8g2, 15, 7, lcd_buf);
					u8g2_UpdateDisplay(&u8g2);
				}

‘’’

Для красивых/крупных шрифтов - надо выводить глиф полностью вместе с фоном…либо рисовать сначала в чистом буфере и потом выводить из буфера готовую картинку на экран.

т.е. собрать строку “11:11” и вывести одной командой? а где есть подобная теория принцип работы, а то у меня много вопросов накопилось с вашим ответом - фон, фона то нет, чистый буфер… Перевел в библиотеке референс мануаль, но что то прозрения не случилось. да и шрифт не красив и не крупен 5х7

Покажите фото косяка при выводе …

полоски рисую на начале на этапа инициализации дисплея

Тут видна проблема не с фоном, а с разной шириной символов…

да это понятно, но касательно данной библиотеки U8g2 как осуществить обновление выбранной области в тайтлах, с помощью функции updateDisplayArea() данной библиотеки

UpdateDisplay у вас неоправданно часто вызывается !!!
Выведите в эту область прямоугольник цветом фона, но не обновляйте область и сразу выводите туда свои цифры и после крайней цифры обновляйте область целиком.

1 лайк

вот как, теперь дошло, это то - что смотрел в примерах использования updateDisplayArea() на гитхабе сслыка еще есть там, но вот мне было не понятно для чего они область рисуют, не придал этому значения даже и именно потом они обновляют область после вывода! Спасибо, буду пробовать!