时驱函数炸至金黄,老人小孩都爱吃,隔壁小孩馋到哭

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;                                    
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/81136087