ADC按键
1.模块引脚
使用PA5接上AKEY
2.Cubemx实现的配置
3.生成工程
1.ADC采集函数
采集50次
#define BTN_BUFF_LEN 50
uint16_t btn_buff[BTN_BUFF_LEN];
uint16_t Read_ADC()
{
uint16_t aa;
HAL_ADC_Start(&hadc2);
aa = HAL_ADC_GetValue(&hadc2);
HAL_ADC_Stop(&hadc2);
return aa;
}
2.ADC采集值处理
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;
}else{
return(btn_buff[BTN_BUFF_LEN/2]);
}
}
3.按键识别
uint8_t Scan_Btn(void)
{
uint16_t btn_tmp = 0;
btn_tmp = Read_Btn();
if(btn_tmp < 0x0FFF/14){
return 1;
}else if((btn_tmp > 0x0FFF/14) && (btn_tmp < 0x0FFF/14*3)){
return 2;
}else if((btn_tmp > 0x0FFF/14*3) && (btn_tmp < 0x0FFF/14*5)){
return 3;
}else if((btn_tmp > 0x0FFF/14*5) && (btn_tmp < 0x0FFF/14*7)){
return 4;
}else if((btn_tmp > 0x0FFF/14*7) && (btn_tmp < 0x0FFF/14*9)){
return 5;
}else if((btn_tmp > 0x0FFF/14*9) && (btn_tmp < 0x0FFF/14*11)){
return 6;
}else if((btn_tmp > 0x0FFF/14*11) && (btn_tmp < 0x0FFF/14*13)){
return 7;
}else if((btn_tmp > 0x0FFF/14*13) && (btn_tmp < 0x0FDF)){
return 8;
}
else{
return 0; //error status & no key
}
}
4.按键控制
adc = Scan_Btn();
sprintf((char *)ass,"The key is press:%d",adc);
LCD_DisplayStringLine(Line5,ass);
HAL_Delay(200);