最近准备蓝桥杯嵌入式国赛,熟悉一下拓展板各个模块,先准备的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