嵌入式STM32:按键控制LED(中断控制)

软件:keil5

exit中断函数

key按键控制

KEY1按键一

KEY2按键二

exit.c

#include "exit.h"
#include "delay.h"
#include "key.h"
#include "stm32f10x_exti.h"
void exit_config(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line13;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
	static u8 k0=0,k1=0;
	Delay(20);
	if(KEY0==0)
	{
		if(k0==0)
		GPIO_SetBits(GPIOB,GPIO_Pin_0);
		else 
			GPIO_ResetBits(GPIOB,GPIO_Pin_1);
		k0=!k0;
	}
	else if(KEY1==0)
	{
		if(k1==0)
		GPIO_SetBits(GPIOB,GPIO_Pin_1);
		else 
			GPIO_ResetBits(GPIOB,GPIO_Pin_0);
		k1=!k1;
	}
	while(KEY0!=1||KEY1!=1);
	EXTI_ClearITPendingBit(EXTI_Line12);
	EXTI_ClearITPendingBit(EXTI_Line13);
	EXTI_ClearITPendingBit(EXTI_Line14);
	EXTI_ClearITPendingBit(EXTI_Line15);
	
}

exit.h

#ifndef _EXIT_H
#define _EXIT_H
#include "stm32f10x.h"
void exit_config(void);
	

#endif

delay.c

#include  "delay.h"

void Delay(unsigned int count)
{
	unsigned int i;
	for(;count!=0;count--)
	{
		i=5000;
		while(i--);
	}
}

delay.h

#ifndef _DELAY_H
#define _DELAY_H

#include "stm32f10x.h"

void Delay(unsigned int count);
	

#endif

key.c

#include "stm32f10x.h"
#include "key.h"
#include "delay.h"
void KEY(void)
{
  	 GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);	
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}
unsigned char KEY_S(void)
{
 static unsigned char key_up=1;
 if(key_up&&(KEY0==1||KEY1==1))
 {
  Delay(20);
  key_up=1;
  if(KEY0==1)
  {return 0;}
  else if(KEY1==1)
  {return 1;}
 }
 else if(KEY0==0&&KEY1==0)
 key_up=0;
 return 0;
}

key.h

#ifndef _KEY_H
#define _KEY_H
#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)
void KEY(void);
unsigned char KEY_S(void);
#endif

led.c

#include "led.h"

void LED(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);
}

led.h

#ifndef _LED_H
#define _LED_H

#include "stm32f10x.h"
void LED(void);
	

#endif

main.c

#include "stm32f10x.h"
#include "exit.h"
#include "delay.h"
#include "key.h"
#include "led.h"
int main(void)
{
  while(1)
 {
   LED();
	 KEY();
	 exit_config();
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值