LED驱动

产品有4个LED,用作指示作用。LED有3种状态,亮,灭,闪烁。在驱动层,LED之间互不干扰,但是在业务中,可以让某LED亮的同时其他LED灭。业务是多变的,但是驱动是不变的。

#define LED_BLINK_PERIOD 3

enum led_state{
	LED_STA_IDLE,
	LED_STA_ON,
    LED_STA_OFF,
    LED_STA_BLINK,
};

enum led_id
{
	CS_RED_LED,
	CS_GREEN_LED,
	RS_RED_LED,
	RS_GREEN_LED,
	LED_NUM
};

struct led_device 
{
	uint8_t  id;
	uint8_t  state;
	uint16_t  delay;
	void(*led_on)(uint8_t);
};

static void cs_red_led_on (uint8_t val) 
{
}
static void cs_green_led_on (uint8_t val) 
{
}
static void rs_red_led_on (uint8_t val) 
{
}
static void rs_green_led_on (uint8_t val) 
{
}

static struct led_device led[LED_NUM]=
{
	{ CS_RED_LED,   LED_STA_IDLE, 0, cs_red_led_on },
	{ CS_GREEN_LED, LED_STA_IDLE, 0, cs_green_led_on },
	{ RS_RED_LED,   LED_STA_IDLE, 0, rs_red_led_on },
	{ RS_GREEN_LED, LED_STA_IDLE, 0, rs_green_led_on },
};

//用户调用这个接口设置LED的状态
void set_led_state( uint8_t id, uint32_t sta )
{
	struct led_device* pled = NULL; 

	if ( id < LED_NUM )
	{
		pled = &led[id];	    
	    pled->delay = 0;
		pled->state = sta;
	}   
}

//周期性调用,100ms调用一次
void led_task( )
{
	uint8_t i;
	struct led_device* pled = NULL;
	
	for (i = 0; i < LED_NUM; ++i)
	{
		pled = &led[i];
		
		switch( pled->state ) 
		{
			case LED_STA_IDLE: 		
				break;
		
			case LED_STA_ON: 
				if( pled->led_on )
				{
					pled->led_on(1);	
					pled->state = LED_STA_IDLE;
				}
				break;

			case LED_STA_OFF: 
				if( pled->led_on )
				{
					pled->led_on(0);	
					pled->state = LED_STA_IDLE;
				}
				break;
				
			case LED_STA_BLINK: 
				pled->delay++;
				if( pled->delay == LED_BLINK_PERIOD )
				{
					if( pled->led_on )
					{
						pled->led_on(1);	
					}
				}
				else if( pled->delay == LED_BLINK_PERIOD * 2 )
				{
					pled->delay = 0;
					if( pled->led_on )
					{
						pled->led_on(0);	
					}
				}
				break;
		
			default:
				break;
		}
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值