📄 timer.txt
字号:
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define T1CON 0xff5e // Timer 1 mode/control
#define T1CNT 0xff58 // Timer 1 count
#define T1CMPA 0xff5a // Timer 1 maxcount compare A
#define T1CMPB 0xff5c // Timer 1 maxcount compare B
#define ISR 0xff2c // In-Service Register
//mode/control register
#define TMRCON_CONT 1 // continuous mode
#define TMRCON_ALT 2 // alternate compare
#define TMRCON_EXT 4 // external clock
#define TMRCON_P 8 // prescaler
#define TMRCON_RTG 0x10 // retrigger
#define TMRCON_MC 0x20 //maximum count
#define TMRCON_RIU 0x1000 // register in use
#define TMRCON_INT 0x2000 // interrupt
#define TMRCON_INH 0x4000 // inhibit
#define TMRCON_EN 0x8000 // enable
#define TMRCON_START (TMRCON_EN+TMRCON_INH) //定时器启动必须同时设这两位
/*恢复软中断入口参数*/
#define ENTRY_SOFT_INT(x) \
asm mov ax,seg x;\
asm mov bx,offset x;\
asm mov ds,ax;\
asm mov ax,ds:[bx+2];\
asm mov bx,ds:[bx];\
asm xchg ax,ss:[bp+16];\
asm xchg bx,ss:[bp+14];\
asm mov sp,bp;\
asm pop bp;\
asm pop di;\
asm pop si;\
asm pop ds;\
asm pop es;\
asm pop dx;\
asm pop cx;\
asm retf;
void interrupt (*old_handler)(); //该变量保存原中断入口
int counter = 0; //中断次数记录
int second = 0; //秒记录
void far interrupt timer_int(void) //定时器1的中断服务程序
{
unsigned int ISR_Value; //正在服务的硬件中断
ISR_Value = inport(ISR);
if((ISR_Value & 0x1) != 0) //判断是定时器中断还是软中断
goto HARDINT;
ENTRY_SOFT_INT(old_handler) //恢复软中断参数,并转移到软中断服务程序
HARDINT:
counter ++; //中断次数累计
if(counter >= 0xbf) //每中断0xbf次,?1001.3748ms约为1秒
{ //不要在中断服务程序中调用printf打印
second += 1; //秒累计
counter = 0;
}
switch(second%2)
{
case 0:
outportb(0x113,0x0ef); //liu led work
break;
case 1:
outportb(0x113,0x0df); //liu led comm
break;
case 6:
default:
outportb(0x113,0x0ff); //liu
}
outport(0x20,0x20); //中断应答
}
int main(void)
{
unsigned int OldValue = 0; //临时变量,保存模式寄存器的值
unsigned int OldSecond = 0; //保留上次打印的秒值,用于判断是否更新打印
unsigned char test8=0;
outport(T1CMPA,0xffff); //maxcount commpare
outport(T1CNT,0x0); //INIT counter to 0
old_handler = getvect(0x12); /*保存中断0x12的向量,以便在退出时恢复*/
setvect(0x12, timer_int); /*把中断0x12向量改为timer_int*/
outport(T1CON,TMRCON_INT|TMRCON_CONT|TMRCON_START); //启动定时器,连续模式、产生中断
printf("timer1 start...\n");
enable(); //使能中断
while(!kbhit()) //任意键退出
{ /*
if(OldSecond != second)
{
printf("second = %d\n",second);
OldSecond = second;
printf("press any key exit!\n");
} */
test8= inportb (0x111);
if(test8 != 0xff)
{
printf("test8 = %d\n",test8);
}
}
OldValue = inport(T1CON);
OldValue = (OldValue|TMRCON_INH)&0x7fff; //关闭定时器
outport(T1CON,OldValue);
setvect(0x12, old_handler); //恢复原中断服务程序
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -