Можно еще так (отлично поджодит для динамичесской развертки):
Используются два прерывания одного таймера(для АВР подходит для пиков не знаю)
первое по переполнению: в нем стандартная процедура вывода текущего символа
второе по совпадению: в нем тушится разряд
в регистр OCRA (первый компаратор совпадения таймера) заносится значение нужной яркости. чем больше - тем ярче (учитывать предыдущие советы по рассчету коефициента пращения/уменьшения значения) К примеру
ATTiny2313 таймер 0 - 8 бит максимальное значение 255 для 10-ти шагов яркости коефициент приращения будет 25.5, чтоб не сношаться с дробями отвожу два разряда под переменную яркости (число с фиксированой точкой), а использую для записи в компаратор значение старшего разряда регистра.
В общем схема такая:
1 Прерывание переполнения: вычисляем код следуючего символа, перключаем индикатор, выводим символ.
2 Прерывание по совпадению компаратора: тушим индикатор.
3 Увеличение яркости: Яркость = яркость + коефициент приащения. Старший байт переменной яркость занести в компаратор совпадения
4 Уменьшения яркости: Яркость = яркость - коефициент приращения. Старший байт переменной яркость занести в регистр компаратора таймера.
и все программа будет работать полностью в прерываниях, подпрограммы 3 и 4 привязать к событию нажатия клавиш +/- регулировки яркости (в простейшем случае прерывае INT0, INT1).
Плюсы такой реализации минимальное изменение программы. Работа в прерываниях. Простота реализации. Использование одного таймера (который используется для регенерации дисплея)
Минусы: Использование доп. прерывания, 2-х битная переменная величины яркости