📄 djktime.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <string.h>
#define COUNTDOWN 1
#define IntEoiReg 0xFF22 //End-of-Interrupt Register
#define IntMaskReg 0xFF28 //Interrupt Mask Register
#define AMDTimer0CntReg 0xFF50 //AMDTimer0 Count Register
#define AMDTimer2CntReg 0xFF60 //AMDTimer2 Count Register
#define AMDTimer0CmpRegA 0xFF52 //Timer0 Compare Register A
#define AMDTimer2CmpRegA 0xFF62 //Timer2 Compare Register A
#define AMDTimer0Intr 0x0008 //AMDTimer1 Interrupt Number
#define AMDTimer0Eoi 0x0008 //AMDTimer0 EOI
extern void my_int(void);
static void (interrupt far* oldfunc)(void);
static unsigned int delayct;
static unsigned long counter_limit=18;
unsigned int timer=0;
void set_time(int tms)
{
counter_limit=(unsigned long)(tms/COUNTDOWN);
}
/*static void my_int(void)
{
static int intnum=0;
unsigned char bOut1;
bOut1=1;
outportb(BASEIO,bOut1<<(intnum++));
if(intnum>=8)
intnum=0;
printf("1s int\n");
}*/
static void interrupt far time_interrupt()
{
static long counter=0;
//static unsigned int syscounter=0;
disable();
// syscounter++;
counter++;
delayct++;
timer++;
if(counter>=counter_limit)
{
counter=0;
my_int();
//printf("Syscounter=%f\n",syscounter);
}
/* if(syscounter>=128) // 65536/COUNTDOWN
{
syscounter=0;
oldfunc();
//printf("counter=%d\n",counter);
}
else*/
outport(IntEoiReg,AMDTimer0Eoi); //中断结束标志送中断结束寄存器
enable();
}
void init_timer(int tms)
{
int mask;
disable();
oldfunc = getvect(AMDTimer0Intr);
set_time(tms);
mask=inport(IntMaskReg); //0xff28为中断屏蔽寄存器,取原向量
mask&=0xfffc;
outport(IntMaskReg,mask); //打开定时中断屏蔽位,允许IRQ0; 在定时设置时,以上三句可以不要,因为该位系统初始化就为0
outport(AMDTimer0CntReg,0x0); //ff50为计数器0的当前计数寄存器,因为是加1计数,初始化为0,从0开始计数,否则是个不确定值
outport(AMDTimer2CntReg,0x0); //ff60为计数器2的当前计数寄存器,初始化为0
outport(AMDTimer2CmpRegA,0x2710); //ff62为计数器2的计数比较寄存器A,用于放计数的最大值,此为十进制10000,
//计数器2的工作频率为10Mhz(1/4CPU),此处即为1ms
outport(AMDTimer0CmpRegA,COUNTDOWN); //ff52为计数器0的计数比较寄存器A,此为1,1ms,
setvect(AMDTimer0Intr,time_interrupt); //设定中断服务程序的入口地址
enable();
}
void close_timer(void)
{
disable();
outport(AMDTimer0CntReg,0x0); //ff50为计数器0的当前计数寄存器,因为是加1计数,初始化为0,从0开始计数,否则是个不确定值
outport(AMDTimer2CntReg,0x0); //ff60为计数器2的当前计数寄存器,初始化为0
outport(AMDTimer2CmpRegA,1000); //ff62为计数器2的计数比较寄存器A,用于放计数的最大值
//计数器2的工作频率为10Mhz(1/4CPU),此处即为0.1ms
outport(AMDTimer0CmpRegA,182); //ff52为计数器0的计数比较寄存器A,此为182,18.2ms,
setvect(AMDTimer0Intr, oldfunc);
enable();
}
void my_delay(int tms)
{
unsigned int tlim;
tlim=(unsigned int)(tms/COUNTDOWN);
delayct=0;
while(delayct<tlim)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -