1. 程式人生 > >中斷控制LED燈亮滅

中斷控制LED燈亮滅

中斷小結:(用獨立鍵盤控制LED的亮滅)


#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
unsigned char _it0=0,num=0;
void RCC_Configuration(void); //時鐘使能
void RCC_Configuration(void)
{
	SystemInit();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);
}
void NVIC_Configuration(void);//nVIc使能
void NVIC_Configuration(void)
{
	 NVIC_InitTypeDef NVIC_InitStructure;
     EXTI_InitTypeDef EXTI_InitStructure; 
	 
	 NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1);
	 NVIC_InitStructure.NVIC_IRQChannel =EXTI9_5_IRQn;
	 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =	0;
	 NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;
	 NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
	 NVIC_Init(&NVIC_InitStructure);

	   NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;				 //外部中斷2
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	     //搶佔優先順序 0
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;			 //子優先順序2  
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 //使能
       NVIC_Init(&NVIC_InitStructure);

      NVIC_InitStructure.NVIC_IRQChannel =EXTI3_IRQn;				 //外部中斷9-5
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	     //搶佔優先順序 0
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			 //子優先順序1  
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 //使能
      NVIC_Init(&NVIC_InitStructure);



	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
		GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);
		  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);


	EXTI_InitStructure.EXTI_Line =EXTI_Line5|EXTI_Line2|EXTI_Line3;
	EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd =ENABLE;
	EXTI_Init(&EXTI_InitStructure);		 

}
void GPIO_Configuration(void)
{
	   GPIO_InitTypeDef GPIO_InitStructure;
	   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 
	   GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
	   GPIO_Init(GPIOB,&GPIO_InitStructure);


	   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;
	   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//	   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHZ;
	   GPIO_Init(GPIOD,&GPIO_InitStructure);
   	      


	   GPIO_SetBits(GPIOB,GPIO_Pin_5);
	   GPIO_SetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_3);

       
		GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2|GPIO_Pin_5|GPIO_Pin_3;
		GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;
		GPIO_Init(GPIOC,&GPIO_InitStructure);

	 
}
void Delay(__IO uint32_t nCount)
{
    for(; nCount != 0; nCount--);
}

void numm(void){
   num=0;
   if(_it0==1){			 									  //按鍵按下標誌 
   	 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0){		  //K1  
	  	Delay(0x3ffff);										  
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0){		  //按鍵消抖動
			while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0);//是否鬆開按鍵	 
			num=1; 			        						  //鍵值1  為K1按下
			
		}
	  }		  
   }
   else if(_it0==2){			 							  //按鍵按下標誌 
   	 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0){		  //K2  
	  	Delay(0x3ffff);										  
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0){		  //按鍵消抖動
			while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0);//是否鬆開按鍵	 
			num=2; 											  //鍵值2  為K2按下
		
		}
	  }		  
   }
   else if(_it0==3){			 							  //按鍵按下標誌 
   	 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0){		  //K3  
	  	Delay(0x3ffff);										  
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0){		  //按鍵消抖動
			while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0);//是否鬆開按鍵	 
			num=3; 											  //鍵值3  為K3按下
		
		}
	  }		  
   }
  
   _it0=0; 
}
int main(void)
{  
  unsigned char a=0,b=0,c=0;

  RCC_Configuration();      //系統時鐘設定及外設時鐘使能  

  NVIC_Configuration();

  /*對控制3個LED指示燈的IO口進行了初始化,將3個埠配置為推輓上拉輸出,口線速度為50Mhz。
  
  
  
  將中斷線PC5,PC2,PC3配置為輸入模式。(後面數字不能相同,相同的在一箇中斷單元中)



  在配置某個口線時,首先應對它所在的埠的時鐘進行使能。否則無法配置成功,由於用到了埠B和埠D,C,E,
  因此要對這4個埠的時鐘進行使能,同時由於用到複用IO口功能用於配置外部中斷。因此還要使能AFIO(複用功能IO)時鐘。*/
  GPIO_Configuration();
  while (1)
  {	   
  	numm();																   //鍵盤掃描程式
	if(num==1&&a==0){GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=1;}		       //K1 按下作處理
	else if(num==1&&a==1){GPIO_SetBits(GPIOB, GPIO_Pin_5);a=0;}

	if(num==2&&b==0){GPIO_ResetBits(GPIOD, GPIO_Pin_6);b=1;}			   //K2 按下作處理
	else if(num==2&&b==1){GPIO_SetBits(GPIOD, GPIO_Pin_6);b=0;}

	if(num==3&&c==0){GPIO_ResetBits(GPIOD, GPIO_Pin_3);c=1;}			   //K3 按下作處理
	else if(num==3&&c==1){GPIO_SetBits(GPIOD, GPIO_Pin_3);c=0;}
	
  }
}

在stm32f10x_it.c標頭檔案中寫入:
/****************************************************************************
* 名    稱:void EXTI9_5_IRQHandler(void)
* 功    能:EXTI9-5中斷處理程式
* 入口引數:無
* 出口引數:無
* 說    明:
* 呼叫方法:無 
****************************************************************************/
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line5) != RESET)				  //判別是否有鍵按下
  {
	_it0=1;	    										  //按鍵中斷標誌
    EXTI_ClearITPendingBit(EXTI_Line5);					  //清除中斷請求標誌
  }
}


/****************************************************************************
* 名    稱:void EXTI2_IRQHandler(void)
* 功    能:EXTI2中斷處理程式
* 入口引數:無
* 出口引數:無
* 說    明:
* 呼叫方法:無 
****************************************************************************/
void EXTI2_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line2) != RESET)				  //判別是否有鍵按下
  {
	_it0=2;	    										  //按鍵中斷標誌
    EXTI_ClearITPendingBit(EXTI_Line2);					  //清除中斷請求標誌
  }
}

/****************************************************************************
* 名    稱:void EXTI3_IRQHandler(void)
* 功    能:EXTI3中斷處理程式
* 入口引數:無
* 出口引數:無
* 說    明:
* 呼叫方法:無 
****************************************************************************/
void EXTI3_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line3) != RESET)				  //判別是否有鍵按下
  {
	_it0=3;	    										  //按鍵中斷標誌
    EXTI_ClearITPendingBit(EXTI_Line3);					   //清除中斷請求標誌
  }
}

以及加上:
extern unsigned char _it0;