目录
前言
我做了蓝桥杯从第届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灯,间隔不同的时间。