led:核心代码讲解
/*
uint8_t led_index,led编号 #define RGB_PIN {LED_R,LED_G,LED_B} 这个一致,0为LED_R 1---LED_G
uint16_t on_ms,一个周期内亮的时间
uint16_t off_ms,一个周期内灭的时间
uint16_t times,周期数
使用实例:led_ctrl(LED_B_INDEX,100,300,10);蓝灯闪烁10次,每次亮100ms灭300ms
*/
void led_ctrl(uint8_t led_index,uint16_t on_ms,uint16_t off_ms,uint16_t times)
调用方法:
init_led_timer:开机调用一次
led_timer_manage放主循环最快速度扫描
led_ctrl需要灯闪烁的时候调用
.h文件
#define LED_NUMBERS 3
#define KEY_PIN 23
#define LED_R 26
#define LED_G 25
#define LED_B 27
#define RGB_PIN {LED_R,LED_G,LED_B}
#define LED_TIMER {1,2,4}
#define RGB_LED_ON(A) nrf_gpio_pin_write(A,1)
#define RGB_LED_OFF(A) nrf_gpio_pin_write(A,0)
#define RGB_LED_TOG(A) nrf_gpio_pin_toggle(A)
#define LED_R_INDEX 0
#define LED_G_INDEX 1
#define LED_B_INDEX 2
.c文件
//===========================================
#define LED_NUMBERS 3
static uint8_t time_id=0;
static uint16_t timer_inter_ms=50;
static uint16_t led_on_ms[LED_NUMBERS], led_off_ms[LED_NUMBERS],led_times[LED_NUMBERS];
static uint8_t led_stat[LED_NUMBERS],led_timer_tick[LED_NUMBERS];
static void led_timer_timeout(void * p_context)
{
uint8_t i;
for(i=0;i<LED_NUMBERS;i++)
{
led_timer_tick[i]++;
}
}
APP_TIMER_DEF(m_led_timer);
void init_led_timer(void)
{
ret_code_t err_code;
uint8_t i;
err_code = app_timer_create(&m_led_timer,
APP_TIMER_MODE_REPEATED,
led_timer_timeout);
APP_ERROR_CHECK(err_code);
for(i=0;i<LED_NUMBERS;i++)
{
led_stat[i]=0;
}
}
void start_timer(bool start_flg,uint8_t p_timer,uint16_t timer_ms)
{
if(start_flg)
{
if(time_id==0)
{
time_id|=p_timer;
timer_inter_ms = timer_ms;
if(time_id)
{
app_timer_start(m_led_timer,
APP_TIMER_TICKS(timer_ms),
NULL);
}
}
time_id|=p_timer;
}
else
{
if(time_id)
{
time_id=time_id&(~p_timer);
if(time_id==0)
{
app_timer_stop(m_led_timer);
}
}
}
}
const uint8_t led_time_id[]=LED_TIMER;
/*
uint8_t led_index,led编号 #define RGB_PIN {LED_R,LED_G,LED_B} 这个一致,0为LED_R 1---LED_G
uint16_t on_ms,一个周期内亮的时间
uint16_t off_ms,一个周期内灭的时间
uint16_t times,周期数
*/
void led_ctrl(uint8_t led_index,uint16_t on_ms,uint16_t off_ms,uint16_t times)
{
led_on_ms[led_index]=on_ms/50;
led_off_ms[led_index]=off_ms/50;
led_times[led_index]=times;
led_stat[led_index]=0;
start_timer(true,led_time_id[led_index],50);
led_timer_tick[led_index]=0;
}
void led_timer_manage(void)
{
uint8_t i;
uint8_t index_pin[]=RGB_PIN;
static uint16_t endtick[LED_NUMBERS];
for(i=0;i<LED_NUMBERS;i++)
{
if((time_id&led_time_id[i])==0) continue;
if(led_timer_tick[i]==0) continue;
led_timer_tick[i]--;
switch(led_stat[i])
{
case 0:
if(led_times[i])
{
endtick[i]=led_on_ms[i];
RGB_LED_ON(index_pin[i]);
if(endtick[i]==0)
endtick[i]=1;
led_stat[i]++;
}
break;
case 1:
endtick[i]--;
if(0==endtick[i])
{
endtick[i]=led_off_ms[i];
if(endtick[i]==0)
endtick[i]=1;
RGB_LED_OFF(index_pin[i]);
led_stat[i]++;
}
break;
case 2:
endtick[i]--;
if(0==endtick[i])
{
led_times[i]--;
if(0==led_times[i])
{
led_stat[i]=0;
start_timer(false,led_time_id[i],50);
RGB_LED_OFF(index_pin[i]);
break;
}
else
{
endtick[i]=led_on_ms[i];
RGB_LED_ON(index_pin[i]);
led_stat[i]=1;
}
}
break;
}
}
}
//================================================
网友评论