系列文章目录
STM32F103ZE:正点原子精英板,调用库编写独立按键,控制蜂鸣器和LED。
文章目录
前言
先调用库编写独立按键的控制程序,然后通过提前封装好的位库进行位操作,对蜂鸣器和LED进行编写。
一、对key.c进行编写
看原理图
可以发现,按键KEY_UP在PA0引脚、KEY0在PE4、KEY1在PE3;
1.先进行key.h头文件的创建
程序如下所示
#ifndef __key_H
#define __key_H
#include "sys.h"
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0_PRESS 1
#define KEY1_PRESS 2
#define KEYUP_PRESS 3
void KEY_Init(void);
u8 KEY_Scan(u8);//扫描函数
#endif
2.key.c程序讲解
点开提前封装好的库,找到gpio.c文件
GPIO初始化和RCC使能函数就在gpio.h和rcc.h里,双击打开它俩
找到要使用的函数
GPIO初始化函数
RCC->APB2使能函数
KEY_Init初始化函数程序
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能GPIOA、GPIOE
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4;//端口3、4
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉模式
GPIO_Init(GPIOE,&GPIO_InitStruct);//GPIOE初始化
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;//下拉模式
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
可以看到,用到的函数就这俩个,其余都是在这基础上选择“配置”,看传参是什么,就怎么配置就行。
KEY_Scan()按键扫描函数
key_up是静态参数,保持key_up++,mode是形参,它用来决定按键的模式,是连续按键,还是只一按键(仅按一次有效);且mode为0连续,mode为1只一
u8 KEY_Scan(u8 mode)//按键扫描函数
{
static u8 key_up=1;
if(mode)key_up=1;//连续按键
if(key_up&&(KEY0==0||KEY1==0||KEY_UP==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return KEY0_PRESS;
else if(KEY1==0)return KEY1_PRESS;
else if(KEY_UP==1)return KEYUP_PRESS;
}
else if(KEY0==1&&KEY1==1&&KEY_UP==0)key_up=1;
return 0;
}
二、对main.c进行程序编写
1.LED、BEEP定义头文件
LED.h
代码如下(所示):
#ifndef __led_H
#define __led_H
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
void LED_Init(void);
#endif
BEEP.h
代码如下(所示):
#ifndef __BEEP_H
#define __BEEP_H
#include "sys.h"
#define BEEP PBout(8) // BEEP,蜂鸣器接口
void BEEP_Init(void); //初始化
#endif
2.main.c
代码如下(所示):
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
int main(void)
{
u8 key=0;
delay_init();
LED_Init();
BEEP_Init();
KEY_Init();
LED0=0;
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case KEYUP_PRESS:BEEP=!BEEP;break;
case KEY1_PRESS:LED1=!LED1;break;
case KEY0_PRESS:LED0=!LED0;LED1=!LED1;break;
}
}else delay_ms(10);
}
}
三、宏定义调用库法
1.key.h头文件
代码如下,所示
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
// 引脚定义
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY1_GPIO_PORT GPIOE
#define KEY1_GPIO_PIN GPIO_Pin_3
#define KEY0_GPIO_CLK RCC_APB2Periph_GPIOE
#define KEY0_GPIO_PORT GPIOE
#define KEY0_GPIO_PIN GPIO_Pin_4
#define KEY_UP_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY_UP_GPIO_PORT GPIOA
#define KEY__UP_GPIO_PIN GPIO_Pin_0
#define KEY_ON 1
#define KEY_OFF 0
void Key_GPIO_Init(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
#endif
2.key.c编程
代码如下,所示
#include "stm32f10x.h"
#include "key.h"
void Key_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键端口的时钟*/
RCC_APB2PeriphClockCmd(KEY0_GPIO_CLK|KEY1_GPIO_CLK|KEY_UP_GPIO_CLK,ENABLE);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY0_GPIO_PIN;
// 设置按键的引脚为上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//使用结构体初始化按键
GPIO_Init(KEY0_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
//设置按键的引脚为上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//使用结构体初始化按键
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY__UP_GPIO_PIN;
//设置按键的引脚为下拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
//使用结构体初始化按键
GPIO_Init(KEY_UP_GPIO_PORT, &GPIO_InitStructure);
}
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{
/*等待按键释放 */
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
3.main.c编程
代码如下,所示
#include "led.h"
#include "key.h"
int main(void)
{
/* LED端口初始化 */
LED_Init();
LED0=0;
/* 按键端口初始化 */
Key_GPIO_Init();
/* 轮流按键状态,若按键按下则反转LED */
/*轮流按下KEY0、KEY1*/
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
{
/*LED1反转*/
LED1=!LED1;
}
if( Key_Scan(KEY0_GPIO_PORT,KEY0_GPIO_PIN) == KEY_ON )
{
/*LED0反转*/
LED0=!LED0;
}
}
}
四、实验现象
按KEY_UP蜂鸣器开启,再按就关闭,KEY1控制LED1(绿灯)的翻转状态,KEY0控制LED1和LED0的翻转状态。
玩转按键控制蜂鸣器和LED