?? 836demo7.c
字號:
/**********************************************************************/
/* This program is for PCL-836 Rev. A1 interrupt test. */
/* Connect int_input to digital out D0 int_enable to digital out D1 */
/**********************************************************************/
#include <dos.h>
#include <stdio.h>
#include <bios.h>
#include <conio.h>
#include <stdlib.h>
#define BYPASS 0
#define FILTER_ON 1
#define INTERNAL 2
#define PWM_MODE 3
void interrupt (*old_handler)(void); /* old interrupt handler */
void interrupt (*temp_handler)(void);
void interrupt int_do(void); /* interrupt service routine */
void init_INT(void);
int baseI=0x240; /* I/O base address */
int irqI=5; /* Interrupt number */
int intf=0;
unsigned dl=0xAA;
void main(void)
{
char key;
unsigned max_count;
unsigned i;
int c1_mode,c2_mode,c3_mode;
int c4_mode,c5_mode,c6_mode;
unsigned c1,c2,c3,c4,c5,c6;
init_INT(); /* Initialize interrupt */
clrscr();
printf("PCL-836 Rev.A1 interrupt test program \n\n");
printf("Connect int_input to digital out D0 and ");
printf("int_enable to digital out D1\n");
printf("Press '0' or '1' to control digital output D0 ,'q' to quit program !\n");
printf("When int_input goes from '0'(low) to '1'(high) , it genrates a interrupt 5\n");
printf("Interrupt service routine will produce beep sound!");
for(;;){
while(bioskey(1)==0);
key=bioskey(0);
gotoxy(40,1);
printf("%c",key);
if (key=='q') break;
else if (key=='1')
outportb(baseI+0x10,0x03);
else if (key=='0')
outportb(baseI+0x10,0x02);
if (intf==1) intf=0;
}
setvect(irqI+8,old_handler);
}
void init_INT(void)
{
int int_mask;
/*------------------------------*/
/* step0: DISABLE PC INTERRUPT */
/*------------------------------*/
disable();
if (irqI<8) {
/*-------------------------------*/
/* step5: STORE OLD INT. HANDLER */
/*-------------------------------*/
old_handler=getvect(irqI+8);
/*------------------------------*/
/* step6: SET INTERRUPT VECTOR */
/*------------------------------*/
setvect(irqI+8,int_do);
temp_handler=getvect(irqI+8);
/*------------------------------*/
/* step7: ENABLE 8259 INT. MASK */
/*------------------------------*/
int_mask=inportb(0x21)&~(0x01<<irqI);
outportb(0x21,int_mask); }
else {
/*-------------------------------*/
/* step5: STORE OLD INT. HANDLER */
/*-------------------------------*/
old_handler=getvect(irqI+0x68);
/*------------------------------*/
/* step6: SET INTERRUPT VECTOR */
/*------------------------------*/
setvect(irqI+0x68,int_do);
//temp_handler=getvect(IRQ_NO+0x68);
/*------------------------------*/
/* step7: ENABLE 8259 INT. MASK */
/*------------------------------*/
//IRQ_NO = IRQ_NO-8;
int_mask=inportb(0xa1)&~(0x01<<(irqI-8));
outportb(0xa1,int_mask); }
/*------------------------------*/
/* step8: ENABLE PC INTERRUPT */
/*------------------------------*/
enable();
}
/**************************************************************/
/* INTERRUPT SERVICE ROUTINE */
/**************************************************************/
void interrupt int_do(void)
{
disable();
gotoxy(45,1);
printf("Interrupt occur!!\a");
delay(100);
gotoxy(45,1);
printf(" ");
outportb(0x20,0x20);
outportb(0xA0,0x20);
enable();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -