16-ADC检测16个按键,数码管显示键值,按键调整数码管显示内容
修改此函数主要是因为官方的函数原先看不太懂
,现在已经基本理清逻辑。
第一个函数基本功能与官方原始相同,就改变短按触发方式为弹起时触发。
第二个函数长短按触发不同按键值,短按弹起时触发,长按计数到时直接触发,验证此函数功能完整性需在主函数KeyCode中添加以下代码
if(KeyCode == 21) //hour +1
{
hour += 2;
if(hour >= 24) hour = 0;
DisplayRTC();
}
if(KeyCode == 22) //hour -1
{
hour -= 2;
if(hour >= 24) hour = 23;
DisplayRTC();
}
if(KeyCode == 23) //minute +1
{
second = 0;minute += 2;
if(minute >= 60) minute = 0;
DisplayRTC();
}
if(KeyCode == 24) //minute -1
{
second = 0;minute -= 2;
if(minute >= 60) minute = 59;
DisplayRTC();
}
//////////改编长按连续触发adckey函数,短按为弹起时触发
//void CalculateAdcKey(u16 adc)
//{
// static u8 key_lock_flag = 0;
// u8 i;
// u16 j;
//
// if(adc < (256-ADC_OFFSET))
// {
// ADC_KeyHoldCnt = 0;
// key_lock_flag = 0;
// if(ADC_KeyState)
// {
// KeyCode = ADC_KeyState; //保存键码
// ADC_KeyState = 0;
// }
// }
// else if(!key_lock_flag) //按键没自锁时
// {
// j = 256;
// for(i=1; i<=16; i++)
// {
// if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET))) break; //判断是否在偏差范围内
// j += 256;
// }
// if(i > 16) //键无效 清除所有标志
// {
// ADC_KeyHoldCnt = 0;
// key_lock_flag = 0;
// ADC_KeyState = 0;
// }
// else //键有效
// {
// ADC_KeyHoldCnt++; //开始计数
// if(ADC_KeyHoldCnt > 3) //计数到
// {
// ADC_KeyHoldCnt = 0; //清零计数标志
// ADC_KeyState = i; //设置按键值
// key_lock_flag = 1; //自锁标志置1,防止按键多次触发
// }
// }
// }
// else if(ADC_KeyHoldCnt < 100) //键已按下,未到长按计数
// {
// ADC_KeyHoldCnt++;
// if(ADC_KeyHoldCnt >= 100) //键已按下,到达长按计数
// {
// ADC_KeyHoldCnt = 90; //1s 10次触发
// KeyCode = ADC_KeyState; //设置按键值
// }
// }
//}
////////////改编长短按adckey函数,短按为弹起时触发
void CalculateAdcKey(u16 adc)
{
static u8 key_lock_flag = 0; //按键自锁标志,防止连续触发
static u8 key_short_flag = 0; //短按标志
u8 i;
u16 j;
if(adc < (256-ADC_OFFSET)) //无按键状态
{
ADC_KeyHoldCnt = 0; //按键计数清零
key_lock_flag = 0; //清除按键自锁标志
if(key_short_flag) //按键为短按
{
key_short_flag = 0; //清除短按标志
KeyCode = ADC_KeyState; //保存键码
}
ADC_KeyState = 0; //按键状态码清零
}
else if(!key_lock_flag) //按键没自锁时
{
j = 256;
for(i=1; i<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET))) break; //判断是否在偏差范围内
j += 256;
}
if(i > 16) //键无效 清除所有标志
{
ADC_KeyHoldCnt = 0;
key_lock_flag = 0;
ADC_KeyState = 0;
// key_short_flag = 0;
}
else //键有效
{
ADC_KeyHoldCnt++; //开始计数
if(ADC_KeyHoldCnt > 3) //计数到 30ms
{
ADC_KeyHoldCnt = 0; //清零计数标志
ADC_KeyState = i; //设置短按按键值
key_lock_flag = 1; //自锁标志置1,防止按键多次触发
key_short_flag = 1; //设置按键为短按状态
}
}
}
else if((ADC_KeyHoldCnt < 100) && (key_short_flag == 1)) //已按下,未到长按计数
{
ADC_KeyHoldCnt++;
if(ADC_KeyHoldCnt >= 100) //到达长按计数 1s
{
key_short_flag = 0; //清除短按标志,防止按键弹起时短按触发
ADC_KeyHoldCnt = 0; //计数清零
KeyCode = ADC_KeyState + 20; //设置长按按键值
}
}
}