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

📄 interupt.h

📁 该程序是基于PC104的工控板的多参数监护仪的源程序.监护内容包含:心电血氧呼吸无创血压等等.
💻 H
📖 第 1 页 / 共 2 页
字号:
		  if(i==2){
			   temp0=0;
			   for(j=0;j<3;j++)
			   	temp0=temp0+rxdbuf1[(ptr+j+2)&RXD2BUFNUM];
			   temp1=(unsigned char)(temp0&255);
			   if(temp1==curdat){
			   	Tempdata=rxdbuf1[(ptr+3)&RXD2BUFNUM];
				switch(rxdbuf1[(ptr+2)&RXD2BUFNUM]){
				    case 0x01://启动血压测量
					key_code=F4_K;
				    	break;
				    case 0x02://取消血压测量
				        if(NIBPStatus&0x01)
						key_code=F4_K;
					break;
				    case 0x04://读存储器
				    	//com1str[2]=0x04;
					//com1str[3]=Tempdata;//第几组
					//com1str[4]=0;
					//com1str[5]=(com1str[2]+com1str[3]+com1str[4])&255;//sum
					//com1count=0;
					break;
				    case 0x05://写存储器	
				    	//com1str[2]=0x05;
					//com1str[3]=Tempdata;//所写地址
					//com1str[4]=rxdbuf1[(ptr+4)&RXD2BUFNUM];//写入值
					//com1str[5]=(com1str[2]+com1str[3]+com1str[4])&255;//sum
					//com1count=0;
					break;
				    case 0x08://心电控制
				    	CenterECGsta=Tempdata;
					SECLEAD->value=Tempdata&0x07;
					if(SECLEAD->value>=0x07) SECLEAD->value=V_I;
					if(SECLEAD->value==MAINLEAD->value){
					   	MAINLEAD->value=(MAINLEAD->value+1)%(V_III+1);
					}
					LeadStr2=VAL_LEAD[SECLEAD->value];//显示副导联
					ECGSCALE->value=(Tempdata>>3)&0x03;//增益大小
					WORKSTA->value=(Tempdata>>5)&0x03;//工作状态
                                    	break;
				    case 0x09://呼吸控制
				    	CenterRESPscale=Tempdata;
					RESPSCALE->value=Tempdata&0x03;
					break;
				    default:	break;
				}
			   }// sum is right
		  }//head dui
		  rxdptr1++;
		  rxdptr1&=RXD2BUFNUM;
	 }
	 outportb(PORT,EOI);		//allow interrupt
	 (*oldIQR3)();
	 in_out=inportb(0x21);
	 in_out&=0x0e7;
	 outp(0x21,in_out);
	 outportb(PORT,EOI);
	 enable();
}//com2


#define T_BASE 0x40  //时钟中断端口
#define TIME_CON1 0xf8//0xc0	
#define TIME_CON2 0x5c//0x07
//1.19M=0x122870
//if加速50倍:(1.19M/0x051e) / (1.19M/0xffff) =50,50*18.2=910 times/s 0x051e
//18.2=1.19M/0xffff
//50=1.19M/0x5cf8 50 times/s,0x5cf8 accelerate 0xffff/0x5cf8 = 2.7535 times
//初始时钟中断频率
//加速600倍:(1.19M/0x07c0)
void InitINT8(void){
	disable();
	outport(T_BASE+3,0x36);
	outportb(T_BASE,TIME_CON1);
	outportb(T_BASE,TIME_CON2);
	enable();
}

//恢复时钟中断频率
void RecINT8(void){
	disable();
	outport(T_BASE+3,0x36);
	outportb(T_BASE,0xff);
	outportb(T_BASE,0xff);
	enable();
}
#undef T_BASE
#undef TIME_CON1
#undef TIME_CON2

void interrupt newIQR8(){
//65535 / 23800 = 13107 / 4760
#define OLDTIMETIC 13107
#define NEWTIMETIC 4760
static int SC=0;//SC控制演示时脉博声

static int TimeTicCnt=0;
unsigned char temp3, tempECG_II[4], tempECG_V[4];

////static char comzj=20;//发送指针,为20表示不可发
	//模拟时的发送包
////static unsigned char com2str[12]={0x55,0xaa,0xff,0,0,0,0,0,0,0,0,0xff};//发送缓冲数据块二,转发demo缓冲
////static unsigned char comstrstatus1=0;//用于决定数据包中DATA的含义
////unsigned int SendTimer;
static unsigned char bjsoundjsq=0;

if(MONDEMO->value==V_DEMO){//demo
	
	int Index1, Index2, Index3;
	char scale;
	////com2str[3]=comstrstatus1;
        ////if(comstrstatus1>0x10)comstrstatus1=0;
	////switch(comstrstatus1){
		////case 0x00:com2str[4]=SECLEAD->value|((ECGSCALE->value)<<3)|((WORKSTA->value)<<5)|0x80;
			  ECGStatus=0x0;
			////break;
		////case 0x01:com2str[4]=7;
			SPO2Status=0;
			////break;
		////case 0x02:com2str[4]=NIBPStatus;
			////break;
		////case 0x03:com2str[4]=\
			  HRrate=69;
			////break;
		////case 0x04:com2str[4]=\
			  PRrate=68;
			////break;
		////case 0x05:com2str[4]=67;break;
		////case 0x06:com2str[4]=\
			 STvalue=-2;
			 ////break;
		////case 0x07:com2str[4]=\
			 SPO2value=99;
			 ////break;
		//袖带压力/2 mmHg
		////case 0x08:com2str[4]=90;break;
		////case 0x09:com2str[4]=\
			  disSYST=120;
			  ////break;
		////case 0x0a:
			 ////com2str[4]=\
			 disDIAS=75;
			 ////break;
		////case 0x0b:com2str[4]=\
			 disMEAN=90;
			 ////break;
		////case 0x0c:
			 RESPvalue=20;
			 if(RESPCHK->value==V_OFF)RESPvalue=255;
			  ////com2str[4]=RESPvalue;
			  ////break;
		////case 0x0d:com2str[4]=175;
			  if(TEMP1CHK->value==V_OFF)
			  	TEMP1value=455;
			  else	TEMP1value=375;////com2str[4]+200;
			  ////break;
		////case 0x0e:com2str[4]=RESPSCALE->value;break;
		//case 0x0f:com2str[4]=173+TEMP2REVISE->value;
			  if(TEMP2CHK->value==V_OFF)
			  	TEMP2value=455;
			  else	TEMP2value=373;////com2str[4]+200;
			  //break;
		//case 0x10:com2str[4]=ECGStatus=0x00;break;
	////}//end switch
	////comstrstatus1++;
	
	Index1=(Edw_cus+1)%ECGN;
	Index2=(Edw_cus+2)%ECGN;
	Index3=(Edw_cus+3)%ECGN;

	////com2str[5]=\
	*(ECGdata[V_I]+Edw_cus)=((ECGWI[Edw_cus]-64)/ScaleAndWave+64)<<1;
	////com2str[6]=\
	*(ECGdata[V_I]+Index1)=((ECGWI[Index1]-64)/ScaleAndWave+64)<<1;
	////com2str[7]=\
	*(ECGdata[V_I]+Index2)=((ECGWI[Index2]-64)/ScaleAndWave+64)<<1;
	////com2str[8]=\
	*(ECGdata[V_I]+Index3)=((ECGWI[Index3]-64)/ScaleAndWave+64)<<1;

	tempECG_II[0]= *(ECGdata[V_II]+Edw_cus)=((ECGWII[Edw_cus]-64)/ScaleAndWave+64)<<1;
	tempECG_II[1]=*(ECGdata[V_II]+Index1)=((ECGWII[Index1]-64)/ScaleAndWave+64)<<1;
	tempECG_II[2]=*(ECGdata[V_II]+Index2)=((ECGWII[Index2]-64)/ScaleAndWave+64)<<1;
	tempECG_II[3]=*(ECGdata[V_II]+Index3)=((ECGWII[Index3]-64)/ScaleAndWave+64)<<1;

	tempECG_V[0]=*(ECGdata[V_V]+Edw_cus)=((ECGWV[Edw_cus]-64)/ScaleAndWave+64)<<1;
	tempECG_V[1]=*(ECGdata[V_V]+Index1)=((ECGWV[Index1]-64)/ScaleAndWave+64)<<1;
	tempECG_V[2]=*(ECGdata[V_V]+Index2)=((ECGWV[Index2]-64)/ScaleAndWave+64)<<1;
	tempECG_V[3]=*(ECGdata[V_V]+Index3)=((ECGWV[Index3]-64)/ScaleAndWave+64)<<1;
	
	/*---------------------------------------------------------------------*
	switch(SECLEAD->value){
		case	V_I:	break;//I 导联已经直接写入了;
		case	V_II:	com2str[5]=tempECG_II[0]; com2str[6]=tempECG_II[1];
				com2str[7]=tempECG_II[2]; com2str[8]=tempECG_II[3];
				break;
		case	V_III:	com2str[5]=127+tempECG_II[0]-com2str[5];
				com2str[6]=127+tempECG_II[1]-com2str[6];
				com2str[7]=127+tempECG_II[2]-com2str[7];
				com2str[8]=127+tempECG_II[3]-com2str[8];
				break;
		case	V_aVR:	com2str[5]=254-((tempECG_II[0]+com2str[5])>>1);
				com2str[6]=254-((tempECG_II[1]+com2str[6])>>1);
				com2str[7]=254-((tempECG_II[2]+com2str[7])>>1);
				com2str[8]=254-((tempECG_II[3]+com2str[8])>>1);
				break;
		case	V_aVL:	com2str[5]=63+((com2str[5]-tempECG_II[0])>>1);
				com2str[6]=63+((com2str[6]-tempECG_II[1])>>1);
				com2str[7]=63+((com2str[7]-tempECG_II[2])>>1);
				com2str[8]=63+((com2str[8]-tempECG_II[3])>>1);
				break;
		case	V_aVF:	com2str[5]=63+((tempECG_II[0]-com2str[5])>>1);
				com2str[6]=63+((tempECG_II[1]-com2str[6])>>1);
				com2str[7]=63+((tempECG_II[2]-com2str[7])>>1);
				com2str[8]=63+((tempECG_II[3]-com2str[8])>>1);
				break;
		case	V_V:	com2str[5]=tempECG_V[0];
				com2str[6]=tempECG_V[1];
				com2str[7]=tempECG_V[2];
				com2str[8]=tempECG_V[3];
				break;
	}
	/*-----------------------------------------------------------------*/
	////com2str[9]=\
	PLETHdata[Edw_cus]=PLETHW[Edw_cus];
	PLETHdata[Index1]=PLETHW[Index1];
	PLETHdata[Index2]=PLETHW[Index2];
	PLETHdata[Index3]=PLETHW[Index3];
	
	SpdCtrl=!SpdCtrl;  SpdCount++;
	if(SpdCtrl){
		Edw_cus=Index3;	SC+=3;
	}else{
		if(SpdCount==SPD_CTRL_NUM){
			Edw_cus=Index3;  SC+=3;  SpdCount=0;
		}else{
			Edw_cus+=4;  if(Edw_cus>=ECGN)	Edw_cus=0;
			SC+=4;
		}
	}
		
	////com2str[10]=\
	*(RESPdata+Rdw_cus)=RESPW[Rdw_cus];
	Rdw_cus++;  if(Rdw_cus>=RESPN)Rdw_cus=0;
	
	//com2str[11]=(0xff+com2str[3]+com2str[4]+com2str[5]+com2str[6]+com2str[7]+com2str[8]+com2str[9]+com2str[10])&255;//SUM
        //发模拟包
	//SendTimer=comzj=0;
	//while(comzj<12&&SendTimer<1000){//sendcom2
		//SendTimer++;
		//temp3=inportb(0x2fd);
		//if((temp3&0x20)==0x20){
			//outportb(0x2f8,com2str[comzj]);
			//comzj++;
		//}
	//} //comzj<20
        //模拟下脉搏声
        
        
	if(SC>=ECGN)SC=0;
	
	if(PulseSound==V_ON){//if pulse sound open
 	    if(SC>30&&SC<40){
		if(alarmsound<=0xc000)	//no alarm sound
			sound(1000);
	    	heartsta=V_HEARTBIG;
	    }else{
	    	if(alarmsound<=0xc000)	//no alarm sound
	    		nosound();
	    	heartsta=V_HEARTSMALL;
	    }
   	}else{
   	    if(SC>30&&SC<40){
   		heartsta=V_HEARTBIG;
   	    }else{
   		heartsta=V_HEARTSMALL;
   	    }
   	    if(alarmsound<=0xc000)	//no alarm sound
	    	nosound();
   	}//end if(pulsesound==V_ON)
	TimeTicCnt += NEWTIMETIC;
	if(TimeTicCnt>=OLDTIMETIC){
		TimeTicCnt-=OLDTIMETIC;
		(*oldIQR8)();
		bjsoundjsq++;if(bjsoundjsq>=20)bjsoundjsq=0;//用于控制发音节奏
		if(alarmsound>0xc000){//由报警控制,发报警音
			if(bjsoundjsq==2){
				switch(ALARMTONE->value){//(*bjydiao)用于菜单控制报警音调
					case 0://low
						sound(500);
						break;
					case 1://mid
						sound(1300);
						break;
					case 2://high
						sound(900);
						break;
				}//switch
			}//bjsoundjsq==2
			else if(bjsoundjsq==7){sound(400);}
			else if(bjsoundjsq>10)nosound();
		}//由报警控制,发报警音
		if(keydelay)keydelay--;
		if(disdelay)disdelay--;
	}else//cort!=0
		outportb(PORT,EOI);
}else{//monitor监护模式
	(*oldIQR8)();
	bjsoundjsq++;if(bjsoundjsq>=20)bjsoundjsq=0;//用于控制发音节奏
	if(alarmsound>0xc000){//由报警控制,发报警音
		if(bjsoundjsq==2){
			switch(ALARMTONE->value){//(*bjydiao)用于菜单控制报警音调
				case 0://low
					sound(500);
					break;
				case 1://mid
					sound(1300);
					break;
				case 2://high
					sound(900);
					break;
			}//switch
		}//bjsoundjsq==2
		else if(bjsoundjsq==7){sound(400);}
		else if(bjsoundjsq>10)nosound();
	}//由报警控制,发报警音
	if(keydelay>=6)keydelay-=2;
	else if(keydelay>0)keydelay--;
	if(disdelay)disdelay--;
}//END monitor
return;
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -