可能是我程序分析有问题:
void CalculateAdcKey(u16 adc)
{
u8 i;
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
}
}
}
下面这段没必要每次进函数都执行一遍,还是个for循环,应该有按键按下时才执行。
相当于无按键时,每10ms进函数执行一次delay_us(n);
////////////根据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
{...........
优化后的程序,先判断有无按键,无按键清零几个状态直接退出函数。(只执行相应分支)
void CalculateAdcKey(u16 adc)
{
u8 i;
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
}
}
}