hi 有没有什么都爱吃的隔壁小孩,今天介绍一个功能模块,做啥用的呢?
比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止
比如控制蜂鸣器(有点意思了)需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。
本模块的名字叫twinkle
本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。
为什么叫时驱函数?我也说不上来,在头大的代码里面找到一个中文注释看到了。
这个函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数
头文件 定义这个结构体 实例一个对象
#ifndef _Twinkle_H_
#define _Twinkle_H_
#include "sys.h"
typedef struct
{
uint8_t pin;
uint32_t timeCnt;
uint8_t mode;//
uint8_t openFlag;
int cnt;
int flashCnt;
uint32_t delayTime;//
uint32_t openTime;//
uint32_t closeTime;//
}twinkleType;
typedef enum
{
BLINK_OPEN_INIT,
BLINK_OPEN_DELAY,
BLINK_OPEN_NOW,
BLINK_OPEN_ALWAYS,
}TwinkleOpenType;
void twinkle_timer_isr( twinkleType *p );
void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
extern twinkleType JustTesk;
#endif
模块完成功能 其实就是一个后台函数 一个前台丢参数的函数。在OPEN的时候做什么?在CLOSE的时候做什么?可以自己写
现在为了简单就是找了宏定义灯的开关。
#include "twinkle.h"
#include "Initialise.h"
enum
{
FALSE,
TRUE
};
twinkleType JustTesk;
void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
{
p->timeCnt = 0;
p->mode = Mode;
if( p->mode == BLINK_OPEN_DELAY)
{
p->openFlag = FALSE;
}
else
{
p->openFlag = TRUE;
}
p->cnt = 0;
p->flashCnt = OpenCnt;
p->delayTime = DelayTime;
p->openTime = OpenTime;
p->closeTime = CloseTime;
}
void twinkle_timer_isr( twinkleType *p )
{
if(p->mode == BLINK_OPEN_DELAY)
{
if(p->timeCnt++ > p->delayTime)
{
p->timeCnt = 0;
p->openFlag = TRUE;
p->mode = BLINK_OPEN_INIT;
}
}
//上面的是扩展功能 主要是下面//
if(p->openFlag == TRUE)
{
if( p->timeCnt ++ < p->openTime)
{
//pin_ops.pin_write(p->pin , PIN_HIGH);
TS_LED1_ON() ;
}
else
{
//pin_ops.pin_write(p->pin , PIN_LOW);
TS_LED1_OFF();
}
if( p->timeCnt > p->openTime+p->closeTime )
{
p->timeCnt = 0;
if( p->mode != BLINK_OPEN_ALWAYS)
{
if( ++p->cnt >= p->flashCnt)
{
p->openFlag = FALSE;
}
}
}
}
}
用一下:
后台程序放到OS里面去
while (1)
{
q_msg = (business_msg_t *)OSQPend(business_queue, 100, &err);
if(q_msg == NULL && err == OS_TIMEOUT)
{//空闲轮训 放置一个触控任务吧
do_touch_routine_work();
twinkle_timer_isr(&JustTesk);
}
前面程序 比如按键以后我就该配饰吧 看到灯亮起闪烁5下。
void do_touch_routine_work(void)
{
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN)
{
tp_dev.sta&=~TP_PRES_DOWN;
switch(Tp_Location(tp_dev))
{
case 1:Bt2UI(10,1);
//twinkle_set(&JustTesk ,BLINK_OPEN_NOW ,3 , 5 ,5 ,0);
break;
case 2:Bt2UI(10,2);
//twinkle_set(&JustTesk ,BLINK_OPEN_NOW ,3 , 5 ,0 ,0);
break;
default:
break;
}
}
}