STM32F407通过按键控制LED和蜂鸣器

您所在的位置:网站首页 stm32按键控制灯闪烁与停止 STM32F407通过按键控制LED和蜂鸣器

STM32F407通过按键控制LED和蜂鸣器

2023-08-21 10:04| 来源: 网络整理| 查看: 265

STM32F4——GPIO基本知识

GPIO基本认识

STM32F4共7组I/O,每组I/O有16个I/O口。 每组IO的通过10个32位寄存器控制,分别控制I/O的配置、功能和数据等内容。 其中部分寄存器32位全部使用,每两位控制一个I/O口,部分寄存器16-31位保留,只有0-15位起作用,一位控制一个I/O口。

GPIO初始化

初始化步骤:

使能时钟,在头文件stm32f4xx_rcc.h中找到相应时钟初始化I/O,运用到stm32f4xx_gpio.h中GPIO_Init()函数I/O口置初值

GPIO控制方式

库函数方式 eg:

GPIO_SetBits() //对应IO输出1 GPIO_ResetBits() //对应IO输出0

位带操作方式 宏定义IO口,操作某个IO eg:

#define LED0 PAout(9) //输出 #define KEY0 PEin(4) //输入 MDK注意事项 开发环境配置头文件路径设置源文件包含到分组中 实验程序设计 整体设计

将LED,BEEP,KEY各部件的相关程序分别存放在不同目录的源文件下,实现不同部件文件的模块化管理。并在相应的头文件内加以声明,方便在主函数程序中调用。 模块结构图: 模块结构图

LED模块 硬件连接

LED引脚图一 LED引脚图二

软件设计

头文件led.h 作用:声明相关函数等内容 程序源码:

#include "sys.h" #include "stm32f4xx.h" #ifndef __LED_H #define __LED_H void LED_Init(void);//LED初始化函数声明 //LED0,LED1口宏定义 #define LED0 PFout(9) #define LED1 PFout(10) #endif

源文件led.c 作用:定义LED_Init()初始化函数 程序源码:

#include "led.h" #include "stm32f4xx.h" void LED_Init(void) //LED初始化函数定义 { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量,IO初始化函数中数据传入使用 //注意:定义结构体 应在 时钟使能 之前,否则编译出现警告! RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//时钟,使能 //F9 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//第九位 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉­ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化 //F10 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//第十位 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉­ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化 //设置LED初始不亮 LED0 = 1; LED1 = 1; } BEEP模块 硬件连接

BEEP引脚图一 BEEP引脚图二

软件设计

头文件beep.h 作用:声明相关函数等内容 程序源码:

#include "sys.h" #include "stm32f4xx.h" #ifndef __BEEP_H #define __BEEP_H void BEEP_Init(void);//声明 蜂鸣器初始化函数 #define BEEP PFout(8)//位操作蜂鸣器 #endif

源文件beep.c 作用:定义BEEP_Init()初始化函数 程序源码:

#include "beep.h" #include "stm32f4xx.h" void BEEP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量,IO初始化函数中数据传入使用 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//时钟,使能 //F8 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//第八位 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHZ GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化 GPIO_ResetBits(GPIOF,GPIO_Pin_8);//置低电平,蜂鸣器不响 } KEY模块 硬件连接

KEY_UP引脚图一 KEY_UP引脚图二

软件设计

头文件key.h 作用:声明相关函数等内容 程序源码:

#include "stm32f4xx.h" #ifndef __KEY_H #define __KEY_H void KEY_Init(void);//声明 按键初始化函数 u8 KEY_Scan ( void );//声明 按键扫描函数 //宏定义WK_UP口 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) #endif

源文件key.c 作用: 定义KEY_Init()初始化函数 程序源码:

#include "key.h" #include "delay.h" #include "stm32f4xx.h" void KEY_Init(void)//定义 按键初始化函数 { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量,IO初始化函数中数据传入使用 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//PA时钟,使能 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通输入模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//WK_UP GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);//WK_UP初始化 }

定义KEY_Scan()按键扫描函数

KEY_Scan按键扫描函数程序框图: KEY_Scan按键扫描函数框图 程序源码:

u8 KEY_Scan ( )//定义 按键扫描函数 { static u8 key_up=1;//静态变量key_up记录按键状态,上一次按键是否完成 //0——上次按键没有结束,1——上次按键已经结束 if(key_up&&(WK_UP==1))//上次按键已经结束,检测到按键按下 { delay_ms(10);//延时,消抖 key_up=0;//记录此次按键开始,按键尚未结束 return 1;//有效按键 } else if(key_up==0&&(WK_UP==0))//上次按键尚未结束,检测到按键松开 { key_up=1;//记录上次按键结束,可以开始下一次按键 } return 0;//上次按键已经结束,按键处于松开状态;或上次按键尚未结束,按键处于按下状态,都无效 } 主函数main() 各模块初始化

调用LED_Init()初始化函数,BEEP_Init()初始化函数,KEY_Init()初始化函数,delay_Init()初始化函数

检测按键,循环执行

KEY_Scan()按键扫描函数,并对按键结果进行判断,相关部件做出反应,循环执行

main()程序源码:

#include "stm32f4xx.h" #include "led.h" #include "beep.h" #include "key.h" #include "delay.h" int main(void) { u8 key;//保存按键扫描返回值 //初始化部分 LED_Init(); BEEP_Init(); KEY_Init(); delay_init(168); //循环部分 while(1) { key=KEY_Scan();//将扫描结果传给key if(key)//key不为零,即有按键按下 { LED0=!LED0; LED1=!LED1; BEEP=!BEEP; } delay_init(10); } } 测试结果

按键按下一次,LED灯亮,同时蜂鸣器发出响声,再次按下按键,LED灯灭,同时蜂鸣器停止发声。



【本文地址】


今日新闻


推荐新闻


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