這個好處就是 : 不用每次把時間數值寫在中斷裡
// 0.001秒(1ms) : 65535-((16M/12)*0.001s)=65535-1333=64202(FACA)
// 0.01秒(10ms) : 65535-((16M/12)*0.01s)=65535-13333=52202(CBEA)
// 0.03秒(30ms) : 65535-((16M/12)*0.03s)=65535-40000=25535(63BF)
// 0.049秒(49ms) : 65535-((16M/12)*0.049s)=65535-65333=202(00CA)
#include <SN8F5703.h>
bit f = 0; // 標誌位
void Timer2ISR(void) interrupt ISRTimer2 // Vector @ 0x1B
{
TF2 = 0; // Clear Timer2 overflow flag
f = 1;
}
void main(){
// ----------------------------
// 設定 MCU 主頻
CLKSEL = 0x06; // Fcpu = 32M/2 = 16M
CLKCMD = 0x69; // 套用並設定 CLKSEL 的值
CKCON = 0x30;
// ----------------------------
// Timer 0 初始化
// Timer 2 預設就是 16bit 模式,所以不用像 Timer0+1 設置 TMOD
T2CON = 0x11; //Fclk = Fcpu/12 = 16M/12 (設定自動重裝)
CRCH = 0xFA; // 溢位時自動將數值給 TH2 (自動重裝)
CRCL = 0xCA; // 溢位時自動將數值給 TL2 (自動重裝)
ET2 = 1; // 啟用 Time 2 中斷
// ----------------------------
// 啟用全局中斷
EAL = 1;
// ----------------------------
// GPIO 初始化
P0M = 0xFF; // 把 P0x 設置輸出
P0UR = 0x00; // 禁用上拉電阻
while(1){
WDTR = 0x5a; // 清看門狗
if(f==1){
f = 0;
P03 = !P03; // 輸出
}
}
}