- 15989767972
-
9 发帖10 回复165 积分
- 私信他 + 关注
分享到:
(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 )
回复
举报
发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖