软件: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();
}
}