srm32f4按键蜂鸣器_STM32 基于库函数控制按键 蜂鸣器 LED显示

这里就涵盖了STM32的IO控制了,按键是输入,蜂鸣器与LED控制是输出。

首先来一张工程的结构图:

a4c26d1e5885305701be709a3d33442f.png

代码解说就不用了吧,IO口这玩意也没有什么好说的。直接上代码:

首先是main.c部分

#include"stm32f10x.h"

#include"key.h"

#include"beep.h"

#include"led.h"

KeyNumber Key_Number=KeyNone;

int main(void)

{

Led_Init(); //LED初始化

Beep_Init(); //蜂鸣器初始化

Key_Init();

#ifdef

Key_Polling //采用查询的方式

//Key_Init(); //按键GPIO初始化

while(1)

{

switch(Get_Key_Number())

{

case Key1:

Led_Spark(Led1,1,LedOn);

Beep_State(1,BeepOn);

break;

case Key2:

Led_Spark(Led2,1,LedOn);

Beep_State(1,BeepOn);

break;

case Key3:

Led_Spark(Led3,1,LedOn);

Beep_State(1,BeepOn);

break;

case Key4:

Led_Spark(Led4,1,LedOn);

Beep_State(1,BeepOn);

break;

default:

LedAll_Off;

Beep_Off;

break;

}

}

#endif

#ifdef

Key_Interrupt //采用中断的方式

//Key_Init(); Key_EXTI();

Key_NVIC();

while(1)

{

#if

0 //这部分现在这里导致按键时好时坏 原因不明

switch(Key_Number)

{

case Key1:

Led_Spark(Led1,1,LedOn);

Beep_State(1,BeepOn);

Key_Number=KeyNone;

break;

case Key2:

Led_Spark(Led2,1,LedOn);

Beep_State(1,BeepOn);

Key_Number=KeyNone;

break;

case Key3:

Led_Spark(Led3,1,LedOn);

Beep_State(1,BeepOn);

Key_Number=KeyNone;

break;

case Key4:

Led_Spark(Led4,1,LedOn);

Beep_State(1,BeepOn);

Key_Number=KeyNone;

break;

default:

LedAll_Off;

Beep_Off;

Key_Number=KeyNone;

break;

}

#endif

}

#endif

}

2.接下载是按键key.c 与key.h

#include"stm32f10x.h"

#include"key.h"

#ifdef Key_Polling

static void Delay(vu32 Time)

{

for(;Time!=0;Time--);

}

void Key_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(Key1_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key1_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;

GPIO_Init(Key1_Port,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(Key2_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key2_Pin;

GPIO_Init(Key2_Port,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(Key3_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key3_Pin;

GPIO_Init(Key3_Port,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(Key4_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key4_Pin;

GPIO_Init(Key4_Port,&GPIO_InitStructure);

}

KeyNumber Get_Key_Number(void)

{

KeyNumber Key_Number;

Key_Number=KeyNone;

if(!GPIO_ReadInputDataBit(Key1_Port,Key1_Pin))

{

Delay(0xffff); //延时防抖

if(!GPIO_ReadInputDataBit(Key1_Port,Key1_Pin))

Key_Number=Key1;

}

if(!GPIO_ReadInputDataBit(Key2_Port,Key2_Pin))

{

Delay(0xffff);

if(!GPIO_ReadInputDataBit(Key2_Port,Key2_Pin))

Key_Number=Key2;

}

if(!GPIO_ReadInputDataBit(Key3_Port,Key3_Pin))

{

Delay(0xffff);

if(!GPIO_ReadInputDataBit(Key3_Port,Key3_Pin))

Key_Number=Key3;

}

if(!GPIO_ReadInputDataBit(Key4_Port,Key4_Pin))

{

Delay(0xffff);

if(!GPIO_ReadInputDataBit(Key4_Port,Key4_Pin))

Key_Number=Key4;

}

return Key_Number;

}

#endif

#ifdef Key_Interrupt

void Key_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(Key1_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key1_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;

GPIO_Init(Key1_Port,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(Key2_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key2_Pin;

GPIO_Init(Key2_Port,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(Key3_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key3_Pin;

GPIO_Init(Key3_Port,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(Key4_RCC,ENABLE);

GPIO_InitStructure.GPIO_Pin =Key4_Pin;

GPIO_Init(Key4_Port,&GPIO_InitStructure);

}

void Key_EXTI(void)

{

EXTI_InitTypeDef EXTI_InitStructure;

GPIO_EXTILineConfig(Key1_EXTI_PortSource,Key1_EXTI_PinSource); //配置GPIO为外部中断事件

EXTI_InitStructure.EXTI_Line =Key1_EXTI_Line; //中断线

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(Key2_EXTI_PortSource,Key2_EXTI_PinSource);

EXTI_InitStructure.EXTI_Line =Key2_EXTI_Line;

EXTI_Init(&EXTI_InitStructure);

GPIO_EXTILineConfig(Key3_EXTI_PortSource,Key3_EXTI_PinSource);

EXTI_InitStructure.EXTI_Line =Key3_EXTI_Line;

EXTI_Init(&EXTI_InitStructure);

GPIO_EXTILineConfig(Key4_EXTI_PortSource,Key4_EXTI_PinSource);

EXTI_InitStructure.EXTI_Line =Key4_EXTI_Line;

EXTI_Init(&EXTI_InitStructure);

}

void Key_NVIC(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000); //NVIC起始地址在FLASH非外部SRAM

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //优先级分组方式

NVIC_InitStructure.NVIC_IRQChannel =Key1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel =Key2_IRQn;

//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel =Key3_IRQn;

//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel =Key4_IRQn;

//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;

NVIC_Init(&NVIC_InitStructure);

}

#endif

#ifndef _KEY_H

#define _KEY_H

#include"stm32f10x.h"

#define Key_Interrupt

#define

Key1_RCC RCC_APB2Periph_GPIOA

#define

Key1_Port GPIOA

#define

Key1_Pin GPIO_Pin_0

#define Key1_EXTI_Line EXTI_Line0

#define Key1_EXTI_PortSource GPIO_PortSourceGPIOA

#define Key1_EXTI_PinSource GPIO_PinSource0

#define

Key1_IRQn EXTI0_IRQn

#define

Key2_RCC RCC_APB2Periph_GPIOC

#define

Key2_Port GPIOC

#define

Key2_Pin GPIO_Pin_13

#define Key2_EXTI_Line EXTI_Line13

#define Key2_EXTI_PortSource GPIO_PortSourceGPIOC

#define Key2_EXTI_PinSource GPIO_PinSource13

#define

Key2_IRQn EXTI15_10_IRQn

#define

Key3_RCC RCC_APB2Periph_GPIOA

#define

Key3_Port GPIOA

#define

Key3_Pin GPIO_Pin_1

#define Key3_EXTI_Line EXTI_Line1

#define Key3_EXTI_PortSource GPIO_PortSourceGPIOA

#define Key3_EXTI_PinSource GPIO_PinSource1

#define

Key3_IRQn EXTI1_IRQn

#define

Key4_RCC RCC_APB2Periph_GPIOC

#define

Key4_Port GPIOC

#define

Key4_Pin GPIO_Pin_3

#define Key4_EXTI_Line EXTI_Line3

#define Key4_EXTI_PortSource GPIO_PortSourceGPIOC

#define Key4_EXTI_PinSource GPIO_PinSource3

#define

Key4_IRQn EXTI3_IRQn

typedef

enum{KeyNone=0,Key1=1,Key2=2,Key3=3,Key4=4}KeyNumber;

#ifdef Key_Polling

void Key_Init(void);

KeyNumber Get_Key_Number(void);

#endif

#ifdef Key_Interrupt

void Key_Init(void);

void Key_EXTI(void);

void Key_NVIC(void);

#endif

#endif

3.上led.c与led.h代码

#include"stm32f10x.h"

#include"led.h"

static void Delay(vu32 Time)

{

for(;Time!=0;Time--);

}

void Led_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(Led1_RCC,ENABLE); //all led use GPIOF

#ifdef

Degub //在led.h中定义

GPIO_DeInit(Led1_Port); //GPIO外设设置为缺省值

GPIO_StructInit(&GPIO_InitStructure); //将GPIO_InitStructure按缺省值填入

GPIO_PinLockConfig(Led1_Port,Led1_Pin); //锁定LED1使用的IO引脚

#endif

#if 1

GPIO_InitStructure.GPIO_Pin =Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(Led1_Port,&GPIO_InitStructure); //all led use GPIOF

LedAll_On;

Delay(0x6fffff);

LedAll_Off;

#endif

#if 0

GPIO_InitStructure.GPIO_Pin =Led1_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(Led1_Port,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =Led2_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(Led2_Port,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =Led3_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(Led3_Port,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =Led4_Pin;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_Init(Led4_Port,&GPIO_InitStructure);

LedAll_On;

Delay(0x6fffff);

LedAll_Off;

#endif

}

void Led_Spark(LedOrder Led_Order,u8 TurnOn_Time,LedState

Led_State)

{

u8 i;

switch(Led_Order)

{

case

LedAll: //选中所有LED

if(Led_State==LedOn) //点亮

{

for(i=0;i

{

LedAll_On;

Delay(0x5fffff);

LedAll_Off;

}

}

else

if(Led_State==LedOff) //熄灭

{

LedAll_Off;

}

break;

case

Led1: //选中LED1

if(Led_State==LedOn) //点亮

{

for(i=0;i

{

Led1_On;

Delay(0x5fffff);

Led1_Off;

}

}

else

if(Led_State==LedOff) //熄灭

{

Led1_Off;

}

break;

case

Led2: //选中LED2

if(Led_State==LedOn) //点亮

{

for(i=0;i

{

Led2_On;

Delay(0x5fffff);

Led2_Off;

}

}

else

if(Led_State==LedOff) //熄灭

{

Led2_Off;

}

break;

case

Led3: //选中LED3

if(Led_State==LedOn) //点亮

{

for(i=0;i

{

Led3_On;

Delay(0x5fffff);

Led3_Off;

}

}

else

if(Led_State==LedOff) //熄灭

{

Led3_Off;

}

break;

case

Led4: //选中LED4

你可能感兴趣的:(srm32f4按键蜂鸣器)