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

📄 timer.txt

📁 定时器启动必须同时设这两位 启动定时器
💻 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 + -