本帖最后由 逍遥派掌门 于 2013-10-31 00:02 编辑
此版本适用于任何型号的PIC芯片,只要RAM和ROM足够即可。
如何知道RAM和ROM是否够用呢?这么简单的问题就不用浪费字数。
仍然使用CCS编译器。
直接上菜:
1、ptask.h// 最大任务数
#define MAXTASKS 3
// 信号槽
int16 Timers[MAXTASKS];
// 调度开始
#define BEGIN_TASK(TaskName) int8 TaskName(){ static int8 lc; switch(lc){case 0:
// 调度结束
#define END_TASK } lc = 0; return 0;}
// 任务内延时
#define Wait(Ticks) {lc = __LINE__; return Ticks; } case __LINE__:
// 装配任务
#define RunTask(TaskName, TaskID) { if (Timers[TaskID] == 0){ Timers[TaskID] = TaskName(); }}
// 调用子程序
#define CallSub(SubTaskName) {lc = __LINE__; case __LINE__:{ int8 subTime = SubTaskName(); if(subTime) return subTime;}}
// 调度
#define UpdateTimers() int8 i; for(i = MAXTASKS; i > 0; i--){ if(Timers[i-1]) Timers[i-1]--; }
2、main.h
#include <16C61.h>
#FUSES NOWDT //Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PROTECT //Code protected from reads
#use delay(clock=4000000)
3、main.c
#include "main.h"
#include "Ptask.h" // 调度相关的定义
#define LED1 PIN_A0
#define LED2 PIN_A1
#define LED3 PIN_A2
// 可根据实际的需要调用不同的延时函数
#define time_devide(tick) delay_us(tick)
////////// 任务1 //////////
BEGIN_TASK(Task1)
static boolean i;
i=~i;
output_bit(LED1,i);
Wait(100);
END_TASK
////////// 任务2 //////////
BEGIN_TASK(Task2)
static boolean i;
i=~i;
output_bit(LED2,i);
Wait(2000);
END_TASK
////////// 任务3 //////////
BEGIN_TASK(Task3)
static boolean i;
i=~i;
output_bit(LED3,i);
Wait(30000);
END_TASK
void main()
{
for(;;)
{
// 将任务0,1,2 分别装到信号槽 0,1,2里
RunTask(task1,0);
RunTask(task2,1);
RunTask(task3,2);
UpdateTimers(); // 任务调度
time_devide(10); // 可根据需要进行调整
}
}
接上LED的实测效果与定时器版本是一样的。
|