LED配置头文件
#ifndef BSP_LED_H
#define BSP_LED_H
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#define LED_CLK_C RCC_AHB1Periph_GPIOC
extern void Led_Config();
#endif
led.c文件
#include "bsp_led.h"
void Led_Config()
{
GPIO_InitTypeDef GPIO_InitStruct;//声明GPIO结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//开启GPIOC时钟 由于c口挂载在AHB1上
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//装载C口4个引脚
//void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
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_Fast_Speed;//设置59Mhz
GPIO_Init(GPIOC, &GPIO_InitStruct);初始化GOIOC口将结构体放入
/*******µãÁÁËĵÆ**/
}
bsp_key.h
#ifndef BSP_KEY_H
#define BSP_KEY_H
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#define Key_OFF 0
#define Key_ON 1
extern void key_Config();
extern uint8_t key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
#endif
bsp_key.c
#include "bsp_key.h"
void key_Config()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//一个时钟开启时装载一种IO口
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2;//选择需要控制的引脚
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//开启时钟
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//选择需要控制的引脚
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;//注意为选择输入模式
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//选择为上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);//初始化ABC口
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
uint8_t key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)//按键检测函数
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)== 0)//GPIO按位读取,当按键按下输出0
{
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==0);//防抖确认按键按下一会
return Key_OFF;//返回0
}
return Key_ON;//否则返回1
}
主函数
#include "stm32f4xx.h"
#include "bsp_led.h"
#include "bsp_key.h"
void DelayM(unsigned int a)//500ms
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
int main(void)
{
int a,flag=0;
Led_Config();//led灯初始化配置
key_Config();//按键初始化
/***基本功能实现按下第一个按键实现正流水再次按下全灭的功能***/
/****按下第二个按键实现反流水***按下第三个按键实现正流水**/
/***按下第4个键停在当前所亮位置*****/
while(1)
{
int i=0;
if(key_Scan(GPIOA,GPIO_Pin_0)==Key_OFF )
{
DelayM(500);
a=1;
flag=~flag;//标志位取反,注意按键检测很快不要出现重复的按键检测,确保按键检测内部语句有用
}
if(key_Scan(GPIOC,GPIO_Pin_13)==Key_OFF )
{
a=2;
}
if(key_Scan(GPIOA,GPIO_Pin_2)==Key_OFF )
{
a=3;
}
// if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
// {
// a=4;
// }
// if(key_Scan(GPIOA,GPIO_Pin_0)==Key_OFF)
// {
//
// flag=~flag;
//
// }
if(flag==0)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);//给4个键复位
//a=0;
continue;//结束本次while(1)循环执行执行下次循环 下面switch语句这次执行
}
switch(a)
{
case 1:
GPIO_SetBits(GPIOC, GPIO_Pin_1);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue; //在灯每次置位时,加入判断4号键是否按下
}//如果按键按下遇到continue下面语句全部不执行跳到while(1)开头
//如果a为1还会出现正流水所以让a为0不进入switch语句
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_4);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
DelayM(5000);
break;
case 2:
GPIO_SetBits(GPIOC, GPIO_Pin_4);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_1);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
DelayM(5000);
break;
case 3:
GPIO_SetBits(GPIOC, GPIO_Pin_1);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
DelayM(5000);
GPIO_SetBits(GPIOC, GPIO_Pin_4);
DelayM(5000);
if(key_Scan(GPIOB,GPIO_Pin_5)==Key_OFF )
{
a=0;
continue;
}
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
DelayM(5000);
break;
}
}
/*while(1)
{
if(key_Scan(GPIOC,GPIO_Pin_13)==Key_OFF )
{
GPIO_SetBits(GPIOC, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
}
}*/
}