Я и сам первоначально так же делал - обновлял из видеобуфера дисплей в конце главного цикла. Но можно буквально совсем немного переделать, то что уже есть - и станет намного шустрее всё.
У Вас там в любом случае есть код вроде такого:
Спойлер
Код: Выделить всё
write_display(char data)
{
PORTB = data;
strob();
big_delay_us(60);
}
update_display()
{
for (int i = 0; i < W; i++) {
char cmd;
// позиционирование
WR = 0;
write_display(cmd1);
write_display(cmd2);
write_display(cmd3);
WR = 1;
// посылка данных
for (int i = 0; i < H / 8; i++) {
index = ...;
char data = buffer[index];
write_display(data);
}
}P.S. Если интересно, применение озвученного подхода можно глянуть здесь: https://github.com/WiseLord/ampcontrol/ ... rc/display - файлы st7920.c/h.
То есть, весь конечный автомат построен на двух переменных (i, j). Переменная j на каждом прерывании таймера инкрементируется (от 0 до 31), записывая последовательно данные в выбранный ряд. Следующая фаза - j=32 - установка номера страницы, за который отвечает i. Следующая фаза j=33 - установка адреса начало страницы в ноль и сразу же перевод дисплея в режим чтения. Следующая фаза j = 34 - читается состояние на порту дисплея. Ну а дальше - переход в фазу 0 и всё по кругу - в выбранную страницу записывается пачка данных (32 байта) из буфера.
То есть, помимо того, что запись в дисплей идёт "в фоне", практически не задерживая главный цикл, наличие таймера позволяет параллельно регулировку яркости через ШИМ и периодом 34 * 60 = ~2мс (500Гц) опрашивать состояние ножек на линии данных дисплея. То есть, там ещё могут висеть до 8 кнопок (замыкающихся на землю через резистор)


