【蓝桥杯嵌入式】四、各种外设驱动(一)LED

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录。

目录

内容提炼:

一、需求分析

1、需要的外设资源分析:

 2、外设具体分析:

3、软件分析:

二、软件配置

三、代码编写

四、运行测试


内容提炼:

根据原理图,选择PC8~PC15引脚控制LED,PD2引脚控制锁存器。

  •  LED控制引脚配置为:推挽输出,高电平。
  • 根据锁存器芯片手册(资料包),PD2引脚配置为:推挽输出,低电平。
  • 添加用户标签。

快捷方式:直接在main.c的用户代码段实现下面的函数。

注意:

LED灯不会自动熄灭,有时候需要先关闭所有的灯,然后再点亮需要的灯。

可以用  " | " (或),连接多个LED_Pin实现多个灯一起操作。

void LED_switch(uint16_t GPIO_Pin, GPIO_PinState PinState)
{
    HAL_GPIO_WritePin(LED1_GPIO_Port,GPIO_Pin,PinState);
    HAL_GPIO_WritePin(LED_LE_GPIO_Port,LED_LE_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(LED_LE_GPIO_Port,LED_LE_Pin,GPIO_PIN_RESET);
}

驱动函数:个人认为没必要

一、需求分析

1、需要的外设资源分析:

        8个LED控制引脚,1个锁存器控制引脚

 2、外设具体分析:

查看原理图,和手册。

根据原理图,选择PC8~PC15引脚控制LED,PD2引脚控制锁存器。

  •  LED控制引脚配置为:推挽输出,高电平。
  • 根据锁存器芯片手册(资料包),PD2引脚配置为:推挽输出,低电平。

3、软件分析:

要求分析:一个独立的驱动程序,需要在比赛时快速写出、简单、便于记忆。

功能分析:

a、开/关某些LDE灯

b、根据指令,改变LED灯阵的状态

二、软件配置

建立名为“dev_LED_Demo”的项目。

按照分析配置引脚结果如图所示:

生成项目文件后,打开MDK。

新建并导入文件:

在 "D:\IoT-Engineer\IoT-Project\BBC-Demo\object\dev_LED_Demo\Core"文件夹中新建两个.txt文件,分别命名为led.c和led.h(即后缀也要修改

然后把.c文件放到Src,.h文件放到Inc。

然后将这两个文件Add进来。

三、代码编写

分析:

需要宏:

LED_ALL:所有LED引脚

LED_NULL:0x00

函数:

a、开/关某些LDE灯

void LED_switch(需要操作的灯,状态);

b、根据指令,改变LED灯阵的状态

void LED_change(需要点亮的灯);

在MDK中编写代码,代码如下:

led.h:

#ifndef __LED_H
#define __LED_H

#include "main.h"

#define LED_ALL	    LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin
#define LED_NULL    0x00

void LED_switch(uint16_t GPIO_Pin, GPIO_PinState PinState);

void LED_change(uint16_t GPIO_Pin);

#endif	/* __LED_H */

led.c:

#include "led.h"

void LED_switch(uint16_t GPIO_Pin, GPIO_PinState PinState)
{
	HAL_GPIO_WritePin(LED1_GPIO_Port,GPIO_Pin,PinState);
	HAL_GPIO_WritePin(LED_LE_GPIO_Port,LED_LE_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(LED_LE_GPIO_Port,LED_LE_Pin,GPIO_PIN_RESET);
}

void LED_change(uint16_t GPIO_Pin)
{
	LED_switch(LED_ALL,GPIO_PIN_SET);
	LED_switch(GPIO_Pin,GPIO_PIN_RESET);
}

四、运行测试

main.h中引用"led.h",

在 main(void) 的 while(1) 代码段,编写以下代码

 /* USER CODE BEGIN WHILE */
  while (1)
  {
		LED_change(LED1_Pin|LED2_Pin);
		HAL_Delay(500);
		LED_change(LED_NULL);
		HAL_Delay(500);
		LED_change(LED_ALL);
		HAL_Delay(500);
		LED_change(LED_NULL);
		HAL_Delay(500);
    /* USER CODE END WHILE */

编译、下载。

运行结果如下:

LED驱动测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值