下面来说下高通平台3020的呼吸灯的设计,这也是我之前做项目的时候写好的并且已经量产了的。下面就说下代码吧
不多说了,贴代码:
// 呼吸灯进行处理函数
void handleBreathLamp(Task task, MessageId id, Message message);
// 对灯的IO口初始化时需要使用到
#define LED_0_BANK (appConfigLed0Pio() >> 5)
#define LED_0_PIO_MASK (1UL << (appConfigLed0Pio() & 31))
#define LED_1_BANK (appConfigLed1Pio() >> 5)
#define LED_1_PIO_MASK (1UL << (appConfigLed1Pio() & 31))
#define LED_2_BANK (appConfigLed2Pio() >> 5)
#define LED_2_PIO_MASK (1UL << (appConfigLed2Pio() & 31))
// 将呼吸灯处理函数初始成一个task
Led_breath_t Led_breath={{handleBreathLamp}};
// 呼吸灯的开启和关闭
// 开启的有定义是那个灯开始呼吸,还有呼吸的快慢 对应的是 id -> IO delay -> speed
void breathLamp(MessageId id, uint8 delay);
void breathLampOff(void);
// 下面的结构体就定义了调用的task(对应着上面的呼吸灯函数)
typedef struct Led_breath_Struct {
TaskData task;
uint8 id;
uint8 flag;
uint16 dim; /*! user led breath PWD */
uint16 time_delay; /*! user counte times */
uint16 delay_dim_time; /*! user off led time */
bool num_flag; /*! user judge led breath open or off */
}Led_breath_t;
extern Led_breath_t Led_breath;
// 呼吸灯的开启函数
void breathLamp(MessageId id, uint8 delay)
{
// 呼吸灯IO进行初始化 放在普通灯IO口的初始化后面防止被重新初始化
/* LedConfigure(id,LED_ENABLE,1);
LedConfigure(id,LED_FLASH_ENABLE,1);
LedConfigure(id,LED_PERIOD,3); */
Led_breath.id = id;
Led_breath.flag = 1;
Led_breath.time_delay = delay;
Led_breath.dim = 0;
Led_breath.delay_dim_time = 0;
Led_breath.num_flag = TRUE;
//进行呼吸灯task
MessageCancelAll(&Led_breath.task,id);
MessageSendLater(&Led_breath.task, id, 0,10);
}
// 呼吸灯的关闭
void breathLampOff(void)
{
Led_breath.num_flag = FALSE;
MessageCancelAll(&Led_breath.task,0); //取消所有呼吸灯的task 任务
LedConfigure(Led_breath.id,LED_FLASH_ENABLE,0);
LedConfigure(Led_breath.id,0,0);
// 初始化成普通的LED
PioSetMapPins32Bank(LED_1_BANK, LED_1_PIO_MASK, LED_1_PIO_MASK);
PioSetDir32Bank(LED_1_BANK, LED_1_PIO_MASK, LED_1_PIO_MASK);
PioSetMapPins32Bank(LED_0_BANK, LED_0_PIO_MASK, LED_0_PIO_MASK);
PioSetDir32Bank(LED_0_BANK, LED_0_PIO_MASK, LED_0_PIO_MASK);
}
// 对呼吸灯的处理
void handleBreathLamp(Task task, MessageId id, Message message)
{
UNUSED(message);
UNUSED(id);
UNUSED(task);
if (Led_breath.flag == 1) {
if (Led_breath.delay_dim_time != 0) Led_breath.delay_dim_time = 0;
Led_breath.dim += 30;
if(Led_breath.dim > 3000)//3500/2
{
Led_breath.flag = 2;
}
}
else if (Led_breath.flag == 2){
Led_breath.dim -= 30;
if (Led_breath.dim <=30) {
Led_breath.flag = 3;
Led_breath.dim = 0;
}
}
else if (Led_breath.flag == 3) {
Led_breath.delay_dim_time +=10;
if (Led_breath.delay_dim_time > ((Led_breath.time_delay*1000)-3500)) {
Led_breath.delay_dim_time = 0;
Led_breath.flag = 1;
}
}
LedConfigure(Led_breath.id,1,Led_breath.dim);
LedConfigure(Led_breath.id,2,2);
LedConfigure(Led_breath.id,0,1);
MessageSendLater(&Led_breath.task,0, 0,20);
}
呼吸灯的说明就这些了,可以直接拿过去使用。