|
最近有个项目用到多个LED,并以不同的闪烁方式提示多种工作状态。和一个小振动马达, 以不同的振动方式,提示不同的工作状态。
这个模块同样支持控制蜂鸣器。
这个模块支持的功能:(假设控制LED)可设置闪烁周期,周期内亮灭的时间,闪烁次数, 常亮和熄灭。
像LED这类共享资源,要注意多个任务对它访问的问题。
代码如下:
Indicator.h
- #ifndef __INDICATER_H_
- #define __INDICATER_H_
- #include "MacroAndConst.h"
- #define LED_ON(__LED) do { \
- __LED.chWidth = 0; \
- __LED.chPeriod = 0; \
- __LED.chBlinkCnt = 0; \
- } while (false)
-
- #define LED_OFF(__LED) do { \
- __LED.chWidth = 0xFF; \
- __LED.chPeriod = 0; \
- __LED.chBlinkCnt = 0; \
- } while (false)
- #define LED_BLINKING(__LED, __WIDTH, __PERIOD) do { \
- __LED.chWidth = __WIDTH; \
- __LED.chPeriod = __PERIOD; \
- __LED.chBlinkCnt = 0; \
- } while (false)
- #define LED_BLINK_TIMES(__LED, __WIDTH, __PERIOD, __TIMES) do { \
- __LED.chWidth = __WIDTH; \
- __LED.chPeriod = __PERIOD; \
- __LED.chBlinkCnt = __TIMES; \
- } while (false)
- #define MOTOR_SHAKE_TIMES(__MOTOR, __WIDTH, __PERIOD, __TIMES) do { \
- __MOTOR.chWidth = __WIDTH; \
- __MOTOR.chPeriod = __PERIOD; \
- __MOTOR.chBlinkCnt = __TIMES; \
- } while (false)
- typedef void (*pfn_indic_t)(void);
- typedef struct {
- uint8_t chCounter;
- pfn_indic_t indic_on;
- pfn_indic_t indic_off;
- } indic_ctrl_t;
- typedef struct {
- uint8_t chWidth;
- uint8_t chPeriod;
- uint8_t chBlinkCnt;
- indic_ctrl_t tIndic;
- } indic_set_t;
- //extern void indic_io_init();
- void indic_init(indic_set_t *ptIndic, pfn_indic_t pfn_indic_on, pfn_indic_t pfn_indic_off);
- bool indic_task(indic_set_t *ptIndic);
- #endif
复制代码
Indicator.c
- #include "indicator.h"
- void indic_init(indic_set_t *ptIndic, pfn_indic_t pfn_indic_on, pfn_indic_t pfn_indic_off)
- {
- if (NULL == ptIndic) {
- return ;
- }
- ptIndic->chWidth = 0xFF;
- ptIndic->chPeriod = 0;
- ptIndic->chBlinkCnt = 0;
-
- ptIndic->tIndic.chCounter = 0;
- ptIndic->tIndic.indic_on = pfn_indic_on;
- ptIndic->tIndic.indic_off = pfn_indic_off;
-
- //indic_io_init();
- (*ptIndic->tIndic.indic_off)();
- }
- bool indic_task(indic_set_t *ptIndic)
- {
- if (NULL == ptIndic) {
- return false;
- }
-
- if (ptIndic->chPeriod >= ptIndic->chWidth) {
- if (ptIndic->tIndic.chCounter <= ptIndic->chWidth) {
- (*ptIndic->tIndic.indic_on)();
- } else {
- (*ptIndic->tIndic.indic_off)();
- }
-
- if (++ ptIndic->tIndic.chCounter >= ptIndic->chPeriod) {
- ptIndic->tIndic.chCounter = 0;
- if (ptIndic->chBlinkCnt > 0) {
- if (0 == (-- ptIndic->chBlinkCnt)) {
- ptIndic->chWidth = 0xFF;
- ptIndic->chPeriod = 0;
- ptIndic->chBlinkCnt = 0;
- return true;
- }
- }
- }
- } else {
- ptIndic->chBlinkCnt = 0;
- ptIndic->tIndic.chCounter = 0;
- (*ptIndic->tIndic.indic_off)();
- }
- return false;
- }
复制代码
程序外部,需用户提供最基本的IO初始化,高低电平输出函数等,如:
- void led_io_init(void)
- {
- LED_RED_OUT();
- LED_RED_SET();
- }
- void led_red_on(void)
- {
- LED_RED_CLR();
- }
- void led_red_off(void)
- {
- LED_RED_SET();
- }
- ......
复制代码
一个简单的例子:
- indic_set_t g_tRedLed, g_tGreenLed, g_tBlueLed;
- void main(void)
- {
- ... ...
-
- indic_init(&g_tRedLed, led_red_on, led_red_off);
- indic_init(&g_tGreenLed, led_green_on, led_green_off);
- indic_init(&g_tBlueLed, led_blue_on, led_blue_off);
- LED_ON(g_tRedLed);
- LED_BLINKING(g_tGreenLed, 50, 100);
- LED_BLINK_TIMES(g_tBlueLed, 30, 70, 10);
- indic_init(&g_tMotor, motor_on, motor_off);
- MOTOR_SHAKE_TIMES(g_tMotor, 25, 50, 4);
-
- while(1) {
- if (event_get(&g_tEvent, EVENT_10MS_OVERFLOW)) {
- ... ...
-
- indic_task(&g_tRedLed);
- indic_task(&g_tGreenLed);
- indic_task(&g_tBlueLed);
-
- indic_task(&g_tMotor);
-
- event_delete(&g_tEvent, EVENT_10MS_OVERFLOW);
- }
- }
- }
复制代码
发现不足之处,欢迎提出,谢谢!
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|