应广单片机主要应用于消费电子,资源有限,只有一个16bit定时器,因此用好T16定时器就非常关键了.可以说是整个单片机系统的核心配置
不说那么多了,直接上代码.
BIT LED_G : PA.3;
#define GRE_LED_FLASH {if(LED_G){LED_G=0;}else{ LED_G=1;}}
/*****************LED*******************/
word ucFlashTmrCnt;
BIT ubMsFlag;
/****************系统时钟*********************/
bit FLAG_NMS;
byte count;
word usTmrCnt;
/**************T16*************************/
void TIME16_Init(void)
{
/*设置计数值*/
usTmrCnt=488;
ubMsFlag=0;
/*定时器配置*/
$ T16M IHRC,/1,BIT11;
INTEN.T16 =1;/*开启定时中断*/
Intrq.T16 =0;/*清除中断请求*/
}
void UpdateLedTmr(void)
{
/*1ms进行一次计数*/
ucFlashTmrCnt++;
if(ucFlashTmrCnt>250)
{
ucFlashTmrCnt=0;
/*闪灯*/
GRE_LED_FLASH;
}
}
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/8, IHRC=16MHz, VDD=3.0V;
$ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
/*上电延时*/
.delay 40000;
/*端口配置*/
$ LED_G OUT,HIGH;
/*定时器配置*/
TIME16_Init();
ENGINT //全局中断开启
while (1)
{
wdreset;
/*1ms定时时间到*/
if ( FLAG_NMS )
{
UpdateLedTmr();
/*清除标记*/
FLAG_NMS=0;
}
}
}
void Interrupt ( void )
{
pushaf;
if ( Intrq.T16 )
{
Intrq.T16 = 0;
/*重新设置计数值*/
STT16 usTmrCnt;
if ( count>0 )
{
count--;
}
else
{
count = 9;
/*1ms*/
FLAG_NMS= 1;
}
}
popaf;
}