ADC检测多个按键

来源:互联网 发布:淘宝达人 开店 编辑:程序博客网 时间:2024/06/04 19:49

按照传统的按键检测方法就是一个按键对应一个IO口,进行高低电平检测。可是在IO口紧缺的情况下,不得不需要一个有效的解决方案

借鉴网上的资料了解到一个简单的方法,希望分享一下。

ADC检测实现简单实用的按键方法:仅需要一个AD口和若干个电阻就可实现多个按键的输入检测。

工作原理:按下按键时,通过电阻分压得到不同的电压值。

摘录网上的图片



根据上述电路,4个1K的电阻串联后,节点的位置分别接有按键K1,K2,K3,K4,那么按键单独按下,单片机AD口依次检测到3.7V,3.33V,2.5V,0V,只要将分压值用数组保存起来。补充:没有按键按下时:AD口检测为5v。

通过查表法,就可以实现按键检测,在按键检测的过程中也需要进行按键消抖处理。

简单代码示例:

/*************************************************************************************************************************** *功能描述:ADC采集多个按键 *输入参数:无 *输出参数:无 * 返回参数:非0为按下按键数,0:无按键按下****************************************************************************************************************************/unsigned float Sample_Volt[] = {3.75,3.33,2.5,0};      //对应上图K1,K2,K3,K4,AD口所采集到的电压值,供查表。unsigned char ADC1_KeySample(void){unsigned float KeyVolt = ADC1_GetVolt();//ADC1_GetVolt为采集到按键电压函数,如果是八位单片机考虑浮点运算压力,可以使用采集AD模拟量来进行判断for(unsigned char i = 0;i < 4;i++){if( (KeyVolt >= Sample_Volt[i] - 0.2) && KeyVolt <= Sample_Volt[i] + 0.2) //允许电压偏差正负0.2V,但还是会存在由于电源不稳导致误判断return i + 1;//返回按键数}
return 0;//返回0:无按键按下
}


电路图存在隐患:按键不能串在分压回路里,分压检测需要各自独立,按键只需连接各分压点和AD输入点,这样因为AD口的输入阻抗比较大,按键的接触电阻对电阻分压的影响较小,缺点是:分压回路会一直消耗电流,对电源耗电不利。
改进电路借鉴网友提供的图:


说明:ADC0是接按键的AD
以上记录可能存在错误,本着不喜勿喷原则,望各位大虾赐教指点。

原创粉丝点击