蓝桥杯嵌入式-扩展板-ADC扫描键盘
首先利用跳线帽将PA5和ADC_KEY相连Akey.h#ifndef AKEY_H#define AKEY_H***加粗样式***#include "stm32f10x.h"#define length 50void Akey_Init(void);u16 Get_Adc(void);//获取ADC值u16 Mp_Adc(void);//冒泡法u8 Scan_Akey(void);//扫描按键#e
·
首先利用跳线帽将PA5和ADC_KEY相连
Akey.h
#ifndef AKEY_H
#define AKEY_H
***加粗样式***
#include "stm32f10x.h"
#define length 50
void Akey_Init(void);
u16 Get_Adc(void); //获取ADC值
u16 Mp_Adc(void); //冒泡法
u8 Scan_Akey(void); //扫描按键
#endif
Akey.c
#include "Akey.h"
u16 Akey_Value[length];
void Akey_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_Adc(void) //获取ADC值
{
u16 temp;
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
temp=ADC_GetConversionValue(ADC1);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==1);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
return temp;
}
u16 Mp_Adc(void) //冒泡法
{
u16 temp;
u8 i,j;
for(i=0;i<length;i++)
{
Akey_Value[i]=Get_Adc();
}
for(i=0;i<length-1;i++)
{
for(j=0;j<length-i-1;j++)
{
if(Akey_Value[j+1]<Akey_Value[j])
{
temp=Akey_Value[j+1];
Akey_Value[j+1]=Akey_Value[j];
Akey_Value[j]=temp;
}
}
}
if(length%2==0)
{
return (Akey_Value[length/2-1]+Akey_Value[length/2])/2;
}
else
{
return Akey_Value[length/2];
}
}
u8 Scan_Akey(void)
{
u8 temp;
temp=Mp_Adc();
if(temp<=200) //需要打印出Mp_Adc()的十进制,判断是哪个按键按下
{
return 1;
}
else if((temp>=200)&&(temp<=600))
{
return 2;
}
else if((temp>=600)&&(temp<=1300))
{
return 3;
}
else if((temp>=1300)&&(temp<=1900))
{
return 4;
}
else if((temp>=1900)&&(temp<=2400))
{
return 5;
}
else if((temp>=2400)&&(temp<=2800))
{
return 6;
}
else if((temp>=2800)&&(temp<=3300))
{
return 7;
}
else if((temp>=3300)&&(temp<=3600))
{
return 8;
}
}
main.c
#include "Akey.h"
u16 LedMode=0xffff;
void KeyAction(void);
int main()
{
Akey_Init();
wheil(1)
{
// sprintf((char*)str,"Button Adc:%d ",Mp_Adc());
// LCD_DisplayStringLine(Line6,str); //检验哪个按键按下
if(flag50ms)
{
flag50ms=0;
KeyAction();
}
}
}
void KeyAction(void)
{
static u8 count1=0,count2=0;
if(Scan_Akey()==1) //短按
{
count1++;
if(count1==1)
{
LedMode^=1<<8;
}
}
else
{
count1=0;
}
if(Scan_Akey()==2) //长按
{
count2++;
if(count2==40)
{
LedMode^=1<<9;
count2=30;
}
}
else
{
count2=0;
}
GPIOD->ODR|=1<<2;
GPIOC->ODR=LedMode;
GPIOD->ODR&=~(1<<2);
}
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)