硬件原理图:
简单介绍:
该按键通过ADC获取模拟量然后通过电阻分压来达到每个按键值的数值不同,通过电路分析没有按键按下时为高电平。
cubemx配置:
到keil工程:
注:本人经过测试与网上其他代码的数值具有一定偏差,也可能是我的板子不是新的,老化所导致,每个按键的数值函数比较容易测出来的,几分钟就可以,影响不大
#include "akey.h"
extern uint16_t adc[1];
uint8_t ADCKey_Get()
{
unsigned char adc_key=0;
if(adc[0] < 10)
adc_key = 1;
else if(adc[0] >180&& adc[0]<210)
adc_key = 2;
else if(adc[0] >570&& adc[0]<600 )
adc_key = 3;
else if(adc[0] >900&& adc[0]<1100)
adc_key = 4 ;
else if(adc[0] >1300&& adc[0]<1400)
adc_key = 5;
else if(adc[0] >1700&& adc[0]<1900)
adc_key = 6;
else if(adc[0] >2000&& adc[0]<2500)
adc_key = 7;
else if(adc[0] >2600&&adc[0] <3000)
adc_key = 8;
else
return 0;
return adc_key;
}
#ifndef __AKEY_H
#define __AKEY_H
#include "main.h"
uint8_t ADCKey_Get();
#endif
主函数:
uint16_t adc[1];//存储模拟量的值
char display[20];//用于LCD显示
uint8_t akey=0;//存储按键值
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);//ADC校准
HAL_ADC_Start_DMA(&hadc2,(uint32_t *)adc,1);//打开DMA
while(1)
{
akey=ADCKey_Get();
sprintf(display,"key_adc:%4d",adc[0]);
LCD_DisplayStringLine(Line2,(u8*)display);
sprintf(display,"keyvalue:%d",akey);
LCD_DisplayStringLine(Line4,(u8*)display);
}
实物展示:
当按下按键时会显示模拟电压值,方便调试