欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stm32按键实验讲解

程序员文章站 2022-06-09 08:43:27
...

GPIO引脚图及相关配置

stm32按键实验讲解

图1
由原理图,可以看出各按键的GPIO接口如下表。 | WK_UP | KEY0 | KEY1 | |:-----------:|:-----------:|:-----------:| | PA0| PC5 | PA15 |

而GPIO电平的读取代码为;GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
使用如下代码,将按键名与读取电平函数绑定。由于,当按键按下时,与之相连的GPIO电平会发生变化,因此,使用该函数可以检测按键是否按下。

#define KEY0  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)

按键初始化函数

stm32按键实验讲解

图2

stm32按键实验讲解

图3

由图1,我们看到KEY0和KEY1按键外接地,再看图2,由于设置上拉输入,及上拉电阻以上的开关打开:在按键未按下时,使得输入电压为高电平;当按键按下时,有电流流过上拉电阻,由于I/O口外接地,因此,输入低电平。而且,由于硬件设计,只能这样设置,不可改变设置。
那么同理,如图1,WK_UP按键外接3.3V的稳压电源,因此只能设置为下拉输入,内置下拉电路如图3。

void KEY_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC端口时钟

	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //同样设置上拉输入(由于,结构体中的值已经在初始化GPIOA15时,定义过了,因此,此处可以省略)
 	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
 
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置输入模式为下拉输入  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
	
} 

按键扫描函数

在key.h的头文件中,使用如下代码,将KEY0_PRES等与数字绑定。以简单区分按下了哪一个按键。

#define KEY0_PRES	1		//KEY0  
#define KEY1_PRES	2		//KEY1 
#define WKUP_PRES	3		//WK_UP  
// 不支持连按的模式下,一直按住按键,只有一次响应
// 支持连按的模式下,一直按着按键将一直响应按键
u8 KEY_Scan(u8 mode)//mode为是否支持连按的标志
{	 
	static u8 key_up=1;
	if(mode)key_up=1;  //按键未按下的标志	  
	if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
	{
		delay_ms(10);//延时10毫秒以防按键抖动而按下按键
		key_up=0;
		if(KEY0==0)return KEY0_PRES;//确认按下的按键为KEY0
		else if(KEY1==0)return KEY1_PRES;//确认按下的按键为KEY1
		else if(WK_UP==1)return WKUP_PRES;//确认按下的按键为WKUP_PRES
	}
	else if(KEY0==1&&KEY1==1&&WK_UP==0)//若检测按键一直按着,则不置位特征位。
		key_up=1; 	     
	return 0;// 无按键按下
}

按下按键给出对应响应

t=KEY_Scan(0);		//得到按键扫描所按下的按键
		switch(t)
		{				 
			case KEY0_PRES:
				LED0=!LED0;
				break;
			case KEY1_PRES:
				LED1=!LED1;
				break;
			case WKUP_PRES:				
				LED0=!LED0;
				LED1=!LED1;
				break;
			default:
				delay_ms(10);	
		} 

本文基于stm32原子哥资料编写,用于自己学习记录。