程序员

STM32——不同的按键对应实现不同功能的灯闪烁

作者:admin 2021-06-22 我要评论

STM32——不同的按键对应实现不同功能的灯闪烁 功能介绍 程序解读 总结 功能介绍 本程序使用STM32F103VE板子 实现功能 按键1实现单个灯闪烁 按键2实现全部灯闪烁...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

STM32——不同的按键对应实现不同功能的灯闪烁

功能介绍

本程序使用STM32F103VE板子
实现功能:
按键1:实现单个灯闪烁
按键2:实现全部灯闪烁
按键3:实现流水灯
按键4:实现跑马灯

程序解读

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
void InitScan(void);
void InitLed(void);
void Delay_us(unsigned long time);
void Delay_ms(unsigned long time);
void InitLedStatus();
void ControlSingleLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey,GPIO_TypeDef* GPIO_LED,u16 GPIO_Pin_Led);
void ControlAllLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey);
void ControlHorseRaceLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey);
void ControlWaterLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey);
/*四个标志位分别用于控制单个灯闪烁,全部灯闪烁,流水灯,跑马灯按键扫描*/
 int Flag_SingleLed = 0;
 int Flag_AllLed = 0; 
 int Flag_WaterLed = 0;
 int Flag_HorseRaceLed = 0;
int main(void)
{
	InitLedStatus();
		InitScan();
	// 来到这里的时候,系统的时钟已经被配置成72M。
	InitScan();
  InitLed();

	while(1){
	/*LED0*/
	ControlSingleLed(GPIOC,GPIO_Pin_0,GPIOA,GPIO_Pin_0); //控制灯闪烁
	/*LED1*/
	ControlAllLed(GPIOC,GPIO_Pin_1);//控制全部灯亮与灭
	/*LED2*/
	ControlWaterLed(GPIOC,GPIO_Pin_2);//实现流水灯
	/*LED3*/
	ControlHorseRaceLed(GPIOC,GPIO_Pin_3);//实现跑马灯
 }
	
}
void Delay_us(unsigned long time){
	unsigned long i;
	while(time--){
		i = 8;
		while(i--);
	}
	
}
void Delay_ms(unsigned long time){
	while(time--)
	Delay_us(1100);	
	
}
/**
*@param void
*Function : 对四个按键进行时钟配置,并配置引脚,模式为上拉输入,速度
*/
void InitScan(void){
	 GPIO_InitTypeDef GPIO_Scan;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	  GPIO_Scan.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	  GPIO_Scan.GPIO_Mode = GPIO_Mode_IPU;
	 GPIO_Init(GPIOC,&GPIO_Scan);
		
	}
void InitLedStatus(){
		GPIO_SetBits(GPIOA,GPIO_Pin_All);		
}
/**
*@param void
*Function : 对四个LED邓进行时钟配置,并配置引脚,模式为推挽输出,速度
*/
void InitLed(void){
	  GPIO_InitTypeDef GPIO_Led;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
	  GPIO_Led.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	  GPIO_Led.GPIO_Mode =  GPIO_Mode_Out_PP;
	  GPIO_Led.GPIO_Speed = GPIO_Speed_10MHz;
	 GPIO_Init(GPIOA,&GPIO_Led);
	}
/**
 *@ControlSingleLed ControlSingleLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键,对应的LED灯亮
*/
void ControlSingleLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey,GPIO_TypeDef* GPIO_LED,u16 GPIO_Pin_Led){
		if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
			Delay_ms(50);
		if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)		
			Flag_SingleLed = !Flag_SingleLed;
		
			if(Flag_SingleLed == 1){
			    InitLedStatus(); 
				  GPIO_ResetBits(GPIO_LED,GPIO_Pin_Led);	
			}else{				
				GPIO_SetBits(GPIO_LED,GPIO_Pin_Led);	
			}
	}
}
/**
 *@ControlAllLed ControlAllLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键所有的灯亮
*/
void ControlAllLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey){
	if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
			Delay_ms(50);
		if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)	
      Flag_AllLed	= !Flag_AllLed;

		if(Flag_AllLed == 1){
		 GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	   GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	   GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	   GPIO_ResetBits(GPIOA,GPIO_Pin_3);
			}else{				
		 GPIO_SetBits(GPIOA,GPIO_Pin_0);	
		 GPIO_SetBits(GPIOA,GPIO_Pin_1);	
		 GPIO_SetBits(GPIOA,GPIO_Pin_2);	
		 GPIO_SetBits(GPIOA,GPIO_Pin_3);		
			} 
	}
}
/**
 *@MethodName ControlWaterLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键,实现流水灯
*/
void ControlWaterLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey){
	if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
			Delay_ms(50);
		if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)	
      Flag_WaterLed	= !Flag_WaterLed;

		if(Flag_WaterLed == 1){
		  GPIO_ResetBits(GPIOA,GPIO_Pin_0);
			Delay_ms(300);
			GPIO_SetBits(GPIOA,GPIO_Pin_0);
			Delay_ms(300);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_1);
			Delay_ms(300);
			GPIO_SetBits(GPIOA,GPIO_Pin_1);	
			Delay_ms(300);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
			Delay_ms(300);
			GPIO_SetBits(GPIOA,GPIO_Pin_2);
			Delay_ms(300);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_3);
			Delay_ms(300);
			GPIO_SetBits(GPIOA,GPIO_Pin_3);
			Delay_ms(300);
			}else{				
				InitLedStatus();
			} 
	}
	
}
/**
 *@MethodName ControlHorseRaceLed
 *@param GPIO_Scan 按键端口
 *@param GPIO_Pin_ScanKey 按键引脚
 *@param GPIO_LED 灯端口
 *@param GPIO_Pin_Led 灯引脚
*Function : 按下按键,实现跑马灯
*/

void ControlHorseRaceLed(GPIO_TypeDef* GPIO_Scan,u16 GPIO_Pin_ScanKey){
	
	if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0){
			Delay_ms(50);
		if(GPIO_ReadInputDataBit(GPIO_Scan,GPIO_Pin_ScanKey) == 0)	
      Flag_HorseRaceLed	= !Flag_HorseRaceLed;

		if(Flag_HorseRaceLed == 1){
		  GPIO_ResetBits(GPIOA,GPIO_Pin_0);
			Delay_ms(300);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_1);
			Delay_ms(300);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
			Delay_ms(300);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_3);
			Delay_ms(300);
			InitLedStatus();
			}else{				
				InitLedStatus();
			} 
	}
}

总结

上面程序所用到的4个灯,4个按键在电路图上的位置
在这里插入图片描述

;原文链接:https://blog.csdn.net/News53231323/article/details/115638770

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 阿里巴巴DevOps实践指南(八)| 以特性

    阿里巴巴DevOps实践指南(八)| 以特性

  • 阿里巴巴DevOps实践指南(五)| 业务驱

    阿里巴巴DevOps实践指南(五)| 业务驱

  • RISC-V工具链简介

    RISC-V工具链简介

  • 变局时代:RISC-V处理器架构的技术演变

    变局时代:RISC-V处理器架构的技术演变

腾讯云代理商
海外云服务器