📄 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 + -