stm32学习第四天

本文介绍了如何通过STM32单片机实现按键控制LED灯的亮灭,详细讲解了代码实现过程,包括GPIO配置、按键扫描函数的关键点,并分析了按键控制灯的电路原理。在遇到问题后,作者调整了代码,解决了需要复位才能点亮LED的问题,探讨了不依赖特定宏定义控制灯亮灭的方法。
摘要由CSDN通过智能技术生成

一、总结

主要记录通过按键来控制灯的亮灭。
这里先说一下,上节课是自己刷了一遍野火的课,做出来了,如果你程序下载到板上需要按一下复位才可以,那么你可以设置一下
在这里插入图片描述这里我还是按照自己的理解来写的,但没有写出来,所以我这里抄写野火的代码了,野火代码就是宏定义太多了对于我这种不是按部就班的看视频的来说,续航太难,但是我自己的按键最后没有亮。然后自己弄了一个多小时也没有弄出来,所以为我们先弄下一节。
好了时隔一天,我又回来写这章了

二、按键控制代码

首先我们可以电亮LED灯但是不能通过按键熄灭,所以我们的之前点灯的代码是没问题的。我这里仿照野火改了一下,以后也会按照野火的格式来,因为真的好看、方便。
bsp_led.h

#ifndef _BSP_LED_H
#define	_BSP_LED_H

#include "stm32f10x.h"

#define LED1_GPIO_PORT 	GPIOB
#define LED1_GPIO_CLK 	RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN 	GPIO_Pin_1

void LED_CONFIG(void);

#endif  /*_BSP_LED_H*/

bsp_led.c

#include "bsp_led.h"

void LED_CONFIG(void)
{
		GPIO_InitTypeDef LED_GPIO;
		/*打开时钟*/
		//原型 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
		RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);
		/*配置GPIO*/
		//原型 GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
		LED_GPIO.GPIO_Pin   = LED1_GPIO_PIN;
		LED_GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;
		LED_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(LED1_GPIO_PORT, &LED_GPIO);
		//输出低电平
		GPIO_ResetBits(GPIOB,LED1_GPIO_PIN);	
}


然后经过一段时间查找,终于发现了问题
在这里插入图片描述
emm,我真是一个小可爱。

按键点灯代码
ksy_led.h

#include "stm32f10x.h"
#define KEY_ON  				1
#define KEY_OFF 				0

#define KEY_GPIO_CLK  	RCC_APB2Periph_GPIOA
#define KEY_GPIO_PORT 	GPIOA
#define KEY_GPIO_PIN  	GPIO_Pin_0


void KEY_CONFIG(void);


uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//#define LED_G_TOGGLE  {GPIOB->ODR ^= GPIO_Pin_0;}

记得改输入模式,因为是输入可以不要速度。

#include "key_led.h"
void KEY_CONFIG()
{
	GPIO_InitTypeDef KEY_GPIO;
	/*打开时钟*/
	//原型 RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
	RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
	/*配置GPIO*/
	//原型 GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
	KEY_GPIO.GPIO_Pin   = KEY_GPIO_PIN;
	//这里记得改为浮空输入,因为现在按键控制的是输入
	KEY_GPIO.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
	
	GPIO_Init(KEY_GPIO_PORT,&KEY_GPIO);	
}
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;
}


按键点灯的精髓我主要觉得实在这个KSY_SCAN这里,该有就是修改bsp.ld.h中的返回值。

uint8_t KEY_SCAN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	/*检测是否有按键按下 */
	if(GPIO_ReadInputDataBit(GPIOx ,GPIO_Pin) == KEY_ON)
	{
		/*按键是高电平按压则返回1 否者返回0 */
		while(GPIO_ReadInputDataBit(GPIOx ,GPIO_Pin) == KEY_ON);
		return KEY_ON ;
	}
	else
		return KEY_OFF;
}

main.c

#include "stm32f10x.h"    //默认是在当前文件夹
#include "bsp_led.h"
#include "key_led.h"

int main(void)
{

	LED_CONFIG();
	KEY_CONFIG();
	while(1)
	{
		if(KEY_SCAN(KEY_GPIO_PORT, KEY_GPIO_PIN) == KEY_ON)
		{
			LED_G_TOGGLE;//之间bsp.led打开的灯的电平
		}
	}
}

修改bsp_led.h

#ifndef _BSP_LED_H
#define	_BSP_LED_H

#include "stm32f10x.h"

#define LED_GPIO_PORT 	GPIOB
#define LED_GPIO_CLK 	RCC_APB2Periph_GPIOB
#define LED_GPIO_PIN 	GPIO_Pin_1

void LED_CONFIG(void);

#define LED_G_TOGGLE  {LED_GPIO_PORT->ODR ^= LED_GPIO_PIN;}

#endif  /*_BSP_LED_H*/

其中main.c我改过,想着把返回值不要(LED_G_TOGGLE),改为将GPIOB的电平拉高( GPIO_SetBits(GPIOB,LED_GPIO_PIN); ),这样灯就灭了,但是试了下,可以控制板子灯灭,但是不能亮,需要按下复位才行。不然亮不起来。、

三、按键控制灯的原理

在这里插入图片描述
按键点灯的原理如图,当按键没有按下的时候,我们的寄存器接地,处于低电平,所以我们的灯亮,如果按键按下,我们的寄存器就和3.3V的电源接通,处于高电平,所以按键不亮。
就是通过按键来控制GPIO输入的高低电平。

在这里插入图片描述

原理图如上,这里我也不是很懂,毕竟没学过。大概就是这个意思。
最后,编程需要视力!编程需要视力!编程需要视力!

问问有没有大佬知道不使用那个LED_G_TOGGLE返回值来控制灯亮灭的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值