一、原理图

需要盖帽PA5—AKEY上,此时,按扩展板上的8个按钮,会输出相应的ADC值,ADC同样是12位。
二、CubeMX配置

选用即可。
三、代码
标准化,开启adc(第一个在adc的ex.h里面,第二个在adc.h里面)
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
HAL_ADC_Start(&hadc2);
在主循环不断取值
HAL_ADC_Start(&hadc2);
adc_value=HAL_ADC_GetValue(&hadc2);
HAL_Delay(20);//延迟时间长,值稳定
开始可以显示取值,按下不同按键,记录各个按键的adc值,再划分范围。
ADC按键扫描。
unsigned char adc_buttin()
{
unsigned char key_result1=0;
if( adc_value<100 ) key_result1=1;
else if( adc_value<800 ) key_result1=2;
else if( adc_value<1500 ) key_result1=3;
else if( adc_value<2000 ) key_result1=4;
else if( adc_value<2500 ) key_result1=5;
else if( adc_value<3000 ) key_result1=6;
else if( adc_value<3700 ) key_result1=7;
else if( adc_value<3990 ) key_result1=8;
return key_result1;
}
与按键一致,放入定时器
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if( htim->Instance==TIM4 )
{
static unsigned char key_old=0;
unsigned char key_new,key_up,key_down;
key_new=key_scan();
key_down=key_new&(key_new^key_old);
key_up=~key_new&(key_new^key_old);
key_old=key_new;
if( key_up )
{
key=key_up;
}
static unsigned char adc_old=0;
unsigned char adc_new,adc_up,adc_down;
adc_new=adc_buttin();
adc_down=adc_new&(adc_new^adc_old);
adc_up=~adc_new&(adc_new^adc_old);
adc_old=adc_new;
if( adc_up )
{
adc_key=adc_up;
}
}
}
然后主循环按键使用
switch(adc_key)
{
case 1:
{
num++;
adc_key=0;
}
break;
case 2:
{
num--;
adc_key=0;
}
break;
case 3:
{
num=300;
adc_key=0;
}
break;
case 4:
{
num=400;
adc_key=0;
}
break;
case 5:
{
num=500;
adc_key=0;
}
break;
case 6:
{
num=600;
adc_key=0;
}
break;
case 7:
{
num=700;
adc_key=0;
}
break;
case 8:
{
num=800;
adc_key=0;
}
break;
}
2521

被折叠的 条评论
为什么被折叠?



