LED工作原理
根据CT117-M4产品手册中LED的原理图,可以知道控制LED1~8的PC8~PC15的八个引脚和LCD屏进行了共享,因此,随意对锁存引脚PD2进行操作会引起LED乱闪烁。接下来我将以LED1(PC8)为例来演示如何让LED闪烁。

点亮LED操作
#include "led.h"
void LED_Disp(uint8_t dsLED)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
这是点亮一个LED的函数,我们在点亮一个LED的时候首先要确定PC8~PC15的引脚状态,然后给PD2置高电平,让数据传输过去,再给PD2置低电平,将数据锁存,防止LED乱闪烁。
利用定时器将LED闪烁
配置定时器
因为只需要用到定时器的定时功能,这里我采用了基本定时器六来定时。
void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 799;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 9999;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
我将定时器的周期设为了0.1s[(799+1)*(9999+1)/80000000],也就是每0.1s闪烁一次。周期根据闪烁频率来设置,配置的时候记得打开中断!
中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
LED_Disp(0x01);
}
}
中断回调函数的作用是每产生一次中断就执行一次回调函数的内容,这里是0.1s就将LED1打开一次。
LED闪烁
while (1)
{
/* USER CODE END WHILE */
LED_Disp(0x00);
/* USER CODE BEGIN 3 */
}
定时器每0.1s打开LED1,再在主循环将LED全部置0,就实现了闪烁。
以上是我自己想的一个方法,可能会有问题,望大家谅解。
经过实验,一个LED闪烁的效果还不错,但当一个LED闪烁的时候,另一个 LED要长亮时,长亮的LED会受到一些影响。