随想杂谈--一个GPIO控制两个按键的方法

本文探讨如何使用单片机的GPIO接口巧妙地控制两个独立按键,详细解析了硬件连接和软件编程的步骤,包括中断设置与事件处理,实现高效可靠的按键检测。

随想杂谈--一个GPIO控制两个按键

最近在一个工程中,受限于单片机管脚不够的原因,不得不使用一个GPIO口控制两个按键,
在这里顺便记录下使用的过程。

说起用一个GPIO口控制两个按键的方法,一般来说有三种:

第一种方法是使用GPIO对应的AD通道,通过电阻分压的方式采集每个按键按下的电平,
理论上只要AD够精准,可以控制无限个按键,使用这种方法的前提是对应的GPIO口需要ADC;
第二种方法是在管脚上加入一个电容,通过检测电容充放电来判断对应的是哪个按键被按下;
第三种方法是通过分时使能GPIO口上下拉电阻,判断对应的是哪个按键被按下,这种方法也是最简单的一种;

本次杂谈中我使用的是第三种方法,对应的电路图如下:

在这里插入图片描述

图中串在两个按键上下的电阻作用为防止两个按键同时按下时电源正负极短路,轻则单片机复位,重则烧坏芯片。

对于上下拉电阻的选择需要注意的是,单片机必须内部带有一路上拉或者下拉,不能两者都没有。如果单片机内
部带有上拉或者下拉的话,则对应部分的上下拉电阻可以取消,上拉电阻的取值必须比下拉电阻的取值小,确保
上下拉电阻同时使能时上拉电阻能正常拉高GPIO电平。

下面为代码思路,以我使用的一款应广PMS150C为例(GPIO带内部上拉):
#define PULL_UP_RESISTOIR		PAPH.4			/*< PA4口上拉使能位    */
#define key_pre					PA.4			/*< PA4口定义          */
#define RESISTOIR_ENABLE		1u				/*< 使能PA4口上拉      */
#define RESISTOIR_DISABLE		0u				/*< 禁止PA4口上拉      */
#define SWITCH_ENABLE			0u				/*< 使能上下拉进行切换  */
#define SWITCH_DISABLE			1u				/*< 禁止上下拉进行切换  */

BIT	switch_flag;		/*< 上下拉切换标志位 */

void Key_Scan(void)
{
	if (switch_flag == SWITCH_ENABLE)			/*< 上下拉切换 */	
	{
		if (PULL_UP_RESISTOIR == RESISTOIR_ENABLE) {
		    PULL_UP_RESISTOIR =  RESISTOIR_DISABLE;}
		else
		    PULL_UP_RESISTOIR =  RESISTOIR_ENABLE;	
	}
	
	if (PULL_UP_RESISTOIR == RESISTOIR_ENABLE && !key_pre)		/*< 上拉使能同时接地按键按下 */
	{
		.delay 8 * 4000;		/*< 系统时钟4MHz,延时8MS ,消抖 */
		switch_flag = SWITCH_DISABLE;	/*< 禁止上下拉切换 */	
		if (!key_pre)
		{
			while(!key_pre){	/*< 松手检测 */
			//press your code;
			}
			//press your code;
		}
		switch_flag = SWITCH_ENABLE;	/*< 使能上下拉切换 */	
	}
	else
	if (PULL_UP_RESISTOIR == RESISTOIR_DISABLE && key_pre)		/*< 上拉禁止同时接电源按键按下 */
	{
		.delay 8 * 4000;		/*< 系统时钟4MHz,延时8MS ,消抖 */
		switch_flag = SWITCH_DISABLE;	/*< 禁止上下拉切换 */	
		if (key_pre)
		{
			while(key_pre){	/*< 松手检测 */
			//press your code;
			}
			//press your code;
		}
		switch_flag = SWITCH_ENABLE;	/*< 使能上下拉切换 */	
	}
}```


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值