stm32按键实验讲解

GPIO引脚图及相关配置

在这里插入图片描述

图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)

按键初始化函数

在这里插入图片描述

图2

在这里插入图片描述

图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原子哥资料编写,用于自己学习记录。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值