【No5~STM32】实验流水灯设计

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);
	
	}
}*/
 
}

 

你可能感兴趣的:(stm32)