【STM32学习】(31)STM32通过ADC实现多按键功能(标准库和HAL库实现)

完整的源码链接(1条消息) STM32通过ADC实现多按键功能(标准库和HAL库实现)-电信文档类资源-CSDN下载

 

我们在使用嵌入式功能开发的时候经常需要使用按键实现一些功能。

按键一般接触较多的就是独立按键,但一般情况上会需要多个按键,使用独立按键就会使得IO口资源浪费;因此会提出使用矩阵按键,该方法是可以实现节省IO口;

本次介绍使用ADC实现多按键功能,通过采集ADC不同的值,然后判断是按键几按下?

因此要求完成功能:实现一个ADC口完成对八个按键的检测,识别按键几按下,并将结果通过串口到串口助手上显示。(标准库和HAL库实现)

单片机型号:STM32F103

电路设计如下:

 

.

 

接线表设计:

模块名称(ADC按键)STM32的IO口功能设置
VCC/GNDVCC/GND-
ADC_KEYPA5ADC1-通道5
-PA9TX PA9
-PA10RX PA10

 

 

1.标准库实现:

先分别采集八个按键按下的ADC值,经过ADC滤波获取稳定的ADC值。

/****************************************
函数名称:u16 Read_ADC(void)
函数参数:无参
函数返回值:u16  表示ADC的返回值
函数功能:获取ADC的值,并返回
创建作者:王艇
创建时间:2021.5.26
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
u16 Read_ADC(void)
{
	u16 ADC_VALUE = 0;
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	ADC_VALUE = ADC_GetConversionValue(ADC1);
	ADC_ClearFlag(ADC1, ADC_FLAG_EOC);

	return ADC_VALUE;
}


/****************************************
函数名称:u16 Read_Btn(void)
函数参数:无参
函数返回值:返回按键按下的ADC值
函数功能:通过滤波获取ADC的稳定值
创建作者:王艇
创建时间:2021.5.26
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
u16 Read_Btn(void)
{
	u16 tmp;
	u8 i = 0,j = 0;
	
	for(i=0; i<BTN_BUFF_LEN; i++){
		btn_buff[i] = Read_ADC();
	}

	for(i=0; i<=BTN_BUFF_LEN/2; i++){
		for(j=0; j<	BTN_BUFF_LEN-i-1; j++){
			if(btn_buff[j+1] < btn_buff[j]){
				tmp = btn_buff[j+1];
				btn_buff[j+1] = btn_buff[j];
				btn_buff[j] = tmp;
			}
		}
	}

	if(BTN_BUFF_LEN % 2 == 0){
		return(btn_buff[BTN_BUFF_LEN/2-1] + btn_buff[BTN_BUFF_LEN/2])/2;
	}else{
		return(btn_buff[BTN_BUFF_LEN/2]);
	}
}

实现效果如下:

可以发现按键按下他们的ADC值是不一样的,可以依据ADC的值不同判断是哪个按键按下

效果如下:

 

2.HAL库实现

串口1重定义:

#ifdef _GNUC_
	#define PUTCHAR_PROTOTYPE int io_putchar(int ch)
#else
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE 
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0XFFFF);
	return ch;
}

 

/****************************************
函数名称:u16 Read_Btn(void)
函数参数:无参
函数返回值:返回按键按下的ADC值
函数功能:通过滤波获取ADC的稳定值
创建作者:王艇
创建时间:2021.5.26
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
uint16_t Read_Btn(void)
{
	uint16_t tmp;
	uint8_t i = 0,j = 0;
	
	for(i=0; i<BTN_BUFF_LEN; i++){
		btn_buff[i] = Read_ADC();
	}

	for(i=0; i<=BTN_BUFF_LEN/2; i++){
		for(j=0; j<	BTN_BUFF_LEN-i-1; j++){
			if(btn_buff[j+1] < btn_buff[j]){
				tmp = btn_buff[j+1];
				btn_buff[j+1] = btn_buff[j];
				btn_buff[j] = tmp;
			}
		}
	}

	if(BTN_BUFF_LEN % 2 == 0)
	{
		return(((btn_buff[BTN_BUFF_LEN/2-1] + btn_buff[BTN_BUFF_LEN/2])/2)+40);		//	40	为ADC补偿,可以依据实际情况删除
	}
	else
	{
		return(btn_buff[BTN_BUFF_LEN/2]+40);										//	40	为ADC补偿,可以依据实际情况删除
	}
}

有标准库和HAL库有点区别,我将采集到的ADC值进行了适当补偿。

if(BTN_BUFF_LEN % 2 == 0)
	{
		return(((btn_buff[BTN_BUFF_LEN/2-1] + btn_buff[BTN_BUFF_LEN/2])/2)+40);		//	40	为ADC补偿,可以依据实际情况删除
	}
	else
	{
		return(btn_buff[BTN_BUFF_LEN/2]+40);										//	40	为ADC补偿,可以依据实际情况删除
	}

后面加的40可以依据实际情况删除

实现效果:

实现效果完美,完全达到一个IO实现多个按键控制。

互相学习互相交流,感谢关注支持!!!

源码下载链接:(1条消息) STM32通过ADC实现多按键功能(标准库和HAL库实现)-电信文档类资源-CSDN下载

 

  • 22
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值