蓝桥杯嵌入式拓展板ADC_KEY单击

最近准备蓝桥杯嵌入式国赛,熟悉一下拓展板各个模块,先准备的ADC_KEY,然后写了这个单击功能。

一、原理图(问国信长天淘宝客服要的)

由原理图可知,按下不同按键时,ADC会读取到不同的值,由此可以判别不同的按键。

 二、CubeMX配置

 

生成之后开始代码编写。

三、代码

/***************************************ADC_KEY******************************/
uint32_t ADC_Value = 0;//存储ADC值
uint8_t adc_flag = 0;//读取完成标志位
struct Keys
{
	uint8_t jieduan;
	uint8_t Single;
}key = {0,0};
uint32_t Key_Num = 10;//用于显示
/**********************初始化函数************************/
HAL_ADCEx_Calibration_Start(&hadc2 ,ADC_SINGLE_ENDED);//自校准
HAL_TIM_Base_Start (&htim3 );//开启定时器,用于触发ADC采集
HAL_ADC_Start_DMA (&hadc2 ,&ADC_Value,1);//ADC+DMA
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)//中断回调函数
{
	if(hadc == &hadc2 )
	{
		adc_flag = 1;//读取完成
	}
}
/*不同的ADC_Value值代表不同按键,这个可以自己写的时候调整
1:0~450
2:500~1000
3:1100~1600
4:1700~2200
5:2300~2700
6:2800~3400
7:3450~3800
8:3900~4000
*/
void ADC_Key(void)/*************************ADC_KEY****************/
{
	if(adc_flag)
	{
		adc_flag = 0;
		switch(key.jieduan )
		{
			case 0:
			{
				if(ADC_Value <= 4000)//判断是否按下
					key.jieduan = 1;
			}
			break ;
			case 1:
			{
				if(ADC_Value <= 4000)//消抖
				{
					key.jieduan = 2;
					if(ADC_Value > 3900 && ADC_Value <= 4000)//8:3900~4000
						key.Single = 8;
					else if(ADC_Value > 3450 && ADC_Value <= 3800)//7:3450~3800
						key.Single = 7;
					else if(ADC_Value > 2800 && ADC_Value <= 3400)//6:2800~3400
						key.Single = 6;
					else if(ADC_Value > 2300 && ADC_Value <= 2700)//5:2300~2700
						key.Single = 5;
					else if(ADC_Value > 1700 && ADC_Value <= 2200)//4:1700~2200
						key.Single = 4;
					else if(ADC_Value > 1100 && ADC_Value <= 1600)//3:1100~1600
						key.Single = 3;
					else if(ADC_Value > 500 && ADC_Value <= 1000)//2:500~1000
						key.Single = 2;
					else
						key.Single = 1;
				}
				else
					key.jieduan = 0;
			}
			break ;
			case 2:
			{
				if(ADC_Value > 4000)
					key.jieduan = 0;
			}
			break ;
		}
	}
}
void Key_Function(void )/**************************************KEY*********************/
{
	ADC_Key();
	if(key.Single == 1)//按下S1,Key_Num ++;
	{
		Key_Num ++;
		key.Single = 0;
	}
	else if(key.Single == 2)//按下S2,Key_Num --;
	{
		Key_Num --;
		key.Single = 0;
	}
}
void LCD_Display(void )/***********************************LCD*************************/
{
	Key_Function();
	
	sprintf (LCD_BUF ,"ADC_KEY:%d    ",Key_Num);
	LCD_DisplayStringLine (Line1 ,(uint8_t *)LCD_BUF);
}

四、视频效果

S1

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EE蒋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值