LED流水灯
led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
void Led_Init(void);
void Led1_Init(void);
void Led2_Init(void);
void Led3_Init(void);
void Led4_Init(void);
#endif
typedef struct
{
uint32_t GPIO_Pin; /* 指定要配置的GPIO引脚 */
GPIOMode_TypeDef GPIO_Mode; /* 指定选定接点的操作模式。*/
GPIOSpeed_TypeDef GPIO_Speed; /* 指定选定接点的速度。*/
GPIOOType_TypeDef GPIO_OType; /* 指定选定接点的操作输出类型。*/
GPIOPuPd_TypeDef GPIO_PuPd; /* 指定选定接点的操作上拉/下拉。*/
}GPIO_InitTypeDef;
led.c
#include "led.h"
// init 4 pin
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOE组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
//使能GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
// GPIOF pin9 pin10
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //引脚9/10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOF, &GPIO_InitStruct);
// GPIOE pin9 pin10
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; //引脚13/14
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOE, &GPIO_InitStruct);
}
/*********************************
引脚说明:
LED0 -- PF9
**********************************/
void Led1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //引脚9
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOF, &GPIO_InitStruct);
}
/*********************************
引脚说明:
LED2 -- PF10
**********************************/
void Led2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //引脚10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOF, &GPIO_InitStruct);
}
/*********************************
引脚说明:
LED3 -- PE13
**********************************/
void Led3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOE组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; //引脚13
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOE, &GPIO_InitStruct);
}
/*********************************
引脚说明:
LED4 -- PE14
**********************************/
void Led4_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOE组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14; //引脚14
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOE, &GPIO_InitStruct);
}
main.c
#include "stm32f4xx.h"
#include "led.h"
// 延时
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
// Led1_Init();
// Led2_Init();
// Led3_Init();
// Led4_Init();
Led_Init();
while(1)
{
//输出0 LED0灯亮
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
delay(1000);
//输出1 LED0灯灭
GPIO_SetBits(GPIOF, GPIO_Pin_9);
//输出0 LED1灯亮
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(1000);
//输出1 LED1灯灭
GPIO_SetBits(GPIOF, GPIO_Pin_10);
//输出0 LED2灯亮
GPIO_ResetBits(GPIOE, GPIO_Pin_13);
delay(1000);
//输出1 LED2灯灭
GPIO_SetBits(GPIOE, GPIO_Pin_13);
//输出0 LED3灯亮
GPIO_ResetBits(GPIOE, GPIO_Pin_14);
delay(1000);
//输出1 LED3灯灭
GPIO_SetBits(GPIOE, GPIO_Pin_14);
}
return 0;
}
按键控制灯
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define LED0_ON GPIO_ResetBits(GPIOF, GPIO_Pin_9)
#define LED0_OFF GPIO_SetBits(GPIOF, GPIO_Pin_9)
void Led_Init(void);
#endif
/* ================================================ */
#include "led.h"
/*********************************
引脚说明:
LED0 -- PF9
LED1 -- PF10
LED2 -- PE13
LED3 -- PE14
**********************************/
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOE组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
//使能GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //引脚9 10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; //引脚13 14
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_SetBits(GPIOF, GPIO_Pin_9);
GPIO_SetBits(GPIOF, GPIO_Pin_10);
GPIO_SetBits(GPIOE, GPIO_Pin_13);
GPIO_SetBits(GPIOE, GPIO_Pin_14);
}
#ifndef __KEY_H
#define __KEY_H
#include "stm32f4xx.h"
void Key_Init(void);
#endif
#include "key.h"
/*********************************
引脚说明:
KEY0--PA0
**********************************/
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOA组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //引脚0
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
unsigned char count = 0;
Key_Init();
Led_Init();
while(1)
{
/*
//应用场景1
//判断按键是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//大约延时20ms 起到消抖作用
delay(20);
//判断按键是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//灯状态变更
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
count++;
}
}
//根据按键时长实现不同的功能
if(count == 50)
{
GPIO_ResetBits(GPIOE, GPIO_Pin_14);
}
*/
//应用场景2 比如输入银行密码
//判断按键是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//大约延时15ms 起到消抖作用
delay(15);
//判断按键是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//等待按键松开
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET);
//灯状态变更
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
}
}
}
return 0;
}
按键中断
#ifndef __EXTI_H
#define __EXTI_H
#include "stm32f4xx.h"
void Exti_PA0_Init(void);
#endif
#include "exti.h"
/*********************************
引脚说明:
KEY0--PA0(选择下降沿触发)
**********************************/
void Exti_PA0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//使能SYSCFG及GPIOA时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//使能GPIOA组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//初始化IO口为输入。
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //引脚0
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);
//设置IO口与中断线的映射关系。
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_InitStruct.EXTI_Line = EXTI_Line0; //中断线0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStruct.EXTI_Trigger= EXTI_Trigger_Falling; //下降触发
EXTI_InitStruct.EXTI_LineCmd= ENABLE; //中断使能
//初始化线上中断,设置触发条件等。
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; //中断通道,可在stm32f4xx.h文件当中查找
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //通道使能
//配置中断分组(NVIC),并使能中断。
NVIC_Init(&NVIC_InitStruct);
}
void delays(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
/***************************************************************
1、中断服务函数是满足条件后,CPU自行执行的函数不需要主动调用
2、中断服务函数是不能传递值与返回值
3、STM32的中断服务函数名可在startup_stm32f40_41xxx.s中查找
****************************************************************/
//编写中断服务函数
void EXTI0_IRQHandler(void)
{
//判断标志位是否1
if(EXTI_GetITStatus(EXTI_Line0) == SET)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//延时一段时间
delays(15);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
}
}
}
//清空中断线0
EXTI_ClearITPendingBit(EXTI_Line0);
}
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
unsigned char count = 0;
Key_Init();
Led_Init();
while(1)
{
//判断按键1是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//大约延时15ms 起到消抖作用
delay(15);
//判断按键1是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
//等待按键1松开
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET);
//灯1状态变更
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
}
}
//判断按键2是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == Bit_RESET)
{
//大约延时15ms 起到消抖作用
delay(15);
//判断按键2是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == Bit_RESET)
{
//等待按键2松开
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == Bit_RESET);
//灯2状态变更
GPIO_ToggleBits(GPIOF, GPIO_Pin_10);
}
}
//判断按键3是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET)
{
//大约延时15ms 起到消抖作用
delay(15);
//判断按键3是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET)
{
//等待按键3松开
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET);
//灯3状态变更
GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
}
}
//判断按键4是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == Bit_RESET)
{
//大约延时15ms 起到消抖作用
delay(15);
//判断按键4是否按下 按下为低电平
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == Bit_RESET)
{
//等待按键4松开
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == Bit_RESET);
//灯4状态变更
GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
}
}
}
return 0;
}
作业
#ifndef __BEEP_H
#define __BEEP_H
#include "stm32f4xx.h"
void Beep_Init(void);
#endif
#include "beep.h"
/************************************
引脚说明
Beep -- PF8
************************************/
void Beep_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8; //引脚8
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; //xia la
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; //速度
GPIO_Init(GPIOF, &GPIO_InitStruct);
}
#include "stm32f4xx.h"
#include "beep.h"
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
Beep_Init();
while(1)
{
GPIO_ResetBits(GPIOF, GPIO_Pin_8);
delay(1000);
GPIO_SetBits(GPIOF, GPIO_Pin_8);
delay(1000);
}
return 0;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
STM32
+关注
关注
2266文章
10871浏览量
354796 -
RCC
+关注
关注
0文章
93浏览量
26895 -
GPIO
+关注
关注
16文章
1196浏览量
51916 -
按键控制
+关注
关注
1文章
44浏览量
8769 -
LED流水灯
+关注
关注
0文章
10浏览量
8348
发布评论请先 登录
相关推荐
基于标准库函数与基于HAL库函数的stm32编程方式对比
一、基于标准库函数的stm32编程方式二、基于HAL库函数的stm32编程方式差异上面也提到了,STM32有非常多的寄存器,而导致了
发表于 12-28 19:09
•30次下载
STM32库函数开发-GPIO
2021-01-11 学习日志STM32f1库函数开发学习实战一 · I/O口1. 文件夹结构2. 配置细节 · 从寄存器到库函数3. 跑马灯4.
发表于 01-13 16:17
•14次下载
评论