📄 intead.cpp
字号:
#include<dos.h>
#include<stdio.h>
#include<conio.h>
int choose_channel();
#ifdef __cplusplus //if in C++ mode
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
int flag = 0;
int pa=999;
void interrupt handler(__CPPARGS) //数据采集中断服务程序
{
disable();
flag =1;
outportb(0xa0,0x62);//向从片8259发EOI命令
outportb(0x20,0x20);//向主片8259发EOI命令
enable();
}
void main(void)
{
int ch,i,status;
void interrupt (*oldhandler)(__CPPARGS);
clrscr();
printf("Please input the a/d channel NO(0--7):");
ch=choose_channel();
printf("During the process, press any key to exit!\n");
outportb(0x303,0x88); //初始化8255
outportb(0x300,ch); //送通道号
outportb(0x303,0x03); //pc1置1锁存地址
delay(50);
outportb(0x303,0x02);
oldhandler=getvect(0x72);//获取原中断向量
setvect(0x72,handler);//设置新中断向量
//enable();
status=inportb(0xa1);
outportb(0xa1,status&0xfb);//打开IRQ10(OCW1)
status=inportb(0x21);
outportb(0x21,status&0xfb);//打开IRQ2(OCW1)
delay(100);
outportb(0x303,0x98);//重新初始化8255
outportb(0x303,0x01); // 使PC0置高*/
delay(50);
outportb(0x303,0x00); // 使PC0置低*/
do
{
if(1 == flag)
{
outportb(0x303,0x05); //*pc2=1,允许读转换结果*/
delay(1);
pa = inportb(0x300);
flag =0;
outportb(0x303,0x01); //*使PC0置高*/
delay(50);
outportb(0x303,0x00); //*使PC0置低*/
printf("%d\n", pa);
}
}while(!kbhit());
setvect(0x72,oldhandler);//恢复原中断向量 status=inportb(0xa1);
outportb(0xa1,status|0x04);//屏蔽IRQ10(OCW1)
status=inportb(0x21);
outportb(0x21,status|0x04);//屏蔽IRQ2*/
}
int choose_channel()
{
int c;
do{
c=getchar();
c=c-48;
if(c<0||c>7) printf("\nThe ad channel NO is wrong! \nBe sure it is between 0 and 7!\nPlease input the NO again!:");
else break;
}while(1);
return(c);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -