xujibicool 发表于 2024-12-23 20:37:05

官方的adc按键程序,感觉效率不高啊

<p>可能是我程序分析有问题:</p>
<pre><code>void CalculateAdcKey(u16 adc)
{
    u8i;
    u16 j;

    if(adc &lt; (256-ADC_OFFSET))   //无按键时
    {
      ADC_KeyState = 0;   //键状态归0
      ADC_KeyHoldCnt = 0;
    }

                ////////////根据adc值查找i值
    j = 256;
    for(i=1; i&lt;=16; i++)
    {
        if((adc &gt;= (j - ADC_OFFSET)) &amp;&amp; (adc &lt;= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
        j += 256;
    }

                //相当于消抖,等待按键稳定,至少连续3次查找 30ms
    ADC_KeyState3 = ADC_KeyState2;
    ADC_KeyState2 = ADC_KeyState1;

    if(i &gt; 16)ADC_KeyState1 = 0;//键无效
    else                        //键有效
    {
        ADC_KeyState1 = i;
        if((ADC_KeyState3 == ADC_KeyState2) &amp;&amp; (ADC_KeyState2 == ADC_KeyState1) &amp;&amp;
          (ADC_KeyState3 &gt; 0) &amp;&amp; (ADC_KeyState2 &gt; 0) &amp;&amp; (ADC_KeyState1 &gt; 0))
        {
                if(ADC_KeyState == 0)   //第一次检测到
                {
                  KeyCode= i;   //保存键码
                  ADC_KeyState = i;   //保存键状态
                  ADC_KeyHoldCnt = 0;
                }
                if(ADC_KeyState == i)   //连续检测到同一键按着
                {
                  if(++ADC_KeyHoldCnt &gt;= 100) //按下1秒后,以10次每秒的速度Repeat Key
                  {
                        ADC_KeyHoldCnt = 90;
                        KeyCode= i;   //保存键码
                  }
                }
                else ADC_KeyHoldCnt = 0; //按下时间计数归0
        }
    }
}
</code></pre>
<p>下面这段没必要每次进函数都执行一遍,还是个for循环,应该有按键按下时才执行。</p>
<p>相当于无按键时,每10ms进函数执行一次delay_us(n);</p>
<pre><code>////////////根据adc值查找i值
                j = 256;
                for(i=1; i&lt;=16; i++)
                {
                                if((adc &gt;= (j - ADC_OFFSET)) &amp;&amp; (adc &lt;= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
                                j += 256;
                }

                //相当于消抖,等待按键稳定,至少连续3次查找 30ms
                ADC_KeyState3 = ADC_KeyState2;
                ADC_KeyState2 = ADC_KeyState1;

                if(i &gt; 16)ADC_KeyState1 = 0;//键无效
                else
                {...........
</code></pre>
<p>优化后的程序,先判断有无按键,无按键清零几个状态直接退出函数。(只执行相应分支)</p>
<pre><code>void CalculateAdcKey(u16 adc)
{
    u8i;
    u16 j;

    if(adc &lt; (256-ADC_OFFSET))   //无按键时
    {
      ADC_KeyState = 0;   //键状态归0
      ADC_KeyHoldCnt = 0;
      ADC_KeyState1 = 0;
    }
    else    //有按键时
    {
                ////////////根据adc值查找i值
      j = 256;
      for(i=1; i&lt;=16; i++)
      {
        if((adc &gt;= (j - ADC_OFFSET)) &amp;&amp; (adc &lt;= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
        j += 256;
      }

                //相当于消抖,等待按键稳定,至少连续3次查找 30ms
      ADC_KeyState3 = ADC_KeyState2;
      ADC_KeyState2 = ADC_KeyState1;

        ADC_KeyState1 = i;
        if((ADC_KeyState3 == ADC_KeyState2) &amp;&amp; (ADC_KeyState2 == ADC_KeyState1) &amp;&amp;
          (ADC_KeyState3 &gt; 0) &amp;&amp; (ADC_KeyState2 &gt; 0) &amp;&amp; (ADC_KeyState1 &gt; 0))
        {
                if(ADC_KeyState == 0)   //第一次检测到
                {
                  KeyCode= i;       //保存键码
                  ADC_KeyState = i;   //保存键状态
                  ADC_KeyHoldCnt = 0;
                }
                if(ADC_KeyState == i)   //连续检测到同一键按着
                {
                  if(++ADC_KeyHoldCnt &gt;= 100) //按下1秒后,以10次每秒的速度Repeat Key
                  {
                        ADC_KeyHoldCnt = 90;
                        KeyCode= i;   //保存键码
                  }
                }
                else ADC_KeyHoldCnt = 0; //按下时间计数归0
        }
    }
}
</code></pre>

DebugLab 发表于 2024-12-23 23:07:39

你来写个效率高的,加油

men007 发表于 2024-12-24 07:26:54

学习学习,找时间试一试

xxkj2010 发表于 2024-12-24 07:53:06

<p>怎么改才高效率呢?大家企盼着</p>

bkeuqoaq 发表于 2024-12-24 08:21:08

这才多少代码,效率怎么不高,又没有什么复杂算法

xujibicool 发表于 2024-12-24 08:27:27

bkeuqoaq 发表于 2024-12-24 08:21
这才多少代码,效率怎么不高,又没有什么复杂算法
每10ms都执行一次,没必要,而且能避免,就加个else而已,改也不复杂
相当于无按键时,每10ms进函数执行一次delay_us(n);

bkeuqoaq 发表于 2024-12-24 08:40:44

xujibicool 发表于 2024-12-24 08:27
每10ms都执行一次,没必要,而且能避免,就加个else而已,改也不复杂

没有具体分析代码

bkeuqoaq 发表于 2024-12-24 08:57:39

分析了一下,你的改进可以
页: [1]
查看完整版本: 官方的adc按键程序,感觉效率不高啊