led控制

作者: 嵌入式工作 | 来源:发表于2019-01-02 10:12 被阅读0次

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;

    }
        
    }

    
}

//================================================

相关文章

网友评论

      本文标题:led控制

      本文链接:https://www.haomeiwen.com/subject/arialqtx.html