Alexeyslav писал(а):т.е. изменили 1 символ и прийдется передать все 32. замечательный алгоритм.
Ну это лучше чем передавать по 100 раз в секунду все 32 символа.
Да и потом редко когда меняется одна буква на дисплее. Очень часто терпит изменение либо вся картинка либо значительная часть.
Ну если так не устраивает есть второй вариант. Создать 2 буфера.
1 Буфер базовый
2 Буфер произведенных измен
Если символ во втором буфере отличается от символа в первом тогда она запишется и во втором и отправится на дисплей.
Но эта операция опять не супер. Дело в том что мы должны перевести курсор по нужным координатам и записать символ.
Перевести курсор это примерно 3 команды на дисплей. Итого 4 с символом.
А если нам надо перевести курсор в 4-х местах и написать по 4 символа то это (3+4)*4=28 примерно те же самые 32 символа.
А если мы полностью обновим буфер то сколько проверок делать чтоб не перемещать курсор а писать дальше, это сколько проверок надо делать Если Если...
Алгоритм должен быть простой без кучи ветвлений.
Alexeyslav писал(а): вывод накладывается на другой надо уже исключать на программном уровне, ибо смысла так быстро менять данные на дисплее нет никакого.
Ну во первых надо подумать какие команды мы будем помещать в буфере.
И какого размера будет один элемент буфера? int(2 byte) или char(1byte)
как из буфера будем отличать команды от символов.
Например в моем случае на дисплей через регистр 595 передаются только 6 бит поскольку дисплей 4 бит режиме.
1 вариант в кольцевом буфере помещать именно 6 бит данных - конечно в одном байте - 2 бита будем терять.
Но тогда на отправку 1 символа нам потребуется 2 байта в кольцевом буфере. То есть 32 символа это уже 64 байта.
2 вариант помещать в буфере наши команды типа:
очистить дисплей
передвинуть курсор на такую позицию
вывести символ на дисплей
вывести н символов
и так далее
команда будет умещаться в один байт
команды будут исполнятся специальным обработчиком и отсылаться далее на дисплей.
Если все правильно продумать такой вариант будет более компактным.
теперь предположим такой вариант - в буфере мы забили уже 10 команд в очереди, а 11 команда предполагает инициализацию дисплея. Какой смысл исполнять предыдущие если через долю секунды дисплей обнулится.
Значит будут команды которые будут аннулировать все предыдущие поскольку они уже не имеют смысла.
кольцевой буфер будет иметь курсор и метку.
Курсор хранит позицию исполняемой команды в данный момент. Метка хранит информацию до какой позиции есть команды на исполнение.
Если курсор сравнялся с меткой больше команды не исполняются.
Каждый буфер имеет свой курсор и метку их даже можно расположить как первую и вторую переменную в массиве.
я предлагаю чтоб каждый высказал свое мнение для каждой методики и какая методика будет лучшей ту и выберем.