
🌈个人主页:羽晨同学
💫个人格言:"成为自己未来的主人~"

面向对象的意思就是说我们将每一个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();
}
}
