⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djktime.c

📁 LINUX的简单应用
💻 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 + -