首先利用跳线帽将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);
}
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐