面向对象实现LED灯

🌈个人主页:羽晨同学

💫个人格言:"成为自己未来的主人~"

面向对象的意思就是说我们将每一个LED进行一下封装,封装成一个结构体,通过调用每一个结构体来实现每一个LED灯的使用。

首先,让我们创建一个board.c文件,来实现LED灯底层,这样可以使得main.c中的代码更加整洁。

cpp 复制代码
void board_lowlevel_init(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
}

接下来,我们创建每一个LED的结构体

cpp 复制代码
struct led_desc
{
    GPIO_TypeDef* Port;
    uint32_t Pin;
    BitAction OnBit;
    BitAction OffBit;
};

定义了一个LED的引脚,开关。

cpp 复制代码
struct led_desc;
typedef struct led_desc *led_desc_t;

接下来,让我们实现其对应的函数的功能

cpp 复制代码
void led_init(led_desc_t led);
void led_set(led_desc_t led, bool onoff);
void led_on(led_desc_t led);
void led_off(led_desc_t led);
cpp 复制代码
void led_init(led_desc_t led)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = led->Pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(led->Port, &GPIO_InitStructure);
    
    GPIO_WriteBit(led->Port, led->Pin, led->OffBit);
}

void led_set(led_desc_t led, bool onoff)
{
    GPIO_WriteBit(led->Port, led->Pin, onoff ? led->OnBit : led->OffBit);
}

void led_on(led_desc_t led)
{
    GPIO_WriteBit(led->Port, led->Pin, led->OnBit);
}

void led_off(led_desc_t led)
{
    GPIO_WriteBit(led->Port, led->Pin, led->OffBit);
}

接下来,我们创建三个LED的对象

cpp 复制代码
static struct led_desc _led1 = { GPIOE, GPIO_Pin_9, Bit_RESET, Bit_SET};
static struct led_desc _led2 = { GPIOB, GPIO_Pin_0, Bit_RESET, Bit_SET};
static struct led_desc _led3 = { GPIOB, GPIO_Pin_1, Bit_RESET, Bit_SET};
led_desc_t led1 = &_led1;
led_desc_t led2 = &_led2;
led_desc_t led3 = &_led3;

这样的话,我们就可以在main函数中直接调用对应的对象就可以实现对应的功能,大大提高了代码的简洁性

cpp 复制代码
int main(void)
{
    board_lowlevel_init();
    
    led_init(led1);
    led_init(led2);
    led_init(led3);
    
    while (1)
    {
        led_on(led1); led_off(led2); led_on(led3);
        led_delay();

        led_off(led1); led_on(led2); led_off(led3);
        led_delay();
    }
}
相关推荐
糖糖单片机设计41 分钟前
STM32 老人跌倒监测报警系统
stm32·单片机·嵌入式硬件
智闲电子设计2 小时前
STM32 硬件 CRC 与 UID 实战:固件校验防变砖,UID 防抄板,这两个外设白用太可惜
stm32·单片机·嵌入式硬件
嵌入式阿蔡2 小时前
CoAP / LwM2M 轻量协议:受限设备为什么不用 MQTT
单片机·物联网·嵌入式
wuyk5553 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
hongmai6668883 小时前
ESP32-WROVER-IE-N4R8:外接天线+8MB内存,专治信号焦虑
笔记·单片机·嵌入式硬件·microsoft·risc-v
恒锐丰科技林技术员3 小时前
EG11722:高耐压 150V 降压 DC‑DC 电源芯片,工业宽压电源优选方案
经验分享·嵌入式硬件
安河桥。3 小时前
MIPI CSI-2物理层接口:C-PHY与D-PHY技术规格说明
嵌入式硬件·视频
雾削木3 小时前
GPIO基本概念
单片机·嵌入式硬件
LCG元5 小时前
STM32 USB CDC 虚拟串口开发实战:从 CubeMX 配置到 printf 重定向与稳定收发
stm32·单片机·嵌入式硬件
zcmodeltech5 小时前
源网荷储一体化沙盘模型多场景控制系统设计——基于STM32与Modbus RTU的源网荷储、多能互补、冷热电三联供全场景联动方案,服务范围覆盖全国
数据库·人工智能·stm32·单片机·嵌入式硬件