目录

1.stm32cubemx设置

2.代码实现


前言

        我做了蓝桥杯从第届6到现在的题目,发现每道题都有led的闪烁,这也是一个重要的考点我使用过两个方法前一个方法有一定的局限性,有一些题目要求不同的led闪烁不同的时间,这就要求不同的led互不影响。应为led和lcd是共用引脚的,所以官方加了一个锁存器。(对锁存器就不过的描述了)

 

 

1.stm32cubemx设置

        初始led灯PC8到PC15 ,并且开启定时器6的中断,我这里设置的中断为0.2s,大家可以根据需求改变自己的中断时间。

 

2.代码实现

        我的思路是将每个led灯的亮灭用0和1来表示,八个led灯就可以使用一个数组来表示

//宏定义

#define ON GPIO_PIN_RESET
#define OFF GPIO_PIN_SET
#define led1(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,a)
#define led2(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,a)
#define led3(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,a)
#define led4(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,a)
#define led5(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,a)
#define led6(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,a)
#define led7(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,a)
#define led8(a)  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,a)
#define SUO_K  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
#define SUO_G  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);


//闪烁函数
void led_ss(uint8_t *str)
{		
	led1(OFF);
	led2(OFF);
	led3(OFF);
	for(uint8_t i=0;i<4;i++)
	{
		if(str[i])
		{
			switch (i)
			{
				case 0:
					led1(ON);
				break;
				case 1:
					led2(ON);
				break;
				case 2:
					led3(ON);
				break;
				
			}
		}
	}
	led4(OFF);
	led5(OFF);
	led6(OFF);
	led7(OFF);
	led8(OFF);
	SUO_K;
	SUO_G;
}

中断回调函数 

void HAL_TIM_PeriodElapsedCallback  ( TIM_HandleTypeDef *  htim ) 
{
	if(htim==&htim6)
	{
		static uint8_t i=0,x=0,u=0;
		static uint8_t num=4,l=0;
		//led0
		num++;
		if(i==0&&num==5)
		{
			str3[0]=1;
			i=1;
			num=0;
		}
		else if(num==5)
		{
			str3[0]=0;
			i=0;
			num=0;
		}
		//led1
		if(x==0)
		{
			x=1;
			str3[2]=1;

		 }	
	     else 
	    {    
	        x=0;
			str3[2]=0;
		}
		
	}
}

        这样我们就可以让两个不同的led灯,间隔不同的时间。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐