中断控制LED灯亮灭

Posted xiaoleiacm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断控制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;





以上是关于中断控制LED灯亮灭的主要内容,如果未能解决你的问题,请参考以下文章

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭

ESP8266入门教程-ESP8266按键控制Led灯亮灭

怎样用单片机io口控制大功率led灯亮灭,用1117芯片

CC2530学习路线-基础实验-GPIO 控制LED灯亮灭

stm32用按键控制led灯亮灭时为什么只是变暗了