蓝桥杯嵌入式LED闪烁实验

1 篇文章 0 订阅
1 篇文章 0 订阅
该文介绍了LED的工作原理,特别是在PC8~PC15与LCD屏共享引脚的情况下,如何避免LED乱闪烁。通过示例代码展示了使用定时器和中断回调函数实现LED1(PC8)的0.1秒周期性闪烁,并提到当尝试同时控制多个LED时可能出现的问题。
摘要由CSDN通过智能技术生成

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会受到一些影响。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值