用中断来监测按键,实现LED灯的顺序和逆序闪烁控制stm32

/* 用中断来监测按键,实现LED灯的顺序和逆序闪烁控制
	@程序功能说明: Key1按下,四个LED灯顺序亮,Key2按下,四个LED灯逆序亮@ 
  @LED与端口对应关系:LED1-----PC6; LED2-----PC7@
	@                  LED3-----PC8; LED4-----PC9@
  @按键与端口对应关系:Key1-----PC13;Key2-----PB5@
*/
#include "stm32f10x.h"
char flag=1;//按键标识位:0-按键0;1-按键1
void RCC_Configuration(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
void delay_nms(u16 time);

#define LED1(x)  x ? GPIO_SetBits(GPIOC, GPIO_Pin_6): GPIO_ResetBits(GPIOC, GPIO_Pin_6)
#define LED2(x)  x ? GPIO_SetBits(GPIOC, GPIO_Pin_7): GPIO_ResetBits(GPIOC, GPIO_Pin_7)
#define LED3(x)  x ? GPIO_SetBits(GPIOC, GPIO_Pin_8): GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define LED4(x)  x ? GPIO_SetBits(GPIOC, GPIO_Pin_9): GPIO_ResetBits(GPIOC, GPIO_Pin_9)

int main(void)
{

	RCC_Configuration();//配置时钟
	GPIO_Configuration();//配置GPIO
	EXTI_Configuration();//配置外部中断源
	NVIC_Configuration();//配置向量中断控制器

	while(1)
	{
		if (flag)
		{
			LED1(0);LED2(1);LED3(1);LED4(1);//亮LED1
			delay_nms(1000);
			LED1(1);LED2(0);LED3(1);LED4(1);//亮LED2
			delay_nms(1000);
			LED1(1);LED2(1);LED3(0);LED4(1);//亮LED3
			delay_nms(1000);
			LED1(1);LED2(1);LED3(1);LED4(0);//亮LED4
			delay_nms(1000);
		}
		else{
			LED1(1);LED2(1);LED3(1);LED4(0);//亮LED4
			delay_nms(1000);
			LED1(1);LED2(1);LED3(0);LED4(1);//亮LED3
			delay_nms(1000);
			LED1(1);LED2(0);LED3(1);LED4(1);//亮LED2
			delay_nms(1000);
			LED1(0);LED2(1);LED3(1);LED4(1);//亮LED1
			delay_nms(1000);
		}	
	}
}
void RCC_Configuration(void)//时钟配置子程序
{
	SystemInit(); //72MHz

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO的时钟
}

	void GPIO_Configuration(void)//配置GPIO口
	{	
		GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO初始化结构变量。
		
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //配置管脚6-9
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //IO口配置为推挽输出口
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
		GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC口
		LED1(1);LED2(1);LED3(1);LED4(1);//关闭所有LED灯
		
		
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //配置管脚15
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ; //IO口配置为上拉输入 
		GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PA15口
		//GPIO_SetBits(GPIOB,GPIO_Pin_5);//ODR对应位设置为1,激活上拉配置
		GPIOB->ODR|=1<<5;       //PB5设置为上拉(需要往对应ODR位设置1) 
		
		GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //配置管脚5
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ; //IO口配置为上拉输入 
		GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC5口
		//GPIO_SetBits(GPIOC,GPIO_Pin_13);//ODR对应位设置为1,激活上拉配置
		GPIOC->ODR|=1<<13;      //PC13上拉 (需要往对应ODR位设置1)

	}
	
void EXTI_Configuration(void) //配置外部中断源
{	

	EXTI_InitTypeDef EXTI_InitStructure; //声明外部中断初始化结构体
	EXTI_InitStructure.EXTI_Line=EXTI_Line13|EXTI_Line5; //外部中断线Line15 | Line5
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; // 选择中断模式
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能中断
	EXTI_Init(&EXTI_InitStructure); //初始化外部中断
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13); //PA15配置为外部中断源(本质利用AFIO_EXTICR寄存器)
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5); //PC5配置为外部中断源(本质利用AFIO_EXTICR寄存器)
}
void NVIC_Configuration(void) //嵌套向量中断初始化
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级分组配置分组1:1位抢占优先级、3位子优先级	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; //EXTI9_5中断源
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //占先优先级设定,取值为0-1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //从优先级设计定,取值为0-7
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //EXTI9_5中断源
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //占先优先级设定,取值为0-1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //从优先级设计定,取值为0-7
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

void EXTI9_5_IRQHandler(void) //外部中断源9-5的中断子程序
{
	if (EXTI_GetITStatus(EXTI_Line5)!=RESET)
	{
		flag=1;
		EXTI_ClearFlag(EXTI_Line5);
	}
}
void EXTI15_10_IRQHandler(void) //外部中断源15-10的中断子程序
{
	if (EXTI_GetITStatus(EXTI_Line13)!=RESET)
	{
		flag=0;
		EXTI_ClearFlag(EXTI_Line13);
	}
}


 //@延时子程序@
void delay_nms(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=4000;  //@自己定义@
      while(i--) ;    
   }
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值