官方的adc按键程序,感觉效率不高啊
<p>可能是我程序分析有问题:</p><pre><code>void CalculateAdcKey(u16 adc)
{
u8i;
u16 j;
if(adc < (256-ADC_OFFSET)) //无按键时
{
ADC_KeyState = 0; //键状态归0
ADC_KeyHoldCnt = 0;
}
////////////根据adc值查找i值
j = 256;
for(i=1; i<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
j += 256;
}
//相当于消抖,等待按键稳定,至少连续3次查找 30ms
ADC_KeyState3 = ADC_KeyState2;
ADC_KeyState2 = ADC_KeyState1;
if(i > 16)ADC_KeyState1 = 0;//键无效
else //键有效
{
ADC_KeyState1 = i;
if((ADC_KeyState3 == ADC_KeyState2) && (ADC_KeyState2 == ADC_KeyState1) &&
(ADC_KeyState3 > 0) && (ADC_KeyState2 > 0) && (ADC_KeyState1 > 0))
{
if(ADC_KeyState == 0) //第一次检测到
{
KeyCode= i; //保存键码
ADC_KeyState = i; //保存键状态
ADC_KeyHoldCnt = 0;
}
if(ADC_KeyState == i) //连续检测到同一键按着
{
if(++ADC_KeyHoldCnt >= 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<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
j += 256;
}
//相当于消抖,等待按键稳定,至少连续3次查找 30ms
ADC_KeyState3 = ADC_KeyState2;
ADC_KeyState2 = ADC_KeyState1;
if(i > 16)ADC_KeyState1 = 0;//键无效
else
{...........
</code></pre>
<p>优化后的程序,先判断有无按键,无按键清零几个状态直接退出函数。(只执行相应分支)</p>
<pre><code>void CalculateAdcKey(u16 adc)
{
u8i;
u16 j;
if(adc < (256-ADC_OFFSET)) //无按键时
{
ADC_KeyState = 0; //键状态归0
ADC_KeyHoldCnt = 0;
ADC_KeyState1 = 0;
}
else //有按键时
{
////////////根据adc值查找i值
j = 256;
for(i=1; i<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))break;//判断是否在偏差范围内
j += 256;
}
//相当于消抖,等待按键稳定,至少连续3次查找 30ms
ADC_KeyState3 = ADC_KeyState2;
ADC_KeyState2 = ADC_KeyState1;
ADC_KeyState1 = i;
if((ADC_KeyState3 == ADC_KeyState2) && (ADC_KeyState2 == ADC_KeyState1) &&
(ADC_KeyState3 > 0) && (ADC_KeyState2 > 0) && (ADC_KeyState1 > 0))
{
if(ADC_KeyState == 0) //第一次检测到
{
KeyCode= i; //保存键码
ADC_KeyState = i; //保存键状态
ADC_KeyHoldCnt = 0;
}
if(ADC_KeyState == i) //连续检测到同一键按着
{
if(++ADC_KeyHoldCnt >= 100) //按下1秒后,以10次每秒的速度Repeat Key
{
ADC_KeyHoldCnt = 90;
KeyCode= i; //保存键码
}
}
else ADC_KeyHoldCnt = 0; //按下时间计数归0
}
}
}
</code></pre>
你来写个效率高的,加油 学习学习,找时间试一试 <p>怎么改才高效率呢?大家企盼着</p>
这才多少代码,效率怎么不高,又没有什么复杂算法 bkeuqoaq 发表于 2024-12-24 08:21
这才多少代码,效率怎么不高,又没有什么复杂算法
每10ms都执行一次,没必要,而且能避免,就加个else而已,改也不复杂
相当于无按键时,每10ms进函数执行一次delay_us(n);
xujibicool 发表于 2024-12-24 08:27
每10ms都执行一次,没必要,而且能避免,就加个else而已,改也不复杂
没有具体分析代码 分析了一下,你的改进可以
页:
[1]