Давайте сделаем один шаг за раз ...
State=(State<<1) | !input(USER_BUTTON) | 0xe000;
Что это делает:
- Сдвиньте состояние влево (выбросьте верхний бит, переместите все заново, установите младший бит на 0)
- Установить младший бит, если вход 0 (выкл.)
- Принудительно включить 3 старших бита.
Итак, здесь есть 13 битов, которые не включены, и они образуют своего рода историю последних 13 выборок входа USER_BUTTON.
Тогда оператор if просто проверяет, все ли 13 из этих битов выключены (дает 0xe000) или включена (дает 0xffff). Если выключено, кнопка была нажата для 13 сэмплов; если включено, то было не нажато для 13 образцов.
Это тогда дает время отката 4,4 мс * 13 = 57,2 мс - немного от комментария или интервал таймера ближе к 5,385 мс.