?? time-int.txt
字號:
// 該程序利用了定時器1的周期中斷功能,每1ms產生一次中斷
#include "register.h"
// 屏蔽中斷程序
void inline disable()
{
asm(" setc INTM");
}
// 開總中斷程序
void inline enable()
{
asm(" clrc INTM");
}
// 系統初始化子程序
initial()
{
asm(" setc SXM"); // 符號位擴展有效
asm(" clrc OVM"); // 累加器中結果正常溢出
asm(" clrc CNF"); // B0被配置為數據存儲空間
SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4CLKIN=24M
WDCR=0x0E8; // 不使能看門狗,因為SCSR2中的WDOVERRIDE
// 即WD?の桓次緩蟮娜筆≈滴?,故可以用
// 軟件禁止看門狗
IMR=0x0002; // 允許INT2中斷
IFR=0x0FFFF; // 清除全部中斷標志,"寫1清0"
WSGR=0X00; // 禁止所有的等待狀態
}
// 定時器1的初始化子程序
int timer1int()
{
EVAIMRA=EVAIMRA|0X0080; // 允許定時器1的周期中斷
EVAIFRA=EVAIFRA&0X0080; // 清除定時器1周期中斷標志
T1CON=0X160C; // Timer1為連續增計數模式,預分頻值為64,使用內部時鐘
T1PR=0X0177; // Timer1的周期寄存器的值根據1ms延時和預分頻值確定
T1CNT=0X00; // Timer1的計數器清零
}
// 定時器1周期中斷服務程序
void interrupt T1INT()
{
int flag; // 定義一個局部變量
flag=EVAIFRA&0X0080;
if(flag!=0x0080)
{
enable( ); // 允許總中斷
return; // 如果不是定時器1周期中斷,則直接返回
}
// 如果是定時器1周期中斷定時器1的周期中斷,則執行下面的程序
T1CNT=0X00; // 定時器1的計數器重新賦0
EVAIFRA=EVAIFRA&0X0080; // 清除定時器1周期中斷標志,否則以后的中斷將被忽略
enable( ); // 允許總中斷,因一進中斷服務程序后總中斷就自動關閉了
return; // 中斷返回
}
// 其它優先級的中斷服務程序,雖然程序中已經禁止,
// 但可能由于干擾會引起他們的執行,故該中斷服務程序無額外操作,直接返回
void interrupt nothing()
{
enable( ); // 允許總中斷,因一進中斷服務程序后總中斷就自動關閉了
return; // 中斷返回
}
// 主程序
main()
{
disable(); // 初始化時禁止中斷
initial(); // 系統初始化
timer1int(); // 定時器1的初始化
enable(); // 允許總中斷
T1CON=T1CON|0X0040; // 啟動Timer1
while(1)
{
; // 等待中斷發生
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -