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

📄 interrupt.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
字号:

//必须使用连续的8位IO口,且高四位为输出口
//如IOA0-7	IOA0- 3输入	 IOA4 - 7输出
// IOA8-15	IOA8-11输入  IOA12-15输出
// IOB0-7	IOB0- 3输入	 IOB4 - 7输出
// IOB8-15	IOB8-11输入  IOB12-15输出
//			|            |			|          |		  
//IOA7(OUT) |(key0)------|(key1)----|(key2)----|(key3)----(可以是IOA7 IOB7 IOA15 IOB15)
//          |            |          |          |          
//IOA6(OUT)-|(key4)---- -|(key5)----|(key6)----|(key7)----(可以是IOA6 IOB6 IOA14 IOB14)
//          |            |	        |          |		  
//IOA5(OUT)-|(key8)------|(key9)----|(key10)---|(key11)---(可以是IOA5 IOB5 IOA13 IOB13)
//          |            |	        |          |		  
//IOA4(OUT)-|(key12)-- --|(key13)---|(key14)---|(key15)---(可以是IOA4 IOB4 IOA12 IOB12)
//          |            |          |          |
//         IOA3(IN)    IOA2(IN)    IOA1(IN)  IOA0(IN)
//		   IOB3        IOB3        IOB1      IOB0
//		   IOA11       IOA10       IOA9      IOA8
//		   IOB11       IOB10       IOB9      IOB8
#include "SPCE061V004.H"
#include    "Hardware.H"
#define  Contrl_Data_Max   4095
#include	"s480.h"
#include	"Hardware.h"
unsigned int KeyVal;
unsigned int KeyScan();
unsigned int cnt;
unsigned int Set_Flag=0;
unsigned int Flag_StepAhead;
unsigned int Flag_StepBack;
unsigned int Flag=1;
unsigned int Flag_Key_Up;
unsigned int Flag_Key_Down;
unsigned int Convert_Value;
unsigned int ENTER_Down;				//确认键按下
unsigned int Count;
unsigned int V_Time=0;					//次数变量
unsigned int Sum=0;
unsigned int Adverage_Convert_Value;	//平均采集值
extern      Voice;
extern		Set_Value;
extern ShowData[5];
extern SampleData[4];
extern	Contrl_Data;
//=============================================================================================================
//BREAK
//=============================================================================================================
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
}

//=============================================================================================================
//FIQ
//=============================================================================================================
void FIQ(void) __attribute__ ((ISR));
void FIQ(void)
{	
	*P_Watchdog_Clear=C_WDTCLR;
	if((*P_INT_Ctrl&C_FIQ_TMA)==0x2000)
	{
		int temp;
		if(Voice==1)
		{
			*P_INT_Clear=C_FIQ_TMA;
			SACM_S480_ServiceLoop();
			*P_Watchdog_Clear=C_WDTCLR;
		}
		else
		{
			KeyVal=KeyScan();
			if(KeyVal==0xFFFF)
				Flag_Key_Up=1;					//没有键按下
			else
				Flag_Key_Down=1;				//有键按下
			switch(KeyVal)
			{
				case	4:		if((Flag_Key_Down==1)&&(Flag_Key_Up==1))		//按下SET键
							{	
									cnt++;
									Flag_Key_Down=0;
									Flag_Key_Up=0;
							}	
								Set_Flag=1;
								if(cnt>4)
								{
									cnt=0;
									
								}
								break;
														
					
				case	0:		if((Flag_Key_Down==1)&&(Flag_Key_Up==1))	
								{
									cnt=0;
									Set_Flag=0;
									Flag_Key_Up=0;
									ENTER_Down=1;							//表示确认键已经按下
								}	
									break;
																			//按下ENTER键
				case	3:		{
									if((Flag_Key_Down==1)&&(Flag_Key_Up==1))
									{
										Flag_StepAhead=1;
										Flag_Key_Up=0;
									}
									break;
								}											//按下步进+键
				case	1:		{
									if((Flag_Key_Down==1)&&(Flag_Key_Up==1))
									{
										Flag_StepBack=1;
										Flag_Key_Up=0;
									}
										
									break;
								}											//按下步进-键
			}
			
			if(Set_Flag==1)
			{
				switch(KeyVal)
				{
					case	15:		temp=9;ShowData[cnt]=temp;break;
					case	14:		temp=8;ShowData[cnt]=temp;break;
					case	13:		temp=7;ShowData[cnt]=temp;break;
					case	11:		temp=6;ShowData[cnt]=temp;break;
					case	10:		temp=5;ShowData[cnt]=temp;break;
					case	9:		temp=4;ShowData[cnt]=temp;break;
					case	7:		temp=3;ShowData[cnt]=temp;break;
					case	6:		temp=2;ShowData[cnt]=temp;break;
					case	5:		temp=1;ShowData[cnt]=temp;break;
					case	2:		temp=0;ShowData[cnt]=temp;break;
				
				}
				Flag=1;
			}
				
			*P_INT_Clear=C_FIQ_TMA;
		}
	}	
	else
		{
			*P_IOB_Data^=0x2000;						//CS拉低
			F_Send_Clock(2);							//送两个脉冲
			Convert_Value=F_Read_Data();
			if(V_Time<15)
			{	
				Sum+=Convert_Value;
				V_Time++;
			}
			else
			{
				Adverage_Convert_Value=Sum/15;	
				Sum=0;
				V_Time=0;
			}	
			*P_IOB_Data^=0x2000;						//CS拉高
			F_Delay(3);
			*P_Watchdog_Clear=C_WDTCLR;					//清狗	
			SampleData[0]=Adverage_Convert_Value/1000;
			SampleData[1]=Adverage_Convert_Value%1000/100;
			SampleData[2]=Adverage_Convert_Value%1000%100/10;
			SampleData[3]=Adverage_Convert_Value%10;
			*P_INT_Clear=C_FIQ_TMB;
		}
		*P_Watchdog_Clear=C_WDTCLR;						//清狗			
}

//=============================================================================================================
//IRQ0
//=============================================================================================================
void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
}

//=============================================================================================================
//IRQ1
//=============================================================================================================
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{

}

//=============================================================================================================
//IRQ2
//=============================================================================================================
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
}

//=============================================================================================================
//IRQ3
//=============================================================================================================
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{	
}

//=============================================================================================================
//IRQ4
//=============================================================================================================
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
	
	*P_Watchdog_Clear=C_WDTCLR;					//清狗	
	Count++;
	if(Count>=15)
	{
		Set_Value=ShowData[1]*1000+ShowData[2]*100+ShowData[3]*10+ShowData[4];
		if(Set_Flag==0)
		{
			if(Set_Value>Adverage_Convert_Value)
			{
				if(Contrl_Data<Contrl_Data_Max)
					Contrl_Data++;
			}
			else
			{
				if(Set_Value<Adverage_Convert_Value)
					if(Contrl_Data>0)
						Contrl_Data--;
			}
		}
		Count=0;	
	}	
	*P_INT_Clear=C_IRQ4_1KHz;
}

//=============================================================================================================
//IRQ5
//=============================================================================================================
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
	
}

//=============================================================================================================
//IRQ6
//=============================================================================================================
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
}

//=============================================================================================================
//IRQ7
//=============================================================================================================
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
}

//=============================================================================================
//函数: Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:按键代码
//=============================================================================================
unsigned int KeyScanTemp=0;
unsigned int KeyScan()
{

		KEYIODATA=KEYIODATA&0xFF0F;							//IOx.7.6.5.4=0
		KeyScanTemp=KEYIODATA;
		KeyScanTemp=KeyScanTemp&0x000F;
		if(KeyScanTemp!=0x000F)								//可能有键按下
		{
			for(KeyScanTemp=0;KeyScanTemp<10;KeyScanTemp++);//延时消抖
			KeyScanTemp=KEYIODATA&0x000F;
			if(KeyScanTemp!=0x000F)							//确认有按键按下
			{
				KEYIODATA=KEYIODATA|0x00F0;					//IOx.6.5.4=1
				KEYIODATA=KEYIODATA&0xFF70;					//IOx.7=0
				KeyScanTemp=KEYIODATA&0x000F;				//GOT IOx.8-IOx11
				switch(KeyScanTemp)
				{
					case 0x0007:	return(KeyNum0);break;	//nub.0 key was pressed
					case 0x000B:	return(KeyNum1);break;	//because the exist of "return()"
															//so "break"is not necessary
					case 0x000D:	return(KeyNum2);break;
					case 0x000E:	return(KeyNum3);break;
					default    :	break;
				}
				KEYIODATA=KEYIODATA|0x00F0;					//IOx.6.5.4=1
				KEYIODATA=KEYIODATA&0xFFBF;					//IOx.6=0
				KeyScanTemp=KEYIODATA&0x000F;
				switch(KeyScanTemp)
				{
					case 0x0007:	return(KeyNum4);break;
					case 0x000B:	return(KeyNum5);break;
					case 0x000D:	return(KeyNum6);break;
					case 0x000E:	return(KeyNum7);break;
					default    :	break;
				}
				KEYIODATA=KEYIODATA|0x00F0;					//IOx.6.5.4=1
				KEYIODATA=KEYIODATA&0xFFDF;					//IOx.5=0
				KeyScanTemp=KEYIODATA&0x000F;
				switch(KeyScanTemp)
				{
					case 0x0007:	return(KeyNum8);break;
					case 0x000B:	return(KeyNum9);break;
					case 0x000D:	return(KeyNum10);break;
					case 0x000E:	return(KeyNum11);break;
					default    :	break;
				}
				KEYIODATA=KEYIODATA|0x00F0;					//IOx.6.5.4=1
				KEYIODATA=KEYIODATA&0xFFEF;					//IOx.4=0
				KeyScanTemp=KEYIODATA&0x000F;
				switch(KeyScanTemp)
				{
					case 0x0007:	return(KeyNum12);break;
					case 0x000B:	return(KeyNum13);break;
					case 0x000D:	return(KeyNum14);break;
					case 0x000E:	return(KeyNum15);break;
					default    :	break;
				}
				return(NoKey);
			}
			else											//假信号
				return(NoKey);
		}
		else												//无键按下
			return(NoKey);

}

//=============================================================================================================
//
//=============================================================================================================
int F_Send_Clock(int x)
{
	int i,j,k;
	i=2*x;
	for(j=0;j<i;j++)
	{
		*P_IOB_Data^=0x1000;
		for(k=0;k<5;k++)
			*P_Watchdog_Clear=C_WDTCLR;
	}		
	
}

//=============================================================================================================
//
//=============================================================================================================
int F_Read_Data()
{
	int temp1,i;
	int temp2=0;
	for(i=0;i<13;i++)
	{
		*P_IOB_Data^=0x1000;						//拉低时钟电平
		temp1=*P_IOB_Data;
		*P_IOB_Data^=0x1000;						//拉高时钟电平
		if((temp1&0x4000)==0x4000)
			temp2|=1;
		temp2=temp2<<1;	
	}
	temp2=temp2>>1;
	temp2&=0x1FFF;

	return(temp2);
}

//=============================================================================================================
//
//=============================================================================================================
int F_Delay(int x)
{
	int i,j;
	i=x;
	for(j=0;j<i;j++)
		*P_Watchdog_Clear=C_WDTCLR;

}

⌨️ 快捷键说明

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