|
裸奔的时候,
因为在一个子任务当中,
为提高效率,不能傻等,
需要系统定时的情况很多,
处理起来比较麻烦,
如果对系统定时器进行简单的封装,
就会比较方便,
下面的就是我写的一个用系统定时器封装后处理闪烁灯的例子:
main.h:
#ifndef _MAIN_H
#define _MAIN_H
#include
#define MAX_SYSTIMER_COUNT 6
extern unsigned short sysTimer[MAX_SYSTIMER_COUNT];
unsigned char SetSysTimer(unsigned char id,unsigned short value);
unsigned char GetSysTimer(unsigned char id);
#endif
main.c:
#include "main.h"
#include "led.h"
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & CP & CPD & BOREN & IESODIS & FCMEN & LVPDIS & DEBUGEN & WP0 & BORV21 );
unsigned char t0InitValue;
unsigned short sysTimer[MAX_SYSTIMER_COUNT];
////////////初始化timer0//////////////////////
void InitTimer0(void)
{
OPTION = 0x06; //1:128分频
//8M 时钟,10ms定时
t0InitValue = 256-(20000/128); /*256-100=156us,定时10ms = 20000 step/128 = 156.25*/
TMR0 = t0InitValue;
T0IF = 0;
T0IE = 1; //开中断
}
////////////////初始化系统定时/////////////////////////////////
void InitSysTimer(void)
{
unsigned char i;
for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
{
sysTimer[i] = 0;
}
}
//////////////////////系统定时器计数/////////////////////////////
void CountSysTimer(void)
{
unsigned char i;
for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
{
if(sysTimer[i] > 0)
sysTimer[i]--;
}
}
////////////////////设置系统定时器/////////////////////////////////////////
unsigned char SetSysTimer(unsigned char id,unsigned short value)
{
if(id < MAX_SYSTIMER_COUNT)
{
sysTimer[id] = value;
return 1;
}
else
return 0;
}
/////////////////////获取系统定时状态////////////////////////////////////////
unsigned char GetSysTimer(unsigned char id)
{
if(sysTimer[id] == 0)
return 1;
else
return 0;
}
/////////////////系统初始化/////////////////////
void InitSys(void)
{
INTCON = 0; //关闭总中断,禁止外设,timer0,外部,电平中断,清除timer0,外部,电平中断标志
ANSEL = 0;
ANSELH = 0; //所有IO都为数字口
InitLedFlash();
InitSysTimer(); //初始化系统定时器
InitTimer0(); //初始化定时器0
PEIE = 1; //开外设中断
GIE = 1; //开总中断
}
///////////中断函数//////////////
void interrupt ISR(void)
{
if(T0IE && T0IF)
{
CountSysTimer();//系统定时器计数
TMR0 = t0InitValue;
T0IF = 0;
}
}
//////////////////主函数///////////////////////
void main()
{
OSCCON = 0x78;//时钟8M,时钟模式由配置字决定
InitSys();
while(1)
{
FlashLed();
}
}
led.c:
#include "main.h"
#include "led.h"
void InitLedFlash(void)
{
TRISD0 = 0;//输出
}
void FlashLed()
{
if(GetSysTimer(0))
{
RD0 ^= 1;
SetSysTimer(0,100);//100*10ms = 1s
}
} |
|