Д.ARMоед (25.07.2013 14:14, просмотров: 438) ответил Ксения на Это не поможет. Число на дисплее приходится обновлять каждую секунду, а беда в том, что почти половину из этой секунды пожирает Display_Step(). Причем расходуется не на дело, а на таймауты. Не будь этих таймаутов, то Display_Step() можно было хоть
Поможет. Display_Step() рубить нельзя. Для Display_Step():
Вам известно, после каких действий начинать таймаут. Именно после них запоминаем номер "точки выхода" и сразу переходим в конец процедуры, где устанавливаем DISPLAY_LAZY_TIME = RTC_TIME + TIMEOUT_VALUE. Усё. Выходим из Display_Step().
При следующем заходе в Display_Step()
проверяем DISPLAY_LAZY_TIME > RTC_TIME:
true : тупо выходим.
false: продолжаем после запомненной "точки выхода".
Естественно, это не вся логика - ещё нужно дополнить реакцией на DISPLAY_UPDATE_BIT и правильно учитывать переход RTC через ноль.
Таким образом, Ваш дисплей - это асинронный конечный автомат с состояниями по номерам "точек выхода". И эти состояния не "макаронят" Main loop своим расписанием, а обрабатываются только в процедуре дисплея, не блокируя выполнение других процедур на время таймаутов.