stm32学习第五天,点灯合集(寄存器)


这里,基础的点灯已经学完了。所以我们要开始时回顾一下我们的点灯之旅。
板子是野火V2霸道。不同的板子可能端口有差别。

一、设置闪烁灯

这里就直接使用调库点的灯了
在这里插入图片描述
试着电亮这;三个灯。GPIOB是在总线APB2上。
思路:(1)打开时钟,使得GPIO使能。(2)找到对应的GPIO口,和对应的端口。(3)配置GPIO口
直接上代码;
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);

#endif	 /*_BSP_LED_H*/

bsp_led.c

#include "bsp_led.h"
/*延时函数*/
void Delay(uint32_t count)
{
		for(; count!= 0; count--);
}
	
void LED_CONFIG(void)
{
		/*定义一个 GPIO_InitTypeDef 类型的结构体*/
		GPIO_InitTypeDef LED_CONFIG;
		/*打开APB2上 GPIOB的时钟*/
		RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
		/*配置GPIO口的输出*/
		LED_CONFIG.GPIO_Mode  = GPIO_Mode_Out_PP;
		LED_CONFIG.GPIO_Pin   =	LED_GPIO_PIN;
		LED_CONFIG.GPIO_Speed = GPIO_Speed_50MHz;
		
		GPIO_Init(LED_GPIO_PORT, &LED_CONFIG);

	while(1)
	{
			/*配置低电平输入   亮灯*/
			GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			/*配置高电平输入    灭灯*/
			GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
	}	
}


#include 	"bsp_led.h"

int main()
{
		LED_CONFIG();
}


为什么要用宏定义呢,主要是修改起来方便。
比如我想要不同颜色的灯亮,就只该bsp_led.h中的LED-GPIO_PIN 对应的端口就好了,GPIO_Pin_1对应蓝色,GPIO_Pin_0对应绿色,GPIO_Pin_5对应红色。
我这边上传动图失败了,不是动图,所以我就不传图了。

二、设置跑马灯

跑马灯的原理就是几种颜色(端口)的灯随着时间的改变而改变。
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
/*绿色*/
#define LED2_GPIO_PORT 		GPIOB
#define LED2_GPIO_CLK 		RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN			GPIO_Pin_0
/*红色*/
#define LED3_GPIO_PORT 		GPIOB
#define LED3_GPIO_CLK 		RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN			GPIO_Pin_5

void LED_CONFIG(void);

#endif	 /*_BSP_LED_H*/

bsp_led.c

#include "bsp_led.h"
/*延时函数*/
void Delay(uint32_t count)
{
		for(; count!= 0; count--);
}
	
void LED_CONFIG(void)
{
		/*配置蓝灯*/
		GPIO_InitTypeDef LED_CONFIG;
		RCC_APB2PeriphClockCmd(LED1_GPIO_CLK, ENABLE);
		LED_CONFIG.GPIO_Mode  = GPIO_Mode_Out_PP;
		LED_CONFIG.GPIO_Pin   =	LED1_GPIO_PIN;
		LED_CONFIG.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(LED1_GPIO_PORT, &LED_CONFIG);
		/*配置绿灯*/
		RCC_APB2PeriphClockCmd(LED2_GPIO_CLK, ENABLE);
		LED_CONFIG.GPIO_Mode  = GPIO_Mode_Out_PP;
		LED_CONFIG.GPIO_Pin   =	LED2_GPIO_PIN;
		LED_CONFIG.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(LED2_GPIO_PORT, &LED_CONFIG);
		/*配置红灯*/
		RCC_APB2PeriphClockCmd(LED3_GPIO_CLK, ENABLE);
		LED_CONFIG.GPIO_Mode  = GPIO_Mode_Out_PP;
		LED_CONFIG.GPIO_Pin   =	LED3_GPIO_PIN;
		LED_CONFIG.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(LED3_GPIO_PORT, &LED_CONFIG);

	while(1)
	{
			/*配置低电平输入   蓝亮灯*/
			GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			/*配置高电平输入    绿亮灯*/
			GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			/*配置高电平输入    红亮灯*/
			GPIO_ResetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			/*配置高电平输入    红亮灯*/
			GPIO_ResetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待
			GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
			Delay (0xFFFFF);		//延时等待

	}	
}

main.c


#include 	"bsp_led.h"

int main()
{
		LED_CONFIG();
}


三、按键控制灯

bsp_led.h

#ifndef 	_BSP_LED_H
#define 	_BSP_LED_H
#include  "stm32f10x.h"
void LED_CONFIG(void);
//红色
#define LED1_GPIO_PORT 	GPIOB
#define LED1_GPIO_CLK	 	RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN 	GPIO_Pin_5
//绿色
#define LED2_GPIO_PORT 	GPIOB
#define LED2_GPIO_CLK 	RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN 	GPIO_Pin_0
//蓝色
#define LED3_GPIO_PORT	GPIOB
#define LED3_GPIO_CLK 	RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN 	GPIO_Pin_1

#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#endif	 /*_BSP_LED_H*/

bsp_led.c

#include "bsp_led.h"
void LED_CONFIG(void)
{
GPIO_InitTypeDef LED_CONFIG;
/*开启 LED 相关的 GPIO 外设时钟*/
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK, ENABLE);
LED_CONFIG.GPIO_Pin 	= LED1_GPIO_PIN | LED2_GPIO_PIN | LED3_GPIO_PIN;
LED_CONFIG.GPIO_Mode 	= GPIO_Mode_Out_PP;
LED_CONFIG.GPIO_Speed 	= GPIO_Speed_50MHz;

GPIO_Init(LED1_GPIO_PORT, &LED_CONFIG);
GPIO_Init(LED2_GPIO_PORT, &LED_CONFIG);
GPIO_Init(LED3_GPIO_PORT, &LED_CONFIG);
}

key_led.h

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

#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

void KEY_CONFIG(void);

uint8_t KEY_SCANF(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

#endif	 /*_KEY_LED_H*/

key_led.c


#include "key_led.h"

void KEY_CONFIG(void)
{
	GPIO_InitTypeDef KEY_GPIO;

/*开启按键端口的时钟*/
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
	 
	KEY_GPIO.GPIO_Pin 	= KEY1_GPIO_PIN|KEY2_GPIO_PIN;
	KEY_GPIO.GPIO_Mode 	= GPIO_Mode_IN_FLOATING;

	GPIO_Init(KEY1_GPIO_PORT, &KEY_GPIO);
	GPIO_Init(KEY2_GPIO_PORT, &KEY_GPIO);
}

uint8_t KEY_SCANF(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;
		}
	
}

 

main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "key_led.h"

int main(void)
{
	LED_CONFIG();
	KEY_CONFIG();
	while (1) 
	{ 
		if ( KEY_SCANF(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ) 
		{
			LED1_TOGGLE;
		}
		if ( KEY_SCANF(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON ) 
		{
			LED2_TOGGLE;
		}
	}
}
 

这样,我们通过不同的颜色,就可以组成几种颜色的灯,所以通过按键不仅可以展示出原有的三种颜色还可以调出白色、黄色、紫色、青色灯。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

永不秃头的程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值