代码部分:
#include "extern.h"
bit LED1 : PA.5 //定义LED灯的引脚
bit LED2 : PA.3 //定义LED灯的引脚
bit LED3 : PA.4 //定义LED灯的引脚
bit LED4 : PA.0 //定义LED灯的引脚
byte time_10ms;
word reload_T16;
byte time_01ms;
byte PWM=5;
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/4, IHRC=16MHz, VDD=5V;
$ LED1 out,high; //初始把灯点亮(高电平点灯)
$ LED2 out,high;
$ LED3 out,high;
$ LED4 out,high;
$ T16M SYSCLK,/1,bit10; //T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);
//时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, EOSC, ILRC, PA0_F;分频器可选择/1, /4, /16, /64
//中断源可选择BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
// reload_T16 = 1024 - 625; //每次进中断为10ms;0.625ms
// //计算公式为 [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(1M/16)]*(2^10-(1024-625))=0.01s
reload_T16 = 1024 - (400-1); //每次进中断为10ms;1ms
//计算公式为 [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(1M/16)]*(2^10-(1024-625))=0.01s
stt16 reload_T16; //设定计数器初始值reload_T16,当计数器累加超过设定中断源时产生中断;
$ INTEGS BIT_R; //T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。
//使用下面两句时,会关闭其他中断的设置,一般推荐使用对位操作的方法来驱动
// $ INTEN T16; //中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。
// $ INTRQ T16; //中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。
INTEN.T16 = 1; //中断允许寄存器,开T16中断
// INTEN.T16 = 0; //中断允许寄存器,关T16中断
INTRQ.T16 = 0; //中断请求寄存器,清零INTRQ寄存器。
ENGINT; //打开全局中断
time_10ms = 0;
while (1)
{
}
}
void Interrupt (void)
{
pushaf;
if (Intrq.T16)
{ // T16 Trig
// User can add code
stt16 reload_T16; //设定计数器初始值reload_T16
time_10ms++;
if(time_10ms < PWM) //定时两秒
{
//time_10ms = 0;
$ LED1 out,low; //关灯
}
if(time_10ms > PWM) //定时两秒
{
if(time_10ms>=19)
time_10ms = 0;
$ LED1 out,high; //关灯
}
Intrq.T16 = 0;
}
popaf;
}