-
- 15989767972
-
9 发帖9 回复163 积分
- 私信他 + 关注
分享到:
(1)选择电阻搭配的时候,每个按键按下的时候,每次组合出来的电阻值要区别尽量大,防止AD误差+电阻误差+机械按键损耗误差。
(2)第一次得出来AD要丢弃,还要要进行多次消抖。
(3)久经市场考验的源代码已经贴出,麻烦各位电工一起讨论
void Key_Analyze(void)
{
static volatile uint8 key_last = 0;
static volatile uint16 key_cnt = 0;
u8tmp = Key_Get_Driver(); //获取当前按键
//配置缓存
switch (key_state)
{
case KEY_DETECT:
key_cnt = 0;
b_key_series = 0;
if (u8tmp)
{
key_last = u8tmp;
key_state = KEY_AFFIRM;
}
break;
case KEY_AFFIRM:
if (key_last == u8tmp)
{
if (++key_cnt >= 8) //40ms
{
key_cnt = 0;
b_key_refresh = 1;
key_state = KEY_RELEASE;
//确认键值
if (u8tmp == 0x08) {key_value = KEY_POWER;}
else if (u8tmp == 0x40) {key_value = KEY_MODE;}
else if (u8tmp == 0x20) {key_value = KEY_TIMER;}
else if (u8tmp == 0x10) {key_value = KEY_SET;}
else if (u8tmp == 0x04) {key_value = KEY_UP;}
else if (u8tmp == 0x02) {key_value = KEY_DOWN;}
else if (u8tmp == 0x01) {key_value = KEY_DIMMER;}
else {b_key_refresh = 0;}
}
}
else
{
key_state = KEY_DETECT;
}
break;
case KEY_RELEASE:
b_key_series = 0;
if (u8tmp)
{
key_cnt = 0;
}
else
{
if (++key_cnt >= 8)
{
key_cnt = 0;
key_state = KEY_DETECT;
}
}
break;
default:
break;
}
}
/***************************************************
*函数名称:Key_Get_Driver
*输 入:void
*输 出:按键状态
*说 明:按键获取驱动
***************************************************/
uint8 Key_Get_Driver(void)
{
u8tmp = ADC_Result(1);
if (u8tmp < 5) return 0x04; //2R
else if ((u8tmp >= 20) && (u8tmp <= 26)) return 0x02; //1K
else if ((u8tmp >= 40) && (u8tmp <= 51)) return 0x01; //2.2K
else if ((u8tmp >= 63) && (u8tmp <= 78)) return 0x08; //3.9K
else if ((u8tmp >= 128) && (u8tmp <= 147)) return 0x10; //12K
else if ((u8tmp >= 171) && (u8tmp <= 187)) return 0x20; //24K
else if ((u8tmp >= 195) && (u8tmp <= 208)) return 0x40; //39K
if (u8tmp > 250) return 0x00; //释放
else return 0xFF; //无效
}
(0 )
(0 )
回复
举报
发表回复
版
块
导
航
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖

发帖
回复
楼主