Как просто 
Я, как всегда, на прерываниях сделал
))
В общем у меня проект бАльшой, посему вырезки, мож кому пригодится:
Код:
// вход датчика света (аналог)
#define LIGHT_SENS 7
// текущее и новое значение яркости подсветки
volatile byte bl_cur = 0, bl_new = 0;
// меняем яркость подсветки LCD
void set_bl(byte val) { bl_new = val; }
// Вызывается 100 раз в секунду (см attach() в IRremote.cpp)
void isr()
{
// проверка, нужно ли порулить полвсеткой LCD
if (bl_cur != bl_new)
{
if (bl_new > bl_cur)
bl_cur++;
else
bl_cur--;
analogWrite(LCD_BKLT, bl_cur);
}
}
В общем, когда надо установить нужный уровень - просто вызываем:
В общем получается красиво и жутко плавно.