单片机裸机实用组件--LED
生活随笔
收集整理的這篇文章主要介紹了
单片机裸机实用组件--LED
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
easy_led
介紹
單片機常用led驅動,可以十分方便的控制led閃爍頻率和閃爍持續時間
移植教程
使用說明
使用例子
eLED_T g_eled1, g_eled2, g_eled3, g_eled4;/* LED IO控制函數 */ void eled1_control(uint8_t level) {//HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, (GPIO_PinState)level); }void eled2_control(uint8_t level) {//HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, (GPIO_PinState)level); }void eled3_control(uint8_t level) {//HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, (GPIO_PinState)level); }void eled4_control(uint8_t level) {//HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, (GPIO_PinState)level); }int main(void) {/* 設置led1 默認狀態 90 個周期亮 10個周期滅 */eled_init(&g_eled1, eled1_control, 90, 10);eled_init(&g_eled2, eled2_control, 100, 100);eled_init(&g_eled3, eled3_control, 10, 10);eled_init(&g_eled4, eled4_control, 50, 50);/* 設置led4 狀態 10 個周期亮 10個周期滅 持續500個周期 */eled_set(&g_eled4, 10, 10, 500);eled_set(&g_eled3, 10, 90, 500);while (1){delay_ms(10);/* 10ms 調用一次 也可以放在中斷中 */eled_ticks();} }easy_led.c
/*** @file easy_led.c* @author 不咸不要錢 (main_2018@163.com)* @brief led驅動文件* @version 0.1* @date 2021-11-24* * @copyright Copyright (c) 2019* */ #include "easy_led.h"/** 指向led驅動鏈表頭節點 */ static eLED_T * s_ledHead = 0;extern void eled_port_init(void); extern void eled_port_lock(void); extern void eled_port_unlock(void);/*!* @brief led翻轉處理** @param eLed :led對象* @param onTicks :一個閃爍周期中亮的節拍數* @param offTicks:一個閃爍周期中暗的節拍數** @return 無** @note 內部調用** @see */ static void eled_handler(eLED_T * eLed, uint16_t onTicks, uint16_t offTicks) {if(1 == eLed->ulTicks){if(1 >= onTicks){/* 默認led不亮 */eLed->ledControl(0);}else{eLed->ledControl(1);}}else if(eLed->ulTicks >= onTicks){eLed->ledControl(0);}if(eLed->ulTicks >= offTicks){eLed->ulTicks = 0;} }/*!* @brief led初始化** @param eLed :led對象* @param ledControl :指向led控制函數(該函數有一個參數 參數為0時 LED 亮)* @param ledOnDefaultTicks :默認狀態閃爍時 led點亮的節拍數* @param ledOffDefaultTicks:默認狀態閃爍時 led關閉的節拍數** @return 無** @note ** @see */ void eled_init(eLED_T * eLed, ledControl_t ledControl, uint16_t ledOnDefaultTicks, uint16_t ledOffDefaultTicks) {if(0 == s_ledHead){eled_port_init();}eled_port_lock();eLed->ulTicks = 0;eLed->ulLedOnDefaultTicks = ledOnDefaultTicks + 1;eLed->ulLedOffDefaultTicks= ledOnDefaultTicks + ledOffDefaultTicks;eLed->ulLedOnTicks = 0;eLed->ulLedOffTicks = 0;eLed->ulKeepTicks = 0;eLed->ledControl = ledControl;/* 防止重復初始化 */eLED_T * node = s_ledHead;while(node){if(node == eLed){eled_port_unlock();return;}else{node = node->ptNextLed;}}eLed->ptNextLed = s_ledHead;s_ledHead = eLed;eled_port_unlock(); }/*!* @brief led狀態設置** @param eLed : led對象* @param ledOnTicks : 一個閃爍周期 led點亮的節拍數* @param ledOffTicks: 一個閃爍周期 led關閉的節拍數* @param keepTicks : led閃爍持續時間 為0xFFFF時 永久持續** @return 無** @note 當閃爍持續時間結束后 會按初始化時設置的默認狀態進行閃爍** @see */ void eled_set(eLED_T * eLed, uint16_t ledOnTicks, uint16_t ledOffTicks, uint16_t keepTicks) {eled_port_lock();eLed->ulTicks = 0;eLed->ulLedOnTicks = ledOnTicks + 1;eLed->ulLedOffTicks = ledOnTicks + ledOffTicks;eLed->ulKeepTicks = keepTicks;eled_port_unlock(); }/*!* @brief led默認狀態設置** @param eLed : led對象* @param ledOnDefaultTicks :默認狀態閃爍時 led點亮的節拍數* @param ledOffDefaultTicks:默認狀態閃爍時 led關閉的節拍數** @return 無** @note 當閃爍持續時間結束后 會按初始化時設置的默認狀態進行閃爍** @see */ void eled_set_default(eLED_T * eLed, uint16_t ledOnDefaultTicks, uint16_t ledOffDefaultTicks) {eled_port_lock();eLed->ulLedOnDefaultTicks = ledOnDefaultTicks + 1;eLed->ulLedOffDefaultTicks= ledOnDefaultTicks + ledOffDefaultTicks;eled_port_unlock(); }/*!* @brief led停止閃爍** @param eLed : led對象** @return 無** @note 將該led從鏈表移除** @see */ void eled_stop(eLED_T * eLed) {eLED_T** curr;for(curr = &s_ledHead; *curr; ) {eLED_T* entry = *curr;if (entry == eLed) {eled_port_lock();*curr = entry->ptNextLed;eled_port_unlock();return;} elsecurr = &entry->ptNextLed;} }/*!* @brief led 節拍處理** @param 無** @return 無** @note 需要周期性執行 閃爍時間設置均以該周期為單位** @see */ void eled_ticks(void) {eLED_T * target = s_ledHead;eled_port_lock();while(target){if(target->ulTicks == TICKS_MAX){target->ulTicks = 0;}target->ulTicks ++;if(0 == target->ulKeepTicks){eled_handler(target, target->ulLedOnDefaultTicks, target->ulLedOffDefaultTicks);}else{eled_handler(target, target->ulLedOnTicks, target->ulLedOffTicks);target->ulKeepTicks --;}target = target->ptNextLed;}eled_port_unlock(); }easy_led.h
/*** @file easy_led.h* @author 不咸不要錢 (main_2018@163.com)* @brief led驅動頭文件* @version 0.1* @date 2021-11-24* * @copyright Copyright (c) 2019* */ #ifndef __EASY_LED_H #define __EASY_LED_H#include <stdint.h>#ifdef __cplusplusextern "C" { #endif/*! 時鐘節拍最大值 uint16_t 0xFFFF */ #define TICKS_MAX (0xFFFF)/*! 函數指針 指向led控制函數(該函數有一個參數 參數為0時 LED 亮) */ typedef void (*ledControl_t)(uint8_t);/** * @brief uLED結構體* @note 無*/ typedef struct eLED {uint16_t ulTicks; /*!< 時鐘節拍 */uint16_t ulLedOnDefaultTicks; /*!< 默認狀態閃爍時 led點亮的節拍數 */uint16_t ulLedOffDefaultTicks; /*!< 默認狀態閃爍時 led關閉的節拍數 */uint16_t ulLedOnTicks; /*!< 使用uLedSet函數后 led閃爍時點亮的節拍數 */uint16_t ulLedOffTicks; /*!< 使用uLedSet函數后 led閃爍時關閉的節拍數 */uint16_t ulKeepTicks; /*!< 使用uLedSet函數后 led閃爍持續時間 */ledControl_t ledControl; /*!< 指向led控制函數 */struct eLED * ptNextLed; /*!< 指向下一個led對象 */ }eLED_T;void eled_init(eLED_T * uLed, ledControl_t ledControl, uint16_t ledOnDefaultTicks, uint16_t ledOffDefaultTicks); void eled_set(eLED_T * uLed, uint16_t ledOnTicks, uint16_t ledOffTicks, uint16_t keepTicks); void eled_set_default(eLED_T * eLed, uint16_t ledOnDefaultTicks, uint16_t ledOffDefaultTicks); void eled_stop(eLED_T * eLed); void eled_ticks(void);#ifdef __cplusplus} #endif#endifeasy_led_port.c
/*** @file easy_led_port.c* @author 不咸不要錢 (main_2018@163.com)* @brief led驅動移植接口文件* @version 0.1* @date 2021-11-24* * @copyright Copyright (c) 2019* */ #include "easy_led.h"/*!* @brief led 接口文件初始化** @param ** @return 無** @note ** @see */ void eled_port_init(void) {}/*!* @brief led 加鎖** @param ** @return 無** @note ** @see */ void eled_port_lock(void) {}/*!* @brief led 開鎖** @param 無** @return 無** @note ** @see */ void eled_port_unlock(void) {}總結
以上是生活随笔為你收集整理的单片机裸机实用组件--LED的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机裸机实用组件--软件定时器、时间戳
- 下一篇: RT-Thread移植到STM32F10