这里,基础的点灯已经学完了。所以我们要开始时回顾一下我们的点灯之旅。
板子是野火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;
}
}
}
这样,我们通过不同的颜色,就可以组成几种颜色的灯,所以通过按键不仅可以展示出原有的三种颜色还可以调出白色、黄色、紫色、青色灯。