STM32实验 使用库函数的方法用按键控制一个LED灯的取反

**

要求:当按键按下的时候,对LED的状态进行取反

装备:电脑,MDK5,STM32F103ZET6开发板,USB线

**
**

首先自己配置一个工程模板,如下所示**

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二步:电路图

在这里插入图片描述

第三步:写代码

主函数:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"

 int main(void)
 {	

	delay_init(); //延时函数初始化
	Led_Init(); //LED初始化
	key_init(); //按键初始化
  
	while(1)
	{
		key1();	
	}//判断按键是否按下,按键按下所执行的程序
 }


按键函数:

#include "key.h"
#include "delay.h"
#include "led.h"

void key_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO的结构体变量
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//开启GPIOE使能

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;//使用GPIOE.2引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置GPIOE的工作模式为带上拉输入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE寄存器
}//按键初始化函数

void key1(void)
{
	 if(KEY1==0)//判断按键是否按下,如果按下则满足KEY1==0,否则继续判断按键是否按下
	 {
		 delay_ms(500);//按键消抖程序和防止按键是误触的
	 	 if(KEY1==0)//再次判断按键是否按下
		 {	
			LED1=!LED1;//如果按下则执行按键取反(利用逻辑取反)
		 } 		
	 }
	
}//按键按下所执行程序


LED初始化:

#include "led.h"
#include "stm32f10x.h"

void Led_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO的结构体变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//打开GPIOC的时钟
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置GPIOC的端口,使用GPIOC.1
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置工作速度为50MHz
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//普通推挽输出模式
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC寄存器
	
}//LED初始化函数


按键头文件:

#ifndef _key_
#define _key_

#include "sys.h"

#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//宏定义GPIOE.2

void key_init(void);
void key1(void);

#endif


LED头文件:

#ifndef _led_
#define _led_
#include "sys.h"

void Led_Init(void);

#define LED1 PCout(1)// LED1等价GPIOC.0

#endif

发现缺少一个延时函数,自己写喽。可以使定时器写,也可以是简单的一个计数器。这里就不多介绍。

第四步:结果
按键的时间得按久一些否则会有问题,主要还是消抖的问题。长按500ms就会出现取反,如果太快就会发现一些很神奇的现象,感觉会自闭的。

最后小小的总结一下:
利用库函数写一个简单的程序也许体会不到他的便捷性,但是慢慢地你就会发现他真的好用。不要放弃学习。emmmmm…大概就这样了。

嵌入式STM32F411RE是一款基于ARM Cortex-M4处理器的微控制器,常常用于各种工业控制和物联网应用。要使用库函数检测按键控制LED闪烁,你需要遵循以下步骤: 1. **配置硬件连接**: - 连接GPIO引脚:将LED按键分别连接到STM32的GPIO端口,通常是PA8(LED)和PD0、PD1、PD2等作为通用IO口。 2. **初始化外设**: - 使用HAL库(Hardware Abstraction Layer),初始化GPIO,设置相应的GPIO模式(输入或推挽输出)和速度。 3. **按键扫描**: - 创建一个循环,定期读取GPIO引脚的状态。如果检测到按键按下(通常是低电平),则认为按键被触发。 4. **响应按键事件**: - 当检测到按键按下后,通过HAL库更改GPIO模式为输出,并驱动LED亮起;松开按键时,切换回输入模式,LED熄灭。 5. **LED闪烁**: - 设定一个定时器,让LED按一定频率闪烁。当按键按下时暂停闪烁,按键释放后恢复闪烁。 以下是一个简化的示例代码片段,注意实际编程时需要包含适当的头文件并处理异常情况: ```c #include "stm32f4xx_hal.h" // LED按键GPIO定义 GPIO_TypeDef* GPIO-led = GPIOA; GPIO_TypeDef* GPIO-key = GPIOB; void led_on(void) { HAL_GPIO_WritePin(GPIO-led, LED_PIN, GPIO_PIN_SET); } void led_off(void) { HAL_GPIO_WritePin(GPIO-led, LED_PIN, GPIO_PIN_RESET); } void key_scan(uint16_t key_pin) { if (HAL_GPIO_ReadPin(GPIO-key, key_pin) == GPIO_PIN_RESET) { led_on(); // 暂停闪烁,在这里添加代码 while (key_pressed()) { __NOP(); // 模拟等待按键释放 } led_off(); // 恢复闪烁 } } int main() { // ...其他初始化... // 添加按键中断服务例程 __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_NVIC_SetPriority(KEY_IRQn, 0, 0); // 设置按键中断优先级 HAL_NVIC_EnableIRQ(KEY_IRQn); // ...主循环... return 0; } // 示例:按键中断服务函数 void KEY_IRQHandler() { key_scan(PD0); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值