2009-08-11 5 views
3

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

// 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.4ms

Благодарности.

+0

информации на самом деле недостаточно, не зная, что изначально было изначально и что представляет 0xE000 (что, вероятно, является битовым полем реестра) – Earlz

+3

Этот код был скопирован с http://www.ganssle.com/debouncing.pdf page 20 – Mark

+0

@Mark - Я знал, что это было знакомо –

ответ

13

Давайте еще один шаг в то время ...

State=(State<<1) | !input(USER_BUTTON) | 0xe000; 

Что это делает:

  • Смена состояния один влево (выбросить верхний бит, переместить все более, установите нижний бит в 0)
  • Установите нижний бит, если входной сигнал 0 (выкл.)
  • Задействуйте верхние 3 бита.

Итак, здесь 13 бит, которые не принудительно включены, и они образуют своего рода историю из последних 13 выборок ввода USER_BUTTON.

Затем оператор if проверяет, не выключены ли все 13 из этих бит (дается 0xe000) или включено (дается 0xffff). Если выключено, кнопка была нажата для 13 образцов; если включено, это было un-press для 13 образцов.

В этом случае время отладки составляет 4.4 мс * 13 = 57,2 мс - бит от комментария, или интервал таймера ближе к 5.385 мс.

+0

Спасибо! Это наиболее полезно для выяснения этого. Любой шанс, что вы можете взять меня через несколько итераций asssuming State start at zero и input (USER_BUTTON), является ложным (например), разве он не просто бесконечно больше? | означает побитовое ИЛИ, правильно?Так что, когда я получаю мои удобные окна программирования калькулятор результаты для первого 3 являются: E001 1E003 3E007 , и мы уже видим, что нет никакой надежды на это время 0xffff или 0xe000 никогда. Какая простая очевидная вещь мне не хватает? – Steven

+0

Состояние, скорее всего, беззнаковое короткое, что означает, что он усекается в 16 бит (4 шестнадцатеричных разряда) каждый раз. – bdonlan

2

Подумайте о varialbe «State» как 16 бит. Оператор < < сдвигает его налево каждый раз, а | оператор используется для установки младшего значащего бита всякий раз, когда ввод (USER_BUTTON) является ложным (! является оператором not). Затем проверки проверяют, были ли последние 13 случаев ввода истинными или все ложные.

2

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

Смежные вопросы