首页 论坛 原厂专区 晟矽微电子 利用AD检测多个按键,怎么才能可靠稳定?返工得出血的经验教训。

发帖 回复

[原创] 利用AD检测多个按键,怎么才能可靠稳定?返工得出血的经验教训。
603 查看
0 回复
 楼主 | 发布于 2022-03-14 | 只看楼主
分享到:
(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 )
回复 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部