帮助解读速记C

时间:2009-08-11 02:07:48

标签: c embedded

我正在试图找出一些为我们编写的固件。我不是那么熟悉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.4ms发光

感谢。

3 个答案:

答案 0 :(得分:13)

让我们一步一步......

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

这是做什么的:

  • 向左移一个状态(抛出最高位,将所有内容移开,将低位设置为0)
  • 如果输入为0(关闭),则设置低位
  • 强制开启前三位。

因此,这里有13位没有被强制打开,它们形成了USER_BUTTON输入的最后13个样本的历史记录。

if语句然后只检查这些位中的所有13位是否关闭(给出0xe000)或打开(给出0xffff)。如果关闭,按钮 13个样本;如果打开,则13个样本的未按下

然后它的去抖时间为4.4ms * 13 = 57.2ms - 与评论相差一点,或者定时器间隔接近5.385ms。

答案 1 :(得分:2)

将varialbe“State”视为16位。 &lt;&lt;&lt;操作员每次将它左移一个,并且|每当输入(USER_BUTTON)为假(!是非运算符)时,运算符用于设置最低有效位。然后,检查只检查最后13个输入的案例是否全部为真或全部为假。

答案 2 :(得分:2)

他通过每隔4.4ms将开关状态的样本移动到一个整数来解除开关。然后,他可以通过查看该整数的内容是否与某个十六进制值匹配来告知有效的噪音。通过将它与不同的值进行比较,看起来他也可以根据他的定义判断它是否已被释放。