原理
由于蓝桥杯的板子带有锁存器,并且与lcd屏幕有冲突,所以这个就成了考点。
主要就是用定时器来实现,同时也要兼顾lcd的冲突。
一、处理LCD函数
首先来解决与lcd屏幕冲突的问题,把我们所有用到的lcd函数改装一下。
以下是基本格式
void LCD函数名(void)
{
uint16_t temp = GPIOC->ODR;
//其他代码----
//---
//---
GPIOC->ODR = temp;
}
目的是在每一次调用LCD相关的函数时候,把引脚的状态恢复为原态。
二、配置定时器
配置一个基本定时+中断功能即可
通过配置PSC和ARR 把周期设置成0.1s
记得中断使能
三、代码
你要实现某条件下,led闪烁,就需要设置一个标志位,等到他条件满足的时候,在while循环里面就一直不断地关闭led。
与此同时,开启定时器,在中断回调函数里面不断开启
由于while循环执行的更块,所以,每隔0.1s就会进一次中断,也就是每0.1sLED会亮一次。
这样就实现了闪烁的效果。
写一个函数放在while里。
//满足某条件,就开启TIM1
//满足某条件,就关闭TIM1
这样就可以实现自由控制是否闪烁
int main()
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//先关闭锁存器
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
//其他代码
//-----------
//-----------
//其他代码
while()
{
//其他代码------------
写一个函数放在while里。
//满足某条件,就开启TIM1
//满足某条件,就关闭TIM1
//这样就可以实现自由控制是否闪烁
if(标志位条件)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7 << 2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
//其他代码----------
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7 << 2, GPIO_PIN_RESET); // 2闪烁
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}