用于STM32的C++编程的LED对象

这个是用于C++工程的LED对象,使用很方便,特记录于此。

复制代码
#define _LED_H_
#ifdef _LED_H_
class LED {
private:
    GPIO_TypeDef* GPIOx;//GPIO分组。
    uint16_t GPIO_Pin;//GPIO引脚编号。
protected:
    void init(void){
    	if(GPIOx == nullptr)return;
    	//打开时钟并配置引脚。
		#ifdef GPIOA
				if(GPIOx == GPIOA) __HAL_RCC_GPIOA_CLK_ENABLE();
		#endif
		#ifdef GPIOB
				if(GPIOx == GPIOB) __HAL_RCC_GPIOB_CLK_ENABLE();
		#endif
		#ifdef GPIOC
				if(GPIOx == GPIOC) __HAL_RCC_GPIOC_CLK_ENABLE();
		#endif
		#ifdef GPIOD
				if(GPIOx == GPIOD) __HAL_RCC_GPIOD_CLK_ENABLE();
		#endif
		#ifdef GPIOE
				if(GPIOx == GPIOE) __HAL_RCC_GPIOE_CLK_ENABLE();
		#endif
		#ifdef GPIOF
				if(GPIOx == GPIOF) __HAL_RCC_GPIOF_CLK_ENABLE();
		#endif
		#ifdef GPIOG
				if(GPIOx == GPIOG) __HAL_RCC_GPIOG_CLK_ENABLE();
		#endif
		#ifdef GPIOH
				if(GPIOx == GPIOH) __HAL_RCC_GPIOH_CLK_ENABLE();
		#endif
		//设置引脚。
		HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);
		GPIO_InitTypeDef GPIO_InitStruct={0};
		GPIO_InitStruct.Pin = GPIO_Pin;
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
		HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
    }
public:
    LED(GPIO_TypeDef* port=nullptr, uint16_t pin=0):GPIOx(port),GPIO_Pin(pin){init();}
    ~LED(){;}
    void begin(GPIO_TypeDef* port=nullptr, uint16_t pin=0){GPIOx=port;GPIO_Pin=pin;init();}
    void Toggle(void) {if(GPIOx == nullptr)return;HAL_GPIO_TogglePin(GPIOx,GPIO_Pin);}
    void SetState(bool state){if(GPIOx == nullptr)return;state == true ? HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET);}
    bool GetState(void){if(GPIOx == nullptr)return false;return (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_SET) ? true : false;}
};
#endif

使用非常方便,只需要先申明对象实例,然后调用其相关函数。就像下面这样让LED闪烁起来:

LED led0(GPIOE,GPIO_PIN_10);

while(1){

led0.Toggle();HAL_Delay(500);

}

最重要的是可以一次性申明一个LED数组,操作一大串LED就非常方便:

LED led[2];

led[0].begin(GPIOE,GPIO_PIN_10);led[1].begin(GPIOG,GPIO_PIN_10);

bool ledState=false;

while(1){

led[0].SetState(ledState);ledStat = !ledState;led[1].SetState(!ledState);

HAL_Delay(500);

}

如果需要在FOR循环中处理一大串LED,使用LED对象数组就非常方便。

相关推荐
澈2071 天前
C++多态编程:从原理到实战
开发语言·c++
6Hzlia1 天前
【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步
c++·leetcode·链表
汉克老师1 天前
GESP2025年6月认证C++五级( 第一部分选择题(9-15))
c++·贪心算法·分治算法·二分算法·gesp5级·gesp五级·高精度除法
qiqsevenqiqiqiqi1 天前
MT2048三连 暴力→数学推导→O (n) 优化
数据结构·c++·算法
ximu_polaris1 天前
设计模式(C++)-行为型模式-模版方法模式
c++·设计模式
码之气三段.1 天前
十五届山东ccpc省赛补题(update)
数据结构·c++·算法
进击的小头1 天前
20_第20篇:嵌入式外设驱动开发基础:寄存器级开发与库函数开发对比实战
arm开发·驱动开发·单片机
王老师青少年编程1 天前
csp信奥赛C++高频考点专项训练之贪心算法 --【跳跃与过河问题】:过河问题
c++·算法·贪心·csp·信奥赛·跳跃与过河问题·过河问题
是个西兰花1 天前
C++11:智能指针
开发语言·c++·智能指针·rall
CN-Dust1 天前
【C++专题】输出cout例题
开发语言·c++