Помогите расшифровать аббревиатуру С

Пытаюсь разобраться с некоторыми прошивками, которые были написаны для нас. Я не очень хорошо знаком с C, и я думаю, что здесь происходит какая-то стенография, которую я просто не понимаю. Я не понимаю, как код относится к комментариям, особенно как вы получаете 70 мс от любого из них. Поможете перевести на английский?

// so the button has to be held for 70 ms to be considered being pressed
// and then has to be released for 70ms to be considered un-pressed
State=(State<<1) | !input(USER_BUTTON) | 0xe000;
if(State==0xe000)
{
    Debounced_Button_Pressed =  TRUE;
    time_button_held++;
}
else if (State==0xffff)
{
    Debounced_Button_Pressed =  FALSE;
}

Это внутри функции прерывания таймера и, по-видимому, срабатывает каждые 4,4 мс.

Спасибо.


person Steven    schedule 11.08.2009    source источник
comment
на самом деле недостаточно информации, не зная, каким изначально было состояние и что представляет собой 0xE000 (что, вероятно, является просто битовым полем регистра)   -  person Earlz    schedule 11.08.2009
comment
этот код был скопирован с ganssle.com/debouncing.pdf стр. 20   -  person Mark    schedule 11.08.2009
comment
@Mark - я знал, что это выглядит знакомо   -  person Michael Burr    schedule 11.08.2009
comment
Ахха! Вы знаете, мне было интересно, почему он использовал State как переменную... это не согласуется с остальной частью стиля (больше ничего не пишется с заглавной буквы), а у нас уже была переменная state. Не то чтобы это имело значение, но это объясняет. С одной стороны, я рад, что он не изобрел велосипед... с другой, у нас сейчас проблема с авторскими правами или это все кошерно?   -  person Steven    schedule 12.08.2009


Ответы (3)


Давайте сделаем это шаг за шагом...

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 мс.

person bdonlan    schedule 11.08.2009
comment
Благодарю вас! Это больше всего помогает разобраться. Есть ли шанс, что вы можете провести меня через несколько итераций, предполагая, что состояние начинается с нуля, а ввод (USER_BUTTON) является ложным (например), разве он не становится бесконечно большим? | означает побитовое ИЛИ, верно? Итак, когда я достаю свой удобный калькулятор программирования для Windows, результаты для первых 3 таковы: E001 1E003 3E007, и мы уже можем видеть, что нет никакой надежды на то, что это когда-либо снова будет 0xffff или 0xe000. Какую простую очевидную вещь я упускаю? - person Steven; 12.08.2009
comment
Состояние, скорее всего, является беззнаковым коротким, то есть оно каждый раз усекается до 16 бит (4 шестнадцатеричных цифры). - person bdonlan; 12.08.2009

Думайте о переменной «Состояние» как о 16 битах. Оператор ‹‹ каждый раз сдвигает его влево на единицу, а оператор | оператор используется для установки младшего значащего бита всякий раз, когда input(USER_BUTTON) имеет значение false (! — оператор not). Затем проверки просто проверяют, все ли последние 13 случаев ввода были истинными или все ложными.

person Matthias Wandel    schedule 11.08.2009

Он устраняет дребезг коммутатора, переводя образцы состояния коммутатора в целое число каждые 4,4 мс. Затем он может отличить действительное нажатие от шума, проверив, соответствует ли содержимое этого целого числа определенному шестнадцатеричному значению. Похоже, он также может сказать, был ли он выпущен в соответствии с его определением, сравнив его с другим значением.

person Stephen Friederichs    schedule 11.08.2009