STM32独立按键工作原理及设计

您所在的位置:网站首页 按键模块设计流程视频 STM32独立按键工作原理及设计

STM32独立按键工作原理及设计

2024-06-12 23:44| 来源: 网络整理| 查看: 265

目录 前言工作原理代码部分初始化函数按键检测函数头文件主函数

前言

STM32的独立按键的实现,需要懂得独立按键的工作原理,并且还要在STM32单片机的软硬件中进行搭建和设计。

工作原理 STM32单片机GPIO引脚自带上拉、下拉输入,因此硬件电路部分不需要加额外的电阻实现上拉下拉。主要有以下两种方式实现独立按键设计: (一)高电平检测独立按键: 只需要从VCC引线(杜邦线或锡焊)经过一个按键开关(按下导通即可,原理略)到单片机I/O口,并将该I/O口软件初始化配置为下拉输入或浮空输入。当按键开关按下时开关导通,单片机I/O口检测到高电平输入即完成按键检测,可自行在检测函数中设计按下按键后需要实现的功能。 (二)低电平检测独立按键: 同理从GND引线(杜邦线或锡焊)经过一个按键开关(按下导通即可,原理略)到单片机I/O口,并将该I/O口软件初始化配置为上拉输入或浮空输入。当按键开关按下时开关导通,单片机I/O口检测到低电平输入即完成按键检测,可自行在检测函数中设计按下按键后需要实现的功能。注意: 实现方式不同的独立按键,按键检测函数也不相同,需要修改到对应的检测方式功能才能正常使用,比如低电平和高电平的检测独立按键,它们的按键检测判断条件是相反的。接入的高电平使用对应STM32单片机GPIO引脚所能承受的最大电压(大多数IO能承受5V,推荐使用3.3V),否则将损坏芯片。 代码部分

下面用两个独立按键点亮两个LED灯,以高电平检测独立按键为例,代码如下。

初始化函数

初始化函数代码如下。

void Key_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /*开启按键端口的时钟*/ RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE); //选择独立按键的IO引脚 GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; // 设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键 GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure); //选择独立按键的IO引脚 GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键 GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); } //以上传参均在头文件进行宏定义,具体参数自行修改 } 按键检测函数

按键检测函数代码如下。

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; 头文件

头文件代码如下。

#ifndef __KEY_H #define __KEY_H #include "stm32f10x.h" // 两个独立按键IO引脚定义 #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA #define KEY1_GPIO_PORT GPIOA #define KEY1_GPIO_PIN GPIO_Pin_0 #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC #define KEY2_GPIO_PORT GPIOC #define KEY2_GPIO_PIN GPIO_Pin_13 /** 按键按下标置宏 * 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0 * 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可 */ #define KEY_ON 1 #define KEY_OFF 0 void Key_GPIO_Config(void); uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); #endif /* __KEY_H */ 主函数

主函数代码如下。

#include "stm32f10x.h" #include "bsp_led.h" #include "bsp_key.h" /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { /* LED端口初始化 */ LED_GPIO_Config(); LED1_ON; /* 按键端口初始化 */ Key_GPIO_Config(); /* 轮询按键状态,若按键按下则反转LED */ while(1) { /* 检测独立按键1是否被按下,若按下则让LED1反转 */ if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ) { /*LED1反转*/ LED1_TOGGLE; } /* 检测独立按键2是否被按下,若按下则让LED2反转 */ if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON ) { /*LED2反转*/ LED2_TOGGLE; } } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3